@Override public void meet(Projection projectionNode) throws Exception { projectionNode.visitChildren(this); if (projectionNode.getArg() instanceof AggregationPipelineQueryNode && projectionNode.getParentNode() != null) { AggregationPipelineQueryNode pipelineNode = (AggregationPipelineQueryNode) projectionNode.getArg(); if (pipelineNode.project(Arrays.asList(projectionNode.getProjectionElemList()))) { projectionNode.replaceWith(pipelineNode); } } }
@Override public void meet(Projection node) throws RuntimeException { super.meet(node); if (node.getArg() instanceof SelectQuery) { SelectQuery query = (SelectQuery)node.getArg(); Map<String, String> bindingVars = new HashMap<String, String>(); List<SelectProjection> selection = new ArrayList<SelectProjection>(); ProjectionElemList list = node.getProjectionElemList(); for (ProjectionElem e : list.getElements()) { String source = e.getSourceName(); String target = e.getTargetName(); bindingVars.put(target, source); SelectProjection s = query.getSelectProjection(source); if (s != null) { selection.add(s); } } query.setBindingVars(bindingVars); query.setSqlSelectVar(selection); node.replaceWith(query); } }
@Override public void meet(Order node) { for (OrderElem e : node.getElements()) { e.visit(this); } if (variablesProjected) { QueryModelNode parent = node.getParentNode(); if (projection == parent) { node.replaceWith(node.getArg().clone()); node.setArg(projection.clone()); Order replacement = node.clone(); projection.replaceWith(replacement); QueryModelNode distinct = replacement.getParentNode(); if (distinct instanceof Distinct) { distinct.replaceWith(new Reduced(replacement.clone())); } } } }