public static boolean isGroupedOnlyByVar(Query query, Var groupVar) { boolean result = false; boolean hasOneGroup = query.getGroupBy().size() == 1; if(hasOneGroup) { Expr expr = query.getGroupBy().getExprs().values().iterator().next(); if(expr instanceof ExprVar) { Var v = expr.asVar(); result = v.equals(groupVar); } } return result; }
private VarExprList processAssignments(OpExtendAssign opAssign) { VarExprList orig = opAssign.getVarExprList(); if (!orig.contains(this.var)) return null; if (!orig.getExpr(this.var).equals(this.expr)) return null; VarExprList modified = new VarExprList(); for (Var v : orig.getVars()) { if (!v.equals(this.var)) { modified.add(v, orig.getExpr(v)); } } if (modified.size() > 0 && modified.size() == orig.size()) return null; return modified; }
@Override public Op transform(OpAssign opAssign, Op subOp) { VarExprList assignments = processAssignments(opAssign); if (assignments == null) return super.transform(opAssign, subOp); // Rewrite appropriately if (this.topmostOnly) { // If topmost only ignore any transformations lower down the tree // hence call getSubOp() rather than using the provided subOp if (assignments.size() > 0) { return OpAssign.assign(opAssign.getSubOp(), assignments); } else { return opAssign.getSubOp(); } } else { // Otherwise preserve any transformations from lower down the tree if (assignments.size() > 0) { return OpAssign.assign(subOp, assignments); } else { return subOp; } } }
@Override public Op transform(OpExtend opExtend, Op subOp) { VarExprList assignments = processAssignments(opExtend); if (assignments == null) return super.transform(opExtend, subOp); this.aboveExtend = true; // Rewrite appropriately if (this.topmostOnly) { // If topmost only ignore any transformations lower down the tree // hence call getSubOp() rather than using the provided subOp if (assignments.size() > 0) { return OpExtend.create(opExtend.getSubOp(), assignments); } else { return opExtend.getSubOp(); } } else { // Otherwise preserve any transformations from lower down the tree if (assignments.size() > 0) { return OpExtend.create(subOp, assignments); } else { return subOp; } } }
private VarExprList processUnused(VarExprList assignments) { if (Collections.disjoint(assignments.getVars(), this.tracker.getAssignments().keySet())) return null; VarExprList singleUse = new VarExprList(); for (Var var : assignments.getVars()) { if (this.tracker.getUsageCount(var) == 1) singleUse.add(var, assignments.getExpr(var)); } // If nothing is single use if (singleUse.size() == 0) return null; return singleUse; }
if (newAssignments.size() > 0) { return OpExtend.create(subOp, newAssignments); } else {
if ( projectVars.size() == 0 && query.isSelectType() ) Log.warn(this,"No project variables") ;