switch(op) {
case UNION : ret = first.or(rest); break;
case INTERSECTION : ret = first.and(rest); break;
case OVERRIDE : ret = first.override(rest); break;
case PRODUCT : ret = first.cross(rest); break;
default :
throw new IllegalArgumentException("Unknown associative operator: " + op);
}
return cache(expr, ret);