@SuppressWarnings("unchecked") public OIndexInternal<T> getInternal() { OIndex<?> internal = delegate; while (!(internal instanceof OIndexInternal) && internal != null) internal = internal.getInternal(); return (OIndexInternal<T>) internal; }
/** * Returns internal index of last chain index, because proxy applicable to all operations that last index applicable. */ public OIndexInternal<T> getInternal() { return (OIndexInternal<T>) lastIndex.getInternal(); }
public OIndexInternal<?> resolveAssociatedIndex(String indexName, OIndexManager indexManager) { if (resolvedIndex == null) { final OIndex<?> index = indexManager.getIndex(indexName); if (index != null) resolvedIndex = index.getInternal(); } return resolvedIndex; }
public void flush() { for (final OIndex<?> idx : indexes.values()) { OIndexInternal<?> indexInternal = idx.getInternal(); if (indexInternal != null) indexInternal.flush(); } }
@Override public void addClusterToIndex(final String clusterName, final String indexName) { final OIndex<?> index = indexes.get(indexName); if (index == null) throw new OIndexException("Index with name " + indexName + " does not exist."); if (index.getInternal() == null) throw new OIndexException("Index with name " + indexName + " has no internal presentation."); if (!index.getInternal().getClusters().contains(clusterName)) { index.getInternal().addCluster(clusterName); save(); } }
@Override public void removeClusterFromIndex(final String clusterName, final String indexName) { final OIndex<?> index = indexes.get(indexName); if (index == null) throw new OIndexException("Index with name " + indexName + " does not exist."); index.getInternal().removeCluster(clusterName); save(); }
List<IndexSearchDescriptor> descriptors = indexes.stream().filter(x -> x.getInternal().canBeUsedInEqualityOperators()) .map(index -> buildIndexSearchDescriptor(ctx, index, block, clazz)).filter(Objects::nonNull) .filter(x -> x.keyCondition != null).filter(x -> x.keyCondition.getSubBlocks().size() > 0).collect(Collectors.toList());
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; }
protected OLuceneFullTextIndex involvedIndex(OIdentifiable iRecord, ODocument iCurrentResult, OSQLFilterCondition iCondition, Object iLeft, Object iRight) { ODocument doc = iRecord.getRecord(); Set<OIndex<?>> classInvolvedIndexes = getDatabase().getMetadata().getIndexManager() .getClassInvolvedIndexes(doc.getClassName(), fields(iCondition)); OLuceneFullTextIndex idx = null; for (OIndex<?> classInvolvedIndex : classInvolvedIndexes) { if (classInvolvedIndex.getInternal() instanceof OLuceneFullTextIndex) { idx = (OLuceneFullTextIndex) classInvolvedIndex.getInternal(); break; } } return idx; }
private OLuceneFullTextIndex searchForIndex(OCommandContext ctx, String indexName) { OIndex<?> index = ctx.getDatabase().getMetadata().getIndexManager().getIndex(indexName); if (index != null && index.getInternal() instanceof OLuceneFullTextIndex) { return (OLuceneFullTextIndex) index; } return null; }
@Override public Object execute(Object iThis, OIdentifiable iCurrentRecord, Object iCurrentResult, Object[] iParams, OCommandContext iContext) { String clazz = (String) iParams[0]; String latField = (String) iParams[1]; String lngField = (String) iParams[2]; ODatabaseDocument databaseRecord = ODatabaseRecordThreadLocal.INSTANCE.get(); Set<OIndex<?>> indexes = databaseRecord.getMetadata().getSchema().getClass(clazz).getInvolvedIndexes(latField, lngField); for (OIndex i : indexes) { if (OClass.INDEX_TYPE.SPATIAL.toString().equals(i.getInternal().getType())) { List<Object> params = new ArrayList<Object>(); params.add(iParams[3]); params.add(iParams[4]); double distance = iParams.length > 5 ? ((Number) iParams[5]).doubleValue() : 0; Object ret = i.get(new OSpatialCompositeKey(params).setMaxDistance(distance)); if (ret instanceof Collection) { if (context == null) context = new HashSet<Object>(); context.addAll((Collection<?>) ret); } return ret; } } return null; }
@Override public void onDrop(final ODatabaseInternal db) { try { if (db.isClosed()) return; OLogManager.instance().debug(this, "Dropping Lucene indexes..."); db.getMetadata().getIndexManager().getIndexes().stream().filter(idx -> idx.getInternal() instanceof OLuceneFullTextIndex) .peek(idx -> OLogManager.instance().debug(this, "deleting index " + idx.getName())).forEach(idx -> idx.delete()); } catch (Exception e) { OLogManager.instance().warn(this, "Error on dropping Lucene indexes", e); } }
private OLuceneFullTextIndex searchForIndex(String className, OCommandContext ctx, OExpression... args) { String indexName = (String) args[0].execute((OIdentifiable) null, ctx); OIndex<?> index = ctx.getDatabase().getMetadata().getIndexManager().getClassIndex(className, indexName); if (index != null && index.getInternal() instanceof OLuceneFullTextIndex) { return (OLuceneFullTextIndex) index; } return null; }
private void updateIndexEntries(ODocument iDocument) { iDocument = checkForLoading(iDocument); final OClass cls = iDocument.getSchemaClass(); if (cls == null) return; final Collection<OIndex<?>> indexes = (Collection<OIndex<?>>) getDatabase().getMetadata().getIndexManager().getIndexes(); if (!indexes.isEmpty()) { final Set<String> dirtyFields = new HashSet<String>(Arrays.asList(iDocument.getDirtyFields())); if (!dirtyFields.isEmpty()) { for (final OIndex<?> index : indexes) { if (index.getInternal() instanceof OLuceneIndex && index.getConfiguration().field("metadata") != null) { if (index.getDefinition() instanceof OCompositeIndexDefinition) processCompositeIndexUpdate(index, dirtyFields, iDocument); else processSingleIndexUpdate(index, dirtyFields, iDocument); if (iDocument.isTrackingChanges()) { iDocument.setTrackingChanges(false); iDocument.setTrackingChanges(true); } } } } } }
@Override public OIndexCursor executeIndexQuery(OCommandContext iContext, OIndex<?> index, List<Object> keyParams, boolean ascSortOrder) { final OIndexDefinition indexDefinition = index.getDefinition(); if (indexDefinition.getParamCount() > 1) return null; final OIndex<?> internalIndex = index.getInternal(); OIndexCursor cursor; if (internalIndex instanceof OIndexFullText) { final Object key = indexDefinition.createValue(keyParams); final Object indexResult = index.get(key); if (indexResult == null || indexResult instanceof OIdentifiable) cursor = new OIndexCursorSingleValue((OIdentifiable) indexResult, key); else cursor = new OIndexCursorCollectionValue((Collection<OIdentifiable>) indexResult, key); } else return null; updateProfiler(iContext, internalIndex, keyParams, indexDefinition); return cursor; }
@Override public void onDrop(final ODatabaseInternal iDatabase) { OLogManager.instance().info(this, "Dropping Lucene indexes..."); for (OIndex idx : iDatabase.getMetadata().getIndexManager().getIndexes()) { if (idx.getInternal() instanceof OLuceneIndex) { OLogManager.instance().info(this, "- index '%s'", idx.getName()); idx.delete(); } } }
protected OLuceneSpatialIndex searchForIndexOLd(OFromClause target, OExpression[] args) { // TODO Check if target is a class otherwise exception OFromItem item = target.getItem(); OIdentifier identifier = item.getIdentifier(); String fieldName = args[0].toString(); Set<OIndex<?>> indexes = getDb().getMetadata().getIndexManager() .getClassInvolvedIndexes(identifier.getStringValue(), fieldName); for (OIndex<?> index : indexes) { if (index.getInternal() instanceof OLuceneSpatialIndex) { return (OLuceneSpatialIndex) index; } } return null; }
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; }
@Override public void onDrop(final ODatabaseInternal iDatabase) { try { OLogManager.instance().debug(this, "Dropping Lucene indexes..."); for (OIndex idx : iDatabase.getMetadata().getIndexManager().getIndexes()) { if (idx.getInternal() instanceof OLuceneIndex) { OLogManager.instance().debug(this, "- index '%s'", idx.getName()); idx.delete(); } } } catch (Exception e) { OLogManager.instance().warn(this, "Error on dropping Lucene indexes", e); } }
@Override public void onDrop(final ODatabaseInternal db) { try { if (db.isClosed()) return; OLogManager.instance().debug(this, "Dropping spatial indexes..."); for (OIndex idx : db.getMetadata().getIndexManager().getIndexes()) { if (idx.getInternal() instanceof OLuceneSpatialIndex) { OLogManager.instance().debug(this, "- index '%s'", idx.getName()); idx.delete(); } } } catch (Exception e) { OLogManager.instance().warn(this, "Error on dropping spatial indexes", e); } }