X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=bundles%2Forg.simantics.db.indexing%2Fsrc%2Forg%2Fsimantics%2Fdb%2Findexing%2FIndexUtils.java;h=8b1a928b353497bbc733c1b89e7831e986659dd7;hb=1adc3807dea544d29512510dc9546ec65b72e389;hp=5262d99a2d85690715f4264a9a01cfaf664bcf95;hpb=0ae2b770234dfc3cbb18bd38f324125cf0faca07;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/IndexUtils.java b/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/IndexUtils.java index 5262d99a2..8b1a928b3 100644 --- a/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/IndexUtils.java +++ b/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/IndexUtils.java @@ -1,5 +1,6 @@ package org.simantics.db.indexing; +import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; @@ -11,21 +12,28 @@ import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.NumericUtils; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.SubMonitor; import org.simantics.databoard.Bindings; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.Session; import org.simantics.db.common.procedure.adapter.TransientCacheListener; import org.simantics.db.common.request.ObjectsWithType; -import org.simantics.db.common.utils.NameUtils; import org.simantics.db.exception.DatabaseException; +import org.simantics.db.indexing.exception.IndexCorruptedException; +import org.simantics.db.layer0.genericrelation.IndexQueries; +import org.simantics.db.layer0.genericrelation.IndexedRelations; import org.simantics.db.layer0.util.Layer0Utils; import org.simantics.db.service.CollectionSupport; import org.simantics.layer0.Layer0; import org.simantics.operation.Layer0X; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class IndexUtils { + private static final Logger LOGGER = LoggerFactory.getLogger(IndexUtils.class); + public static Collection> find(ReadGraph graph, Resource index, String filter) throws DatabaseException { Collection> indexResult = graph.syncRequest(new QueryIndex(index, filter), TransientCacheListener.>>instance()); @@ -96,8 +104,9 @@ public class IndexUtils { public static Collection findByType(ReadGraph graph, Resource model, Resource type) throws DatabaseException { HashSet results = new HashSet(); - - String search = "Types:*" + NameUtils.getSafeName(graph, type); + Layer0 L0 = Layer0.getInstance(graph); + String typeName = graph.getRelatedValue(type, L0.HasName, Bindings.STRING); + String search = "Types:" + IndexQueries.quoteTerm(typeName); for(Map entry : find(graph, model, search)) { Resource resource = (Resource)entry.get("Resource"); @@ -111,12 +120,12 @@ public class IndexUtils { Layer0 L0 = Layer0.getInstance(graph); HashSet results = new HashSet(); - - String search = "Types:*" + type + " AND Name:" + name; + String typeName = graph.getRelatedValue(type, L0.HasName, Bindings.STRING); + String search = "Types:" + IndexQueries.quoteTerm(typeName) + " AND Name:" + IndexQueries.quoteTerm(name); for(Map entry : find(graph, model, search)) { Resource resource = (Resource)entry.get("Resource"); - if(graph.isInstanceOf(resource, type) && name.equals(graph.getPossibleRelatedValue(resource, L0.HasName, Bindings.STRING))) results.add(resource); + if(graph.isInstanceOf(resource, type)) results.add(resource); } return results; } @@ -138,10 +147,25 @@ public class IndexUtils { mem.flush(progress); IndexedRelationsSearcher searcher = mem.get(session, L0X.DependenciesRelation, indexRoot); - return searcher.doList(progress, session); - + List results; + try { + results = searcher.doList(progress, session); + } catch (IndexCorruptedException e) { + LOGGER.error("Index is corrupted for indexRoot {}", indexRoot, e); + rebuild(session, progress); + // if this fails then no can do + searcher = mem.get(session, L0X.DependenciesRelation, indexRoot); + results = searcher.doList(progress, session); + } + return results; } + private static void rebuild(Session session, IProgressMonitor monitor) throws Exception { + LOGGER.error("Trying to rebuild index"); + DatabaseIndexing.deleteAllIndexes(); + session.getService(IndexedRelations.class).fullRebuild(SubMonitor.convert(monitor, 100), session); + } + public static Term longTerm(String key, Long value) { BytesRef ref = new BytesRef(); NumericUtils.longToPrefixCoded( value, 0, ref );