@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); }
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; }
protected Collection<String> fields(OSQLFilterCondition iCondition) { Object left = iCondition.getLeft(); if (left instanceof String) { String fName = (String) left; return Arrays.asList(fName); } if (left instanceof Collection) { Collection<OSQLFilterItemField> f = (Collection<OSQLFilterItemField>) left; List<String> fields = new ArrayList<String>(); for (OSQLFilterItemField field : f) { fields.add(field.toString()); } return fields; } if (left instanceof OSQLFilterItemField) { OSQLFilterItemField fName = (OSQLFilterItemField) left; return Arrays.asList(fName.toString()); } return Collections.emptyList(); } }
@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; }
if (iCondition.getLeft() instanceof OSQLFilterItemField) fieldName = iCondition.getLeft().toString(); else fieldName = iCondition.getRight().toString(); if (iCondition.getLeft() instanceof OSQLFilterItemField) fieldValue = iCondition.getRight().toString(); else fieldValue = iCondition.getLeft().toString();
public List<String> getInvolvedFields(final List<String> list) { extractInvolvedFields(getLeft(), list); extractInvolvedFields(getRight(), list); return list; }
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; }
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; }
if (condition.getRight() == null && condition.getLeft() instanceof OSQLFilterCondition) { condition = (OSQLFilterCondition) condition.getLeft(); operator = condition.getOperator(); } else { 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; if (condition.getLeft() instanceof OSQLFilterCondition) condition.setLeft(optimize((OSQLFilterCondition) condition.getLeft(), indexMatch)); if (condition.getLeft() == null) 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;
protected Collection<String> fields(OSQLFilterCondition iCondition) { Object left = iCondition.getLeft(); if (left instanceof String) { String fName = (String) left; return Arrays.asList(fName); } if (left instanceof Collection) { Collection<OSQLFilterItemField> f = (Collection<OSQLFilterItemField>) left; List<String> fields = new ArrayList<String>(); for (OSQLFilterItemField field : f) { fields.add(field.toString()); } return fields; } if (left instanceof OSQLFilterItemField) { OSQLFilterItemField fName = (OSQLFilterItemField) left; if (fName.isFieldChain()) { int itemCount = fName.getFieldChain().getItemCount(); return Arrays.asList(fName.getFieldChain().getItemName(itemCount - 1)); } else { return Arrays.asList(fName.toString()); } } return Collections.emptyList(); } }
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 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; } }
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); }
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); } } }
protected OLuceneFullTextIndex involvedIndex(OIdentifiable iRecord, ODocument iCurrentResult, OSQLFilterCondition iCondition, Object iLeft, Object iRight) { ODocument doc = iRecord.getRecord(); OClass cls = getDatabase().getMetadata().getSchema().getClass(doc.getClassName()); if (isChained(iCondition.getLeft())) { OSQLFilterItemField chained = (OSQLFilterItemField) iCondition.getLeft(); OSQLFilterItemField.FieldChain fieldChain = chained.getFieldChain(); OClass oClass = cls; for (int i = 0; i < fieldChain.getItemCount() - 1; i++) { oClass = oClass.getProperty(fieldChain.getItemName(i)).getLinkedClass(); } if (oClass != null) { cls = oClass; } } Set<OIndex<?>> classInvolvedIndexes = cls.getInvolvedIndexes(fields(iCondition)); OLuceneFullTextIndex idx = null; for (OIndex<?> classInvolvedIndex : classInvolvedIndexes) { if (classInvolvedIndex.getInternal() instanceof OLuceneFullTextIndex) { idx = (OLuceneFullTextIndex) classInvolvedIndex.getInternal(); break; } } return idx; }