@Override public void visit(AndOr obj) { visitNode(obj.getLeftCondition()); visitNode(obj.getRightCondition()); this.ranges = Range.mergeOverlapping(this.ranges); }
private static FilterConditionContext buildQueryFromWhereClause( Condition criteria, @SuppressWarnings("rawtypes") QueryBuilder queryBuilder, FilterConditionBeginContext fcbc) throws TranslatorException { if (criteria == null) return null; FilterConditionContext fcc = null; if (criteria instanceof AndOr) { LogManager.logTrace( LogConstants.CTX_CONNECTOR, "Infinispan DSL Parsing compound criteria."); // $NON-NLS-1$ AndOr crit = (AndOr) criteria; AndOr.Operator op = crit.getOperator(); switch (op) { case AND: FilterConditionContext f_and = buildQueryFromWhereClause(crit.getLeftCondition(), queryBuilder, fcbc); FilterConditionBeginContext fcbca = null; if (f_and != null) { fcbca = f_and.and(); } fcc = buildQueryFromWhereClause(crit.getRightCondition(), queryBuilder, fcbca); break; case OR: FilterConditionContext f_or = buildQueryFromWhereClause(crit.getLeftCondition(), queryBuilder, fcbc); FilterConditionBeginContext fcbcb = null; if (f_or != null) { fcbcb = f_or.or(); } fcc = buildQueryFromWhereClause(crit.getRightCondition(), queryBuilder, fcbcb); break; default: throw new TranslatorException( InfinispanPlugin.Util.gs( InfinispanPlugin.Event.TEIID25050, new Object[] {op, "And, Or"})); } } else if (criteria instanceof Comparison) { fcc = visit((Comparison) criteria, queryBuilder, fcbc); } else if (criteria instanceof Like) { fcc = visit((Like) criteria, queryBuilder, fcbc); } else if (criteria instanceof In) { fcc = visit((In) criteria, queryBuilder, fcbc); } else if (criteria instanceof IsNull) { fcc = visit((IsNull) criteria, queryBuilder, fcbc); } else if (criteria instanceof Not) { Condition c = ((Not) criteria).getCriteria(); if (fcbc == null) { fcc = queryBuilder.not(buildQueryFromWhereClause(c, queryBuilder, fcbc)); } else { fcc = fcbc.not(buildQueryFromWhereClause(c, queryBuilder, fcbc)); } } else { throw new TranslatorException( InfinispanPlugin.Util.gs(InfinispanPlugin.Event.TEIID25054, criteria.toString())); } return fcc; }
private static boolean buildQueryFromWhereClause( Condition criteria, BooleanJunction<BooleanJunction> junction, QueryBuilder queryBuilder) throws TranslatorException { boolean createdQueries = false; BooleanJunction<BooleanJunction> inUse = junction; if (criteria instanceof AndOr) { LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Parsing compound criteria."); // $NON-NLS-1$ AndOr crit = (AndOr) criteria; AndOr.Operator op = crit.getOperator(); switch (op) { case AND: BooleanJunction<BooleanJunction> leftAnd = queryBuilder.bool(); boolean andLeftHasQueries = buildQueryFromWhereClause(crit.getLeftCondition(), leftAnd, queryBuilder); BooleanJunction<BooleanJunction> rightAnd = queryBuilder.bool(); boolean andRightHasQueries = buildQueryFromWhereClause(crit.getRightCondition(), rightAnd, queryBuilder); if (andLeftHasQueries && andRightHasQueries) { leftAnd.must(rightAnd.createQuery()); inUse.should(leftAnd.createQuery()); } else if (andLeftHasQueries) { inUse.should(leftAnd.createQuery()); } else if (andRightHasQueries) { inUse.should(rightAnd.createQuery()); } createdQueries = (andLeftHasQueries ? andLeftHasQueries : andRightHasQueries); break; case OR: boolean orLeftHasQueries = buildQueryFromWhereClause(crit.getLeftCondition(), inUse, queryBuilder); boolean orRightHasQueries = buildQueryFromWhereClause(crit.getRightCondition(), inUse, queryBuilder); createdQueries = (orLeftHasQueries ? orLeftHasQueries : orRightHasQueries); break; default: final String msg = ObjectPlugin.Util.getString( "LuceneSearch.invalidOperator", new Object[] {op, "And, Or"}); // $NON-NLS-1$ //$NON-NLS-2$ throw new TranslatorException(msg); } } else if (criteria instanceof Comparison) { createdQueries = visit((Comparison) criteria, inUse, queryBuilder); } else if (criteria instanceof Exists) { LogManager.logTrace( LogConstants.CTX_CONNECTOR, "Parsing EXISTS criteria: NOT IMPLEMENTED YET"); //$NON-NLS-1$ // TODO Exists should be supported in a future release. } else if (criteria instanceof Like) { createdQueries = visit((Like) criteria, inUse, queryBuilder); } else if (criteria instanceof In) { createdQueries = visit((In) criteria, inUse, queryBuilder); } // else if (criteria instanceof Not) { // LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Parsing NOT criteria."); //$NON-NLS-1$ // isNegated = true; // filterList.addAll(getSearchFilterFromWhereClause(((Not)criteria).getCriteria(), // new LinkedList<String>())); // } return createdQueries; }