Search in sources :

Example 1 with AttributeComparison

use of org.teiid.query.sql.lang.DependentSetCriteria.AttributeComparison in project teiid by teiid.

the class RulePushSelectCriteria method splitSet.

private boolean splitSet(PlanNode critNode, DependentNodeTest test, DependentSetCriteria dscOrig, PlanNode destination) throws QueryMetadataException, TeiidComponentException, QueryPlannerException {
    boolean result = false;
    List<DependentSetCriteria> dscList = splitDependentSetCriteria(dscOrig, false, null);
    List<DependentSetCriteria.AttributeComparison> pushable = new ArrayList<AttributeComparison>();
    List<DependentSetCriteria.AttributeComparison> nonPushable = new ArrayList<AttributeComparison>();
    for (DependentSetCriteria dsc : dscList) {
        PlanNode copyNode = copyNode(critNode);
        setCriteria(dsc, copyNode);
        if (test.isValid(copyNode)) {
            pushable.add(dsc.getAttributes().get(0));
        } else {
            nonPushable.add(dsc.getAttributes().get(0));
        }
    }
    if (!pushable.isEmpty()) {
        // signal that we should run again
        result = true;
        if (nonPushable.isEmpty()) {
            // $NON-NLS-1$
            throw new AssertionError("should not be completely pushed");
        }
        setCriteria(RuleChooseDependent.createDependentSetCriteria(dscOrig.getContextSymbol(), nonPushable), critNode);
        PlanNode copyNode = copyNode(critNode);
        setCriteria(RuleChooseDependent.createDependentSetCriteria(dscOrig.getContextSymbol(), pushable), copyNode);
        // it should be pushed in the next run
        destination.addAsParent(copyNode);
    }
    return result;
}
Also used : DependentSetCriteria(org.teiid.query.sql.lang.DependentSetCriteria) PlanNode(org.teiid.query.optimizer.relational.plantree.PlanNode) AttributeComparison(org.teiid.query.sql.lang.DependentSetCriteria.AttributeComparison)

Example 2 with AttributeComparison

use of org.teiid.query.sql.lang.DependentSetCriteria.AttributeComparison in project teiid by teiid.

the class RuleChooseDependent method createDependentSetCriteria.

static DependentSetCriteria createDependentSetCriteria(String id, List<DependentSetCriteria.AttributeComparison> expressions) {
    if (expressions.isEmpty()) {
        return null;
    }
    Expression indEx = null;
    Expression depEx = null;
    float maxNdv = NewCalculateCostUtil.UNKNOWN_VALUE;
    float ndv = NewCalculateCostUtil.UNKNOWN_VALUE;
    if (expressions.size() == 1) {
        AttributeComparison attributeComparison = expressions.get(0);
        indEx = attributeComparison.ind;
        depEx = attributeComparison.dep;
        maxNdv = attributeComparison.maxNdv;
        ndv = attributeComparison.ndv;
    } else {
        List<Expression> indExprs = new ArrayList<Expression>(expressions.size());
        List<Expression> depExprs = new ArrayList<Expression>(expressions.size());
        boolean unknown = false;
        for (DependentSetCriteria.AttributeComparison comp : expressions) {
            indExprs.add(comp.ind);
            depExprs.add(comp.dep);
            if (comp.ndv == NewCalculateCostUtil.UNKNOWN_VALUE) {
                ndv = NewCalculateCostUtil.UNKNOWN_VALUE;
                maxNdv = NewCalculateCostUtil.UNKNOWN_VALUE;
                unknown = true;
            } else if (!unknown) {
                ndv = Math.max(ndv, comp.ndv);
                maxNdv = Math.max(maxNdv, comp.maxNdv);
            }
        }
        // TODO: detect a base type
        indEx = new Array(DefaultDataClasses.OBJECT, indExprs);
        depEx = new Array(DefaultDataClasses.OBJECT, depExprs);
    }
    DependentSetCriteria crit = new DependentSetCriteria(depEx, id);
    crit.setValueExpression(indEx);
    crit.setAttributes(expressions);
    crit.setMaxNdv(maxNdv);
    crit.setNdv(ndv);
    return crit;
}
Also used : DependentSetCriteria(org.teiid.query.sql.lang.DependentSetCriteria) Array(org.teiid.query.sql.symbol.Array) AttributeComparison(org.teiid.query.sql.lang.DependentSetCriteria.AttributeComparison) Expression(org.teiid.query.sql.symbol.Expression) ArrayList(java.util.ArrayList) AttributeComparison(org.teiid.query.sql.lang.DependentSetCriteria.AttributeComparison)

