private static Collection<OIndex<?>> prepareLastIndexVariants(OClass iSchemaClass, OSQLFilterItemField.FieldChain fieldChain) { OClass oClass = iSchemaClass; final Collection<OIndex<?>> result = new ArrayList<OIndex<?>>(); for (int i = 0; i < fieldChain.getItemCount() - 1; i++) { oClass = oClass.getProperty(fieldChain.getItemName(i)).getLinkedClass(); if (oClass == null) { return result; } } final Set<OIndex<?>> involvedIndexes = new TreeSet<OIndex<?>>(new Comparator<OIndex<?>>() { public int compare(OIndex<?> o1, OIndex<?> o2) { return o1.getDefinition().getParamCount() - o2.getDefinition().getParamCount(); } }); involvedIndexes.addAll(oClass.getInvolvedIndexes(fieldChain.getItemName(fieldChain.getItemCount() - 1))); final Collection<Class<? extends OIndex>> indexTypes = new HashSet<Class<? extends OIndex>>(3); for (OIndex<?> involvedIndex : involvedIndexes) { if (!indexTypes.contains(involvedIndex.getInternal().getClass())) { result.add(involvedIndex); indexTypes.add(involvedIndex.getInternal().getClass()); } } return result; }
public List<OIndex<?>> getInvolvedIndexes(OClass iSchemaClass, OIndexSearchResult searchResultFields) { final Set<OIndex<?>> involvedIndexes = iSchemaClass.getInvolvedIndexes(searchResultFields.fields()); final List<OIndex<?>> result = new ArrayList<OIndex<?>>(involvedIndexes.size()); if (searchResultFields.lastField.isLong()) { result.addAll(OChainedIndexProxy.createProxies(iSchemaClass, searchResultFields.lastField)); } else { for (OIndex<?> involvedIndex : involvedIndexes) { result.add(involvedIndex); } } return result; }
/** * Creates {@code FieldChain} in case when filter item can have such representation. * * @return {@code FieldChain} representation of this filter item. * @throws IllegalStateException if this filter item cannot be represented as {@code FieldChain}. */ public FieldChain getFieldChain() { if (!isFieldChain()) { throw new IllegalStateException("Filter item field contains not only field operators"); } return new FieldChain(); }
final String lastFiled = searchResult.lastField.getItemName(searchResult.lastField.getItemCount() - 1); final String relatedIndexField = indexDefinition.getFields().get(searchResult.fieldValuePairs.size()); if (!lastFiled.equals(relatedIndexField)) {
final String lastFiled = searchResult.lastField.getItemName(searchResult.lastField.getItemCount() - 1); final String relatedIndexField = indexDefinition.getFields().get(searchResult.fieldValuePairs.size()); if (!lastFiled.equals(relatedIndexField)) {
if (itemField.getFieldChain().getItemCount() > 1) { return null; if (itemField.getFieldChain().getItemCount() > 1) { return null; if (itemField.getFieldChain().getItemCount() > 1) { return null; if (itemField.getFieldChain().getItemCount() > 1) { return null;
if(iCondition.getLeft() instanceof OSQLFilterItemField && ((OSQLFilterItemField) iCondition.getLeft()).isFieldChain() && ((OSQLFilterItemField) iCondition.getLeft()).getFieldChain().getItemCount()==1){ String fieldName = ((OSQLFilterItemField) iCondition.getLeft()).getFieldChain().getItemName(0); if(fieldName!=null) { Object record = iRecord.getRecord();
&& ((OSQLFilterItemField) iCondition.getLeft()).getFieldChain().getItemCount() == 1) { String fieldName = ((OSQLFilterItemField) iCondition.getLeft()).getFieldChain().getItemName(0); if (fieldName != null) { Object record = iRecord.getRecord();
for (int i = 0; i < chain.getItemCount() - 1; i++) { if (lastDoc == null) { return null; Object nextDoc = lastDoc.field(chain.getItemName(i)); if (nextDoc == null || !(nextDoc instanceof OIdentifiable)) { return null; return null; OProperty property = schemaClass.getProperty(chain.getItemName(chain.getItemCount() - 1)); if (property == null) { 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 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 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; }
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 static Iterable<List<OIndex<?>>> getIndexesForChain(OClass iSchemaClass, OSQLFilterItemField.FieldChain fieldChain) { List<OIndex<?>> baseIndexes = prepareBaseIndexes(iSchemaClass, fieldChain); if (baseIndexes == null) return Collections.emptyList(); Collection<OIndex<?>> lastIndexes = prepareLastIndexVariants(iSchemaClass, fieldChain); Collection<List<OIndex<?>>> result = new ArrayList<List<OIndex<?>>>(); for (OIndex<?> lastIndex : lastIndexes) { final List<OIndex<?>> indexes = new ArrayList<OIndex<?>>(fieldChain.getItemCount()); indexes.addAll(baseIndexes); indexes.add(lastIndex); result.add(indexes); } return result; }
public static boolean checkIndexExistence(final OClass iSchemaClass, final OIndexSearchResult result) { if (!iSchemaClass.areIndexed(result.fields())) return false; if (result.lastField.isLong()) { final int fieldCount = result.lastField.getItemCount(); OClass cls = iSchemaClass.getProperty(result.lastField.getItemName(0)).getLinkedClass(); for (int i = 1; i < fieldCount; i++) { if (cls == null || !cls.areIndexed(result.lastField.getItemName(i))) { return false; } cls = cls.getProperty(result.lastField.getItemName(i)).getLinkedClass(); } } return true; }
/** * @param searchResult * Query subset is going to be merged with given one. * @return <code>true</code> if two query subsets can be merged. */ boolean canBeMerged(final OIndexSearchResult searchResult) { if (lastField.isLong() || searchResult.lastField.isLong()) { return false; } if (!lastOperator.canBeMerged() || !searchResult.lastOperator.canBeMerged()) { return false; } return isIndexEqualityOperator(lastOperator) || isIndexEqualityOperator(searchResult.lastOperator); }
private boolean isSameField(OSQLFilterItemField field, OSQLFilterItemField.FieldChain fieldChain) { return fieldChain.belongsTo(field); }
public static boolean checkIndexExistence(final OClass iSchemaClass, final OIndexSearchResult result) { if (!iSchemaClass.areIndexed(result.fields())) return false; if (result.lastField.isLong()) { final int fieldCount = result.lastField.getItemCount(); OClass cls = iSchemaClass.getProperty(result.lastField.getItemName(0)).getLinkedClass(); for (int i = 1; i < fieldCount; i++) { if (cls == null || !cls.areIndexed(result.lastField.getItemName(i))) { return false; } cls = cls.getProperty(result.lastField.getItemName(i)).getLinkedClass(); } } return true; }
private static List<OIndex<?>> prepareBaseIndexes(OClass iSchemaClass, OSQLFilterItemField.FieldChain fieldChain) { List<OIndex<?>> result = new ArrayList<OIndex<?>>(fieldChain.getItemCount() - 1); OClass oClass = iSchemaClass; for (int i = 0; i < fieldChain.getItemCount() - 1; i++) { final Set<OIndex<?>> involvedIndexes = oClass.getInvolvedIndexes(fieldChain.getItemName(i)); final OIndex<?> bestIndex = findBestIndex(involvedIndexes); if (bestIndex == null) return null; result.add(bestIndex); oClass = oClass.getProperty(fieldChain.getItemName(i)).getLinkedClass(); } return result; }
public List<String> fields() { final List<String> result = new ArrayList<String>(fieldValuePairs.size() + 1); result.addAll(fieldValuePairs.keySet()); result.add(lastField.getItemName(0)); return result; }