/** * Deep copy of object. The values Iterator of this object * will not be cloned - it will be null in the new object * (see #setValueIterator setValueIterator}). * @return Deep copy of object * @see java.lang.Object#clone() */ public Object clone() { Expression leftCopy = null; if(getLeftExpression() != null) { leftCopy = (Expression) getLeftExpression().clone(); } QueryCommand copyCommand = null; if(getCommand() != null) { copyCommand = (QueryCommand) getCommand().clone(); } SubqueryCompareCriteria copy = new SubqueryCompareCriteria(leftCopy, copyCommand, this.getOperator(), this.getPredicateQuantifier()); if (this.subqueryHint != null) { copy.subqueryHint = this.subqueryHint.clone(); } if (this.arrayExpression != null) { copy.arrayExpression = (Expression) this.arrayExpression.clone(); } return copy; }
/** * @see org.teiid.query.sql.LanguageVisitor#visit(org.teiid.query.sql.lang.SubqueryCompareCriteria) */ public void visit(SubqueryCompareCriteria obj) { obj.setLeftExpression( replaceExpression(obj.getLeftExpression()) ); if (obj.getArrayExpression() != null) { obj.setArrayExpression(replaceExpression(obj.getArrayExpression())); } }
public SubqueryCompareCriteria(Expression leftExpression, QueryCommand subCommand, int operator, int predicateQuantifier) { setLeftExpression(leftExpression); setCommand(subCommand); setOperator(operator); setPredicateQuantifier(predicateQuantifier); }
/** * Override equals() method. * @param obj Other object * @return true if objects are equivalent */ public boolean equals(Object obj) { // Use super.equals() to check obvious stuff and variable if(obj == this) { return true; } if(! (obj instanceof SubqueryCompareCriteria)) { return false; } SubqueryCompareCriteria scc = (SubqueryCompareCriteria)obj; return getOperator() == scc.getOperator() && getPredicateQuantifier() == scc.getPredicateQuantifier() && EquivalenceUtil.areEqual(getLeftExpression(), scc.getLeftExpression()) && EquivalenceUtil.areEqual(getCommand(), scc.getCommand()) && EquivalenceUtil.areEqual(subqueryHint, scc.subqueryHint) && EquivalenceUtil.areEqual(arrayExpression, scc.arrayExpression); }
private Criteria rewriteCriteria(SubqueryCompareCriteria criteria) throws TeiidComponentException, TeiidProcessingException{ rewriteWithExplicitArray(criteria.getArrayExpression(), criteria); if (criteria.getCommand() != null && criteria.getCommand().getProcessorPlan() == null) { if ((criteria.getOperator() == CompareCriteria.EQ && criteria.getPredicateQuantifier() != SubqueryCompareCriteria.ALL) || (criteria.getOperator() == CompareCriteria.NE && criteria.getPredicateQuantifier() == SubqueryCompareCriteria.ALL)) { SubquerySetCriteria result = new SubquerySetCriteria(criteria.getLeftExpression(), criteria.getCommand()); result.setNegated(criteria.getOperator() == CompareCriteria.NE); return rewriteCriteria(result); if (criteria.getPredicateQuantifier() != SubqueryCompareCriteria.ALL && criteria.getOperator() != CompareCriteria.EQ && criteria.getOperator() != CompareCriteria.NE) { CompareCriteria cc = new CompareCriteria(); cc.setLeftExpression(criteria.getLeftExpression()); boolean useView = true; if (criteria.getCommand() instanceof Query) { Query query = (Query)criteria.getCommand(); if (!query.hasAggregates() && query.getCriteria() != null && query.getOrderBy() == null) { final boolean[] hasWindowFunctions = new boolean[1]; if (criteria.getOperator() == CompareCriteria.GT || criteria.getOperator() == CompareCriteria.GE) { type = Type.MIN; Query q = createInlineViewQuery(new GroupSymbol("X"), criteria.getCommand(), metadata, criteria.getCommand().getProjectedSymbols()); //$NON-NLS-1$ Expression ses = q.getProjectedSymbols().get(0); Expression expr = SymbolMap.getExpression(ses); q.getSelect().addSymbol(new AggregateSymbol(type.name(), false, expr)); ScalarSubquery ss = new ScalarSubquery(q); ss.setSubqueryHint(criteria.getSubqueryHint()); cc.setRightExpression(ss); cc.setOperator(criteria.getOperator());
subqueryCrit = new SubqueryCompareCriteria(); subqueryCrit.setLeftExpression(expression); subqueryCrit.setCommand(subquery); subqueryCrit.setArrayExpression(expr); subqueryCrit.setOperator(getOperator(operator.image)); subqueryCrit.setPredicateQuantifier(SubqueryCompareCriteria.ANY); } else if(quantifier.image.equalsIgnoreCase("some")) { //$NON-NLS-1$ subqueryCrit.setPredicateQuantifier(SubqueryCompareCriteria.SOME); } else if(quantifier.image.equalsIgnoreCase("all")) { //$NON-NLS-1$ subqueryCrit.setPredicateQuantifier(SubqueryCompareCriteria.ALL); subqueryCrit.setSubqueryHint(hint); {if (true) return subqueryCrit;} throw new Error("Missing return statement in function");
crit = new SubqueryCompareCriteria(ssc.getExpression(), ssc.getCommand(), SubqueryCompareCriteria.EQ, SubqueryCompareCriteria.SOME); ((SubqueryCompareCriteria)crit).setSubqueryHint(ssc.getSubqueryHint()); } else if (crit instanceof CompareCriteria) { CompareCriteria cc = (CompareCriteria)crit; Query query = (Query)ss.getCommand(); if (query.getGroupBy() == null && query.hasAggregates()) { crit = new SubqueryCompareCriteria(cc.getLeftExpression(), ss.getCommand(), cc.getOperator(), SubqueryCompareCriteria.SOME); ((SubqueryCompareCriteria)crit).setSubqueryHint(ss.getSubqueryHint()); if (scc.getSubqueryHint().isNoUnnest()) { return result; if (scc.getPredicateQuantifier() != SubqueryCompareCriteria.SOME || !(scc.getCommand() instanceof Query)) { return result; Query query = (Query)scc.getCommand(); Expression rightExpr = SymbolMap.getExpression(query.getProjectedSymbols().get(0)); result.mergeJoin = scc.getSubqueryHint().isMergeJoin(); if (!unnest && !result.mergeJoin) { return result; result.makeInd = scc.getSubqueryHint().isDepJoin(); result.query = query; result.additionalCritieria = (Criteria)new CompareCriteria(scc.getLeftExpression(), scc.getOperator(), rightExpr).clone();
@Override public void visit( SubqueryCompareCriteria obj ) { Expression leftExpression = obj.getLeftExpression(); visitNode(leftExpression); String operator = obj.getOperatorAsString(); String quantifier = obj.getPredicateQuantifierAsString(); // operator and beginning of list append(SPACE); append(operator); append(SPACE); append(quantifier); addSubqueryHint(obj.getSubqueryHint()); append(" ("); //$NON-NLS-1$ if (obj.getCommand() != null) { visitNode(obj.getCommand()); } else { visitNode(obj.getArrayExpression()); } append(")"); //$NON-NLS-1$ }
public void visit(SubqueryCompareCriteria obj) { visitNode(obj.getLeftExpression()); if (obj.getCommand() != null) { resolveSubQuery(obj, this.currentGroups); } visitNode(obj.getArrayExpression()); postVisitVisitor(obj); }
@Override public void visit(UriResourceLambdaAll all) { accept(all.getExpression()); if (this.ctxLambda != null) { org.teiid.query.sql.symbol.Expression predicate = this.stack.pop(); predicate = new SubqueryCompareCriteria(new Constant(true), buildSubquery( this.ctxLambda, predicate), CompareCriteria.EQ, SubqueryCompareCriteria.ALL); this.stack.push(predicate); } this.ctxLambda = null; }
public void visit(SubqueryCompareCriteria obj) { if (obj.getCommand() != null) { try { obj.setLeftExpression(ResolverUtil.resolveSubqueryPredicateCriteria(obj.getLeftExpression(), obj, metadata)); } catch(QueryResolverException e) { handleException(e); } catch (TeiidComponentException e) { handleException(e); } } else { try { resolveQuantifiedCompareArray(obj); } catch (QueryResolverException e) { handleException(e); } } }
private void resolveQuantifiedCompareArray(SubqueryCompareCriteria obj) throws QueryResolverException, AssertionError { Class<?> expressionType = obj.getArrayExpression().getType(); throw new QueryResolverException(QueryPlugin.Event.TEIID31175, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31175, new Object[] { obj.getArrayExpression(), expressionType })); Expression leftExpression = obj.getLeftExpression(); obj.setLeftExpression(ResolverUtil.convertExpression(leftExpression, rightTypeName, metadata) ); return; obj.setLeftExpression(ResolverUtil.convertExpression(leftExpression, leftTypeName, rightTypeName, metadata)); return; } catch (QueryResolverException qre) { obj.setLeftExpression(ResolverUtil.convertExpression(leftExpression, leftTypeName, rightTypeName, metadata) ); return;
if (crit.getArrayExpression() != null) { markInvalid(crit, "Quantified compare with an array cannot yet be pushed down."); //$NON-NLS-1$ return; switch(crit.getPredicateQuantifier()) { case SubqueryCompareCriteria.ALL: capability = Capability.CRITERIA_QUANTIFIED_ALL; checkCompareCriteria(crit, crit.getCommand().getProjectedSymbols().get(0)); markInvalid(crit.getCommand(), "Subquery cannot be pushed down"); //$NON-NLS-1$
public void visit(SubqueryCompareCriteria obj) { visitNode(obj.getLeftExpression()); visitor.createChildNamingContext(false); visitNode(obj.getCommand()); visitor.removeChildNamingContext(); }
public void visit(SubqueryCompareCriteria obj) { if (obj.getCommand() != null) { this.commands.add(obj.getCommand()); } }
/** * The check for empty rows should happen before the check for a null left expression * @throws Exception */ @Test public void testCompareSubqueryCriteriaNoRows1() throws Exception { SubqueryCompareCriteria crit = helpGetCompareSubqueryCriteria(SubqueryCompareCriteria.EQ, SubqueryCompareCriteria.ANY); crit.setLeftExpression(new Constant(null)); crit.negate(); helpTestCompareSubqueryCriteria(crit, true, Collections.emptyList()); }
/** * @see org.teiid.query.sql.LanguageVisitor#visit(org.teiid.query.sql.lang.SubqueryCompareCriteria) * @since 4.3 */ public void visit(SubqueryCompareCriteria obj) { validateSubquery(obj); if (isNonComparable(obj.getLeftExpression())) { handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0027", obj, DataTypeManager.getDataTypeName(obj.getLeftExpression().getType())),obj); //$NON-NLS-1$ } }
private Criteria rewriteCriteria(SubqueryCompareCriteria criteria) throws TeiidComponentException, TeiidProcessingException{ rewriteWithExplicitArray(criteria.getArrayExpression(), criteria); if (criteria.getCommand() != null && criteria.getCommand().getProcessorPlan() == null) { if ((criteria.getOperator() == CompareCriteria.EQ && criteria.getPredicateQuantifier() != SubqueryCompareCriteria.ALL) || (criteria.getOperator() == CompareCriteria.NE && criteria.getPredicateQuantifier() == SubqueryCompareCriteria.ALL)) { SubquerySetCriteria result = new SubquerySetCriteria(criteria.getLeftExpression(), criteria.getCommand()); result.setNegated(criteria.getOperator() == CompareCriteria.NE); return rewriteCriteria(result); if (criteria.getPredicateQuantifier() != SubqueryCompareCriteria.ALL && criteria.getOperator() != CompareCriteria.EQ && criteria.getOperator() != CompareCriteria.NE) { CompareCriteria cc = new CompareCriteria(); cc.setLeftExpression(criteria.getLeftExpression()); boolean useView = true; if (criteria.getCommand() instanceof Query) { Query query = (Query)criteria.getCommand(); if (!query.hasAggregates() && query.getCriteria() != null && query.getOrderBy() == null) { final boolean[] hasWindowFunctions = new boolean[1]; if (criteria.getOperator() == CompareCriteria.GT || criteria.getOperator() == CompareCriteria.GE) { type = Type.MIN; Query q = createInlineViewQuery(new GroupSymbol("X"), criteria.getCommand(), metadata, criteria.getCommand().getProjectedSymbols()); //$NON-NLS-1$ Expression ses = q.getProjectedSymbols().get(0); Expression expr = SymbolMap.getExpression(ses); q.getSelect().addSymbol(new AggregateSymbol(type.name(), false, expr)); ScalarSubquery ss = new ScalarSubquery(q); ss.setSubqueryHint(criteria.getSubqueryHint()); cc.setRightExpression(ss); cc.setOperator(criteria.getOperator());
subqueryCrit = new SubqueryCompareCriteria(); subqueryCrit.setLeftExpression(expression); subqueryCrit.setCommand(subquery); subqueryCrit.setArrayExpression(expr); subqueryCrit.setOperator(getOperator(operator.image)); subqueryCrit.setPredicateQuantifier(SubqueryCompareCriteria.ANY); } else if(quantifier.image.equalsIgnoreCase("some")) { //$NON-NLS-1$ subqueryCrit.setPredicateQuantifier(SubqueryCompareCriteria.SOME); } else if(quantifier.image.equalsIgnoreCase("all")) { //$NON-NLS-1$ subqueryCrit.setPredicateQuantifier(SubqueryCompareCriteria.ALL); subqueryCrit.setSubqueryHint(hint); {if (true) return subqueryCrit;} throw new Error("Missing return statement in function");
crit = new SubqueryCompareCriteria(ssc.getExpression(), ssc.getCommand(), SubqueryCompareCriteria.EQ, SubqueryCompareCriteria.SOME); ((SubqueryCompareCriteria)crit).setSubqueryHint(ssc.getSubqueryHint()); } else if (crit instanceof CompareCriteria) { CompareCriteria cc = (CompareCriteria)crit; Query query = (Query)ss.getCommand(); result.multiRow = !isSingleRow(query); crit = new SubqueryCompareCriteria(cc.getLeftExpression(), ss.getCommand(), cc.getOperator(), SubqueryCompareCriteria.SOME); ((SubqueryCompareCriteria)crit).setSubqueryHint(ss.getSubqueryHint()); Query query = (Query)ss.getCommand(); result.multiRow = !isSingleRow(query); crit = new SubqueryCompareCriteria(cc.getRightExpression(), ss.getCommand(), cc.getReverseOperator(), SubqueryCompareCriteria.SOME); ((SubqueryCompareCriteria)crit).setSubqueryHint(ss.getSubqueryHint()); if (scc.getSubqueryHint().isNoUnnest()) { return result; if (scc.getPredicateQuantifier() != SubqueryCompareCriteria.SOME || !(scc.getCommand() instanceof Query)) { return result; Query query = (Query)scc.getCommand(); Expression rightExpr = SymbolMap.getExpression(query.getProjectedSymbols().get(0)); result.mergeJoin = scc.getSubqueryHint().isMergeJoin(); if (!unnest && !result.mergeJoin) { return result;