Example 3 with AttributeComparison

use of org.teiid.query.sql.lang.DependentSetCriteria.AttributeComparison in project teiid by teiid.

the class RulePlanProcedures method findInputNodes.

private void findInputNodes(final HashSet<ElementSymbol> inputs, PlanNode critNode, final List<Criteria> conjuncts, final Set<ElementSymbol> params) {
    while (critNode.getType() == NodeConstants.Types.SELECT) {
        final PlanNode currentNode = critNode;
        final Criteria crit = (Criteria) currentNode.getProperty(NodeConstants.Info.SELECT_CRITERIA);
        critNode = currentNode.getParent();
        if (!currentNode.getGroups().isEmpty()) {
            continue;
        }
        LanguageVisitor visitor = new LanguageVisitor() {

            public void visit(CompareCriteria compCrit) {
                if (compCrit.getOperator() == CompareCriteria.EQ && checkForInput(compCrit.getLeftExpression()) && !checkForAnyInput(compCrit.getRightExpression())) {
                    addInputNode((Reference) compCrit.getLeftExpression());
                }
            }

            private void addInputNode(Reference param) {
                params.add(param.getExpression());
                conjuncts.add(crit);
                NodeEditor.removeChildNode(currentNode.getParent(), currentNode);
            }

            public void visit(IsNullCriteria isNull) {
                if (!isNull.isNegated() && checkForInput(isNull.getExpression())) {
                    addInputNode((Reference) isNull.getExpression());
                }
            }

            public void visit(SetCriteria obj) {
                if (!obj.isNegated() && checkForInput(obj.getExpression()) && !checkForAnyInput(obj.getValues())) {
                    addInputNode((Reference) obj.getExpression());
                }
            }

            public void visit(DependentSetCriteria obj) {
                if (obj.isNegated()) {
                    // just a sanity check
                    return;
                }
                if (obj.hasMultipleAttributes()) {
                    for (AttributeComparison comp : obj.getAttributes()) {
                        if (!checkForInput(comp.dep)) {
                            return;
                        }
                    }
                    for (AttributeComparison comp : obj.getAttributes()) {
                        params.add(((Reference) comp.dep).getExpression());
                    }
                    conjuncts.add(crit);
                    NodeEditor.removeChildNode(currentNode.getParent(), currentNode);
                } else if (checkForInput(obj.getExpression())) {
                    addInputNode((Reference) obj.getExpression());
                }
            }

            boolean checkForInput(Expression expr) {
                if (!(expr instanceof Reference)) {
                    return false;
                }
                // if the expr is a function containing a reference should give a warning
                Reference ref = (Reference) expr;
                return inputs.contains(ref.getExpression());
            }

            boolean checkForAnyInput(LanguageObject expr) {
                for (Reference ref : ReferenceCollectorVisitor.getReferences(expr)) {
                    if (checkForInput(ref)) {
                        return true;
                    }
                }
                return false;
            }

            boolean checkForAnyInput(Collection<Expression> expressions) {
                for (Expression expr : expressions) {
                    if (checkForAnyInput(expr)) {
                        return true;
                    }
                }
                return false;
            }
        };
        for (Criteria conjunct : Criteria.separateCriteriaByAnd(crit)) {
            conjunct.acceptVisitor(visitor);
        }
    }
}
Also used : LanguageVisitor(org.teiid.query.sql.LanguageVisitor) DependentSetCriteria(org.teiid.query.sql.lang.DependentSetCriteria) PlanNode(org.teiid.query.optimizer.relational.plantree.PlanNode) Expression(org.teiid.query.sql.symbol.Expression) Reference(org.teiid.query.sql.symbol.Reference) DependentSetCriteria(org.teiid.query.sql.lang.DependentSetCriteria) SetCriteria(org.teiid.query.sql.lang.SetCriteria) Collection(java.util.Collection) DependentSetCriteria(org.teiid.query.sql.lang.DependentSetCriteria) IsNullCriteria(org.teiid.query.sql.lang.IsNullCriteria) Criteria(org.teiid.query.sql.lang.Criteria) CompareCriteria(org.teiid.query.sql.lang.CompareCriteria) SetCriteria(org.teiid.query.sql.lang.SetCriteria) CompareCriteria(org.teiid.query.sql.lang.CompareCriteria) AttributeComparison(org.teiid.query.sql.lang.DependentSetCriteria.AttributeComparison) LanguageObject(org.teiid.query.sql.LanguageObject) IsNullCriteria(org.teiid.query.sql.lang.IsNullCriteria)

Example 4 with AttributeComparison

use of org.teiid.query.sql.lang.DependentSetCriteria.AttributeComparison in project teiid by teiid.

the class RulePushSelectCriteria method splitDependentSetCriteria.

private List<DependentSetCriteria> splitDependentSetCriteria(DependentSetCriteria dsc, boolean supportsArray, QueryMetadataInterface metadata) throws QueryMetadataException, TeiidComponentException {
    List<AttributeComparison> attributes = dsc.getAttributes();
    List<DependentSetCriteria> crits = new ArrayList<DependentSetCriteria>(attributes.size());
    Map<Object, List<AttributeComparison>> splits = new LinkedHashMap<Object, List<AttributeComparison>>();
    for (int i = 0; i < attributes.size(); i++) {
        Object key = null;
        DependentSetCriteria.AttributeComparison comp = attributes.get(i);
        if (supportsArray && (comp.dep instanceof ElementSymbol)) {
            ElementSymbol es = (ElementSymbol) comp.dep;
            GroupSymbol group = es.getGroupSymbol();
            if (!metadata.isVirtualGroup(group.getMetadataID())) {
                key = group;
            }
        // TODO: we could try to determine further if this is allowable
        // for now since we are pushing as far as we can, this is a good indication,
        // that it will need split
        }
        if (key == null) {
            key = splits.size();
        }
        List<AttributeComparison> comps = splits.get(key);
        if (comps == null) {
            comps = new ArrayList<DependentSetCriteria.AttributeComparison>(2);
            splits.put(key, comps);
        }
        comps.add(comp);
    }
    for (List<AttributeComparison> comps : splits.values()) {
        DependentSetCriteria crit = RuleChooseDependent.createDependentSetCriteria(dsc.getContextSymbol(), comps);
        crit.setMakeDepOptions(dsc.getMakeDepOptions());
        crits.add(crit);
    }
    return crits;
}
Also used : ElementSymbol(org.teiid.query.sql.symbol.ElementSymbol) AttributeComparison(org.teiid.query.sql.lang.DependentSetCriteria.AttributeComparison) AttributeComparison(org.teiid.query.sql.lang.DependentSetCriteria.AttributeComparison) DependentSetCriteria(org.teiid.query.sql.lang.DependentSetCriteria) GroupSymbol(org.teiid.query.sql.symbol.GroupSymbol) LanguageObject(org.teiid.query.sql.LanguageObject)

Aggregations

DependentSetCriteria (org.teiid.query.sql.lang.DependentSetCriteria)4 AttributeComparison (org.teiid.query.sql.lang.DependentSetCriteria.AttributeComparison)4 PlanNode (org.teiid.query.optimizer.relational.plantree.PlanNode)2 LanguageObject (org.teiid.query.sql.LanguageObject)2 Expression (org.teiid.query.sql.symbol.Expression)2 ArrayList (java.util.ArrayList)1 Collection (java.util.Collection)1 LanguageVisitor (org.teiid.query.sql.LanguageVisitor)1 CompareCriteria (org.teiid.query.sql.lang.CompareCriteria)1 Criteria (org.teiid.query.sql.lang.Criteria)1 IsNullCriteria (org.teiid.query.sql.lang.IsNullCriteria)1 SetCriteria (org.teiid.query.sql.lang.SetCriteria)1 Array (org.teiid.query.sql.symbol.Array)1 ElementSymbol (org.teiid.query.sql.symbol.ElementSymbol)1 GroupSymbol (org.teiid.query.sql.symbol.GroupSymbol)1 Reference (org.teiid.query.sql.symbol.Reference)1