private List<List<OIndexSearchResult>> analyzeUnion(OClass iSchemaClass, OSQLFilterCondition condition, OCommandContext iContext) { List<List<OIndexSearchResult>> result = new ArrayList<List<OIndexSearchResult>>(); result.addAll(analyzeOrFilterBranch(iSchemaClass, (OSQLFilterCondition) condition.getLeft(), iContext)); result.addAll(analyzeOrFilterBranch(iSchemaClass, (OSQLFilterCondition) condition.getRight(), iContext)); return result; }
@Override protected boolean evaluateExpression(final OIdentifiable iRecord, final OSQLFilterCondition iCondition, final Object iLeft, Object iRight, OCommandContext iContext) { if (iCondition.getLeft() instanceof OSQLFilterItemField) { if (OSQLHelper.DEFINED.equals(iCondition.getRight())) return evaluateDefined(iRecord, "" + iCondition.getLeft()); if (iCondition.getRight() instanceof OSQLFilterItemField && "not defined".equalsIgnoreCase("" + iCondition.getRight())) return !evaluateDefined(iRecord, "" + iCondition.getLeft()); } if (OSQLHelper.NOT_NULL.equals(iRight)) return iLeft != null; else if (OSQLHelper.NOT_NULL.equals(iLeft)) return iRight != null; else if (OSQLHelper.DEFINED.equals(iLeft)) return evaluateDefined(iRecord, (String) iRight); else if (OSQLHelper.DEFINED.equals(iRight)) return evaluateDefined(iRecord, (String) iLeft); else return iLeft == iRight; }
@Override protected boolean evaluateExpression(final OIdentifiable iRecord, final OSQLFilterCondition iCondition, final Object iLeft, final Object iRight, final OCommandContext iContext) { final OSQLFilterCondition condition; final Object target; if (iCondition.getLeft() instanceof OSQLFilterCondition) { condition = (OSQLFilterCondition) iCondition.getLeft(); target = iRight; } else { condition = (OSQLFilterCondition) iCondition.getRight(); target = iLeft; } final Set<ORID> evaluatedRecords = new HashSet<ORID>(); return traverse(target, condition, 0, evaluatedRecords, iContext); }
public List<String> getInvolvedFields(final List<String> list) { extractInvolvedFields(getLeft(), list); extractInvolvedFields(getRight(), list); return list; }
@Override public Object evaluateRecord(OIdentifiable iRecord, ODocument iCurrentResult, OSQLFilterCondition iCondition, Object iLeft, Object iRight, OCommandContext iContext, final ODocumentSerializer serializer) { OSQLFunction function = OSQLEngine.getInstance().getFunction(keyword); return function.execute(this, iRecord, iCurrentResult, new Object[] { iLeft, iCondition.getRight() }, iContext); }
private OIndexSearchResult analyzeIndexMethod(OClass iSchemaClass, OSQLFilterCondition condition, List<OIndexSearchResult> iIndexSearchResults, OCommandContext ctx) { OIndexSearchResult result = createIndexedProperty(condition, condition.getLeft(), ctx); if (result == null) { result = createIndexedProperty(condition, condition.getRight(), ctx); } if (result == null) { return null; } if (checkIndexExistence(iSchemaClass, result)) { iIndexSearchResults.add(result); } return result; }
if (iCondition.getRight() instanceof Collection) { List<Object> right = (List<Object>) iCondition.getRight(); value = right.get(i); } else { value = iCondition.getRight(); OSQLFilterItemVariable item = (OSQLFilterItemVariable) obj; Object value = null; if (iCondition.getRight() instanceof Collection) { List<Object> right = (List<Object>) iCondition.getRight(); value = right.get(i); } else { value = iCondition.getRight(); OIndexSearchResult result = OLuceneOperatorUtil.createIndexedProperty(iCondition, iCondition.getLeft()); if (result == null) result = OLuceneOperatorUtil.createIndexedProperty(iCondition, iCondition.getRight());
if (condition.getRight() == null && condition.getLeft() instanceof OSQLFilterCondition) { condition = (OSQLFilterCondition) condition.getLeft(); operator = condition.getOperator(); final OIndexReuseType reuseType = operator.getIndexReuseType(condition.getLeft(), condition.getRight()); switch (reuseType) { case INDEX_METHOD: if (isCovered(indexMatch, operator, condition.getLeft(), condition.getRight()) || isCovered(indexMatch, operator, condition.getRight(), condition.getLeft())) { return null; condition.setLeft(optimize((OSQLFilterCondition) condition.getLeft(), indexMatch)); if (condition.getRight() instanceof OSQLFilterCondition) condition.setRight(optimize((OSQLFilterCondition) condition.getRight(), indexMatch)); return (OSQLFilterCondition) condition.getRight(); if (condition.getRight() == null) return (OSQLFilterCondition) condition.getLeft(); return condition; if (isCovered(indexMatch, operator, condition.getLeft(), condition.getRight()) || isCovered(indexMatch, operator, condition.getRight(), condition.getLeft())) { return null;
private Object[] parseParams(OIdentifiable iRecord, OSQLFilterCondition iCondition) { ODocument oDocument = (ODocument) iRecord; Collection left = (Collection) iCondition.getLeft(); Collection right = (Collection) iCondition.getRight(); Object[] params = new Object[(left.size() * 2) - 2]; int i = 0; for (Object obj : left) { if (obj instanceof OSQLFilterItemField) { String fName = ((OSQLFilterItemField) obj).getFieldChain().getItemName(0); params[i] = oDocument.field(fName); i++; } } for (Object obj : right) { if (obj instanceof Number) { params[i] = ((Double) OType.convert(obj, Double.class)).doubleValue(); ; i++; } } return params; }
private Object[] parseParams(OIdentifiable iRecord, OSQLFilterCondition iCondition) { ODocument oDocument = (ODocument) iRecord; Collection left = (Collection) iCondition.getLeft(); Collection right = (Collection) iCondition.getRight(); Object[] params = new Object[(left.size() * 2) - 2]; int i = 0; for (Object obj : left) { if (obj instanceof OSQLFilterItemField) { String fName = ((OSQLFilterItemField) obj).getFieldChain().getItemName(0); params[i] = oDocument.field(fName); i++; } } for (Object obj : right) { if (obj instanceof Number) { params[i] = ((Double) OType.convert(obj, Double.class)).doubleValue(); ; i++; } } return params; }
protected Set<String> computePrefetchFieldList(final OSQLFilterCondition iCondition, final Set<String> iFields) { Object left = iCondition.getLeft(); Object right = iCondition.getRight(); if (left instanceof OSQLFilterItemField) { ((OSQLFilterItemField) left).setPreLoadedFields(iFields); iFields.add(((OSQLFilterItemField) left).getRoot()); } else if (left instanceof OSQLFilterCondition) computePrefetchFieldList((OSQLFilterCondition) left, iFields); if (right instanceof OSQLFilterItemField) { ((OSQLFilterItemField) right).setPreLoadedFields(iFields); iFields.add(((OSQLFilterItemField) right).getRoot()); } else if (right instanceof OSQLFilterCondition) computePrefetchFieldList((OSQLFilterCondition) right, iFields); return iFields; } }
private List<List<OIndexSearchResult>> analyzeOrFilterBranch(final OClass iSchemaClass, OSQLFilterCondition condition, OCommandContext iContext) { if (condition == null) { return null; } OQueryOperator operator = condition.getOperator(); while (operator == null) { if (condition.getRight() == null && condition.getLeft() instanceof OSQLFilterCondition) { condition = (OSQLFilterCondition) condition.getLeft(); operator = condition.getOperator(); } else { return null; } } final OIndexReuseType indexReuseType = operator.getIndexReuseType(condition.getLeft(), condition.getRight()); if (OIndexReuseType.INDEX_UNION.equals(indexReuseType)) { return analyzeUnion(iSchemaClass, condition, iContext); } List<List<OIndexSearchResult>> result = new ArrayList<List<OIndexSearchResult>>(); List<OIndexSearchResult> sub = analyzeCondition(condition, iSchemaClass, iContext); // analyzeFilterBranch(iSchemaClass, condition, sub, iContext); result.add(sub); return result; }
private OIndexSearchResult analyzeFilterBranch(final OClass iSchemaClass, OSQLFilterCondition condition, final List<OIndexSearchResult> iIndexSearchResults, OCommandContext iContext) { if (condition == null) { return null; } OQueryOperator operator = condition.getOperator(); while (operator == null) { if (condition.getRight() == null && condition.getLeft() instanceof OSQLFilterCondition) { condition = (OSQLFilterCondition) condition.getLeft(); operator = condition.getOperator(); } else { return null; } } final OIndexReuseType indexReuseType = operator.getIndexReuseType(condition.getLeft(), condition.getRight()); switch (indexReuseType) { case INDEX_INTERSECTION: return analyzeIntersection(iSchemaClass, condition, iIndexSearchResults, iContext); case INDEX_METHOD: return analyzeIndexMethod(iSchemaClass, condition, iIndexSearchResults, iContext); case INDEX_OPERATOR: return analyzeOperator(iSchemaClass, condition, iIndexSearchResults, iContext); default: return null; } }
private OIndexSearchResult analyzeIntersection(OClass iSchemaClass, OSQLFilterCondition condition, List<OIndexSearchResult> iIndexSearchResults, OCommandContext iContext) { final OIndexSearchResult leftResult = analyzeFilterBranch(iSchemaClass, (OSQLFilterCondition) condition.getLeft(), iIndexSearchResults, iContext); final OIndexSearchResult rightResult = analyzeFilterBranch(iSchemaClass, (OSQLFilterCondition) condition.getRight(), iIndexSearchResults, iContext); if (leftResult != null && rightResult != null) { if (leftResult.canBeMerged(rightResult)) { final OIndexSearchResult mergeResult = leftResult.merge(rightResult); if (iSchemaClass.areIndexed(mergeResult.fields())) { iIndexSearchResults.add(mergeResult); } return leftResult.merge(rightResult); } } return null; }
private void mergeRangeConditionsToBetweenOperators(OSQLFilterCondition condition) { if (condition == null) { return; } OSQLFilterCondition newCondition; if (condition.getLeft() instanceof OSQLFilterCondition) { OSQLFilterCondition leftCondition = (OSQLFilterCondition) condition.getLeft(); newCondition = convertToBetweenClause(leftCondition); if (newCondition != null) { condition.setLeft(newCondition); metricRecorder.recordRangeQueryConvertedInBetween(); } else { mergeRangeConditionsToBetweenOperators(leftCondition); } } if (condition.getRight() instanceof OSQLFilterCondition) { OSQLFilterCondition rightCondition = (OSQLFilterCondition) condition.getRight(); newCondition = convertToBetweenClause(rightCondition); if (newCondition != null) { condition.setRight(newCondition); metricRecorder.recordRangeQueryConvertedInBetween(); } else { mergeRangeConditionsToBetweenOperators(rightCondition); } } }
public static OIndexSearchResult createIndexedProperty(final OSQLFilterCondition iCondition, final Object iItem) { if (iItem == null || !(iItem instanceof OSQLFilterItemField)) return null; if (iCondition.getLeft() instanceof OSQLFilterItemField && iCondition.getRight() instanceof OSQLFilterItemField) return null; final OSQLFilterItemField item = (OSQLFilterItemField) iItem; if (item.hasChainOperators() && !item.isFieldChain()) return null; final Object origValue = iCondition.getLeft() == iItem ? iCondition.getRight() : iCondition.getLeft(); if (iCondition.getOperator() instanceof OQueryOperatorBetween || iCondition.getOperator() instanceof OQueryOperatorIn) { return new OIndexSearchResult(iCondition.getOperator(), item.getFieldChain(), origValue); } final Object value = OSQLHelper.getValue(origValue); if (value == null) return null; return new OIndexSearchResult(iCondition.getOperator(), item.getFieldChain(), value); }
public static OIndexSearchResult createIndexedProperty(final OSQLFilterCondition iCondition, final Object iItem) { if (iItem == null || !(iItem instanceof OSQLFilterItemField)) return null; if (iCondition.getLeft() instanceof OSQLFilterItemField && iCondition.getRight() instanceof OSQLFilterItemField) return null; final OSQLFilterItemField item = (OSQLFilterItemField) iItem; if (item.hasChainOperators() && !item.isFieldChain()) return null; final Object origValue = iCondition.getLeft() == iItem ? iCondition.getRight() : iCondition.getLeft(); if (iCondition.getOperator() instanceof OQueryOperatorBetween || iCondition.getOperator() instanceof OQueryOperatorIn) { return new OIndexSearchResult(iCondition.getOperator(), item.getFieldChain(), origValue); } final Object value = OSQLHelper.getValue(origValue); if (value == null) return null; return new OIndexSearchResult(iCondition.getOperator(), item.getFieldChain(), value); }
Object right = iCondition.getRight();