-package org.simantics.document.linking.function;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.HashSet;\r
-import java.util.List;\r
-import java.util.Set;\r
-\r
-import org.eclipse.core.runtime.IProgressMonitor;\r
-import org.simantics.databoard.Bindings;\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.common.utils.Logger;\r
-import org.simantics.db.common.utils.NameUtils;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.layer0.adapter.Instances;\r
-import org.simantics.document.linking.ontology.DocumentLink;\r
-import org.simantics.document.linking.utils.SourceLinkUtil;\r
-import org.simantics.scl.runtime.function.FunctionImpl5;\r
-import org.simantics.workbench.search.NamedResource;\r
-import org.simantics.workbench.search.SearchQuery;\r
-import org.simantics.workbench.search.SearchResult;\r
-import org.simantics.workbench.search.SearchResultColumn;\r
-import org.simantics.workbench.search.SearchResultRow;\r
-import org.simantics.workbench.search.StringUtil;\r
-\r
-public class SearchFunction extends FunctionImpl5<IProgressMonitor, ReadGraph, Resource, SearchQuery, Integer, SearchResult> {\r
-\r
- public static List<SearchResultColumn> columns;\r
- \r
- static {\r
- columns = new ArrayList<SearchResultColumn>();\r
- columns.add(new SearchResultColumn("Name"));\r
- columns.add(new SearchResultColumn("Comment"));\r
- columns.add(new SearchResultColumn("Part Of"));\r
- }\r
- \r
- @Override\r
- public SearchResult apply(IProgressMonitor monitor, ReadGraph graph, Resource model, SearchQuery query, Integer maxResults) {\r
- try {\r
- DocumentLink sl = DocumentLink.getInstance(graph);\r
- Instances instancesQuery = graph.adapt(sl.Source, Instances.class);\r
- Collection<Resource> found = instancesQuery.find(graph, model);\r
- return generateSearchResults(graph, found,query);\r
- } catch (DatabaseException e) {\r
- Logger.defaultLogError(e);\r
- }\r
- return null;\r
- }\r
- \r
- \r
- public static class NameComparator {\r
- private String name;\r
- int type = 0;\r
- \r
- public NameComparator(String query) {\r
- String parts[] = query.split(" OR ");\r
- for (String s : parts) {\r
- if (s.startsWith("Name:")) {\r
- name = s.substring(5);\r
- }\r
- }\r
- if (name == null)\r
- return;\r
- name = name.trim();\r
- boolean freeStart = false;\r
- boolean freeEnd = false;\r
- if (name.endsWith("*")) {\r
- name = name.substring(0,name.length()-1);\r
- freeEnd = true;\r
- }\r
- if (name.startsWith("*")) {\r
- name = name.substring(1,name.length());\r
- freeStart = true;\r
- }\r
- if (freeStart && freeEnd)\r
- type = 1;\r
- else if (freeStart)\r
- type = 2;\r
- else if (freeEnd)\r
- type = 3;\r
- name = name.toLowerCase();\r
- }\r
- \r
- public boolean compare(String s) {\r
- switch (type) {\r
- case 0:\r
- return s.toLowerCase().equals(name);\r
- case 1:\r
- return s.toLowerCase().contains(name);\r
- case 2:\r
- return s.toLowerCase().endsWith(name);\r
- case 3:\r
- return s.toLowerCase().startsWith(name);\r
- }\r
- return false;\r
- }\r
- }\r
- \r
- public static final SearchResult generateSearchResults(ReadGraph graph,\r
- Collection<Resource> results, SearchQuery query) throws DatabaseException {\r
- DocumentLink sl = DocumentLink.getInstance(graph);\r
-\r
- SearchResult result = new SearchResult(columns);\r
- Set<Resource> processed = new HashSet<Resource>();\r
-\r
- NameComparator c = new NameComparator(query.getQuery("Name"));\r
- \r
- for (Resource source : results) {\r
- // Prevent index corruption from producing duplicate results.\r
- if (!processed.add(source))\r
- continue;\r
- \r
- Resource reference = SourceLinkUtil.getReferredDocument(graph, source);\r
- if (!SourceLinkUtil.isValidReference(graph, reference)) {\r
- // TODO: searching removed references\r
- continue;\r
- }\r
-\r
- Resource parent = (Resource) graph.getSingleObject(source, sl.hasSource_Inverse);\r
- String name = NameUtils.getSafeLabel(graph,reference);\r
- if (name.length() == 0)\r
- name = NameUtils.getSafeName(graph, reference);\r
- \r
- if (!c.compare(name))\r
- continue;\r
- \r
- String parentName = NameUtils.getSafeLabel(graph, parent);\r
- if (parentName.length() == 0)\r
- parentName = NameUtils.getSafeName(graph, parent);\r
- \r
- if (graph.isInstanceOf(source, sl.FunctionalSource)) {\r
- Resource relation = graph.getSingleObject(source, sl.consernsRelation);\r
- String relationName = NameUtils.getSafeLabel(graph, relation);\r
- if (relationName.length() == 0)\r
- relationName = NameUtils.getSafeName(graph, relation);\r
- parentName = parentName +"#"+relationName;\r
- }\r
- \r
- DocumentLinkRow rst = new DocumentLinkRow();\r
- rst.resource = NamedResource.of(graph, reference, name);\r
- rst.parent = NamedResource.of(graph, parent,parentName);\r
- rst.comment = graph.getPossibleRelatedValue(source, sl.hasSourceComment,Bindings.STRING);\r
-\r
-// Collection<Resource> typeResources = graph.getTypes(reference);\r
-// Collection<Resource> principalTypeResources = graph.getPrincipalTypes(reference);\r
-// if (!typeResources.isEmpty()) {\r
-// rst.types = new ArrayList<NamedResource>(typeResources.size());\r
-// rst.principalTypes = new ArrayList<NamedResource>(principalTypeResources.size());\r
-// for (Resource t : typeResources) {\r
-// String oname = NameUtils.getSafeLabel(graph, t);\r
-// NamedResource nr = NamedResource.of(graph, t, oname);\r
-// rst.types.add(nr);\r
-// if (principalTypeResources.contains(t))\r
-// rst.principalTypes.add(nr);\r
-// }\r
-// }\r
-\r
- result.addRow(rst);\r
- }\r
- return result;\r
- }\r
- \r
- private static class DocumentLinkRow implements SearchResultRow {\r
- public NamedResource resource;\r
- public NamedResource parent;\r
- public String comment;\r
- @Override\r
- public String getContent(int column) {\r
- switch (column) {\r
- case 0:\r
- return "<a class=\"small\" href=\"resource:"+ resource.getResource() +"\"" + (resource.getUri() == null ? "" : " title=\""+resource.getUri()+"\">")+StringUtil.escape(resource.getName())+"</a>";\r
- case 1:\r
- if (comment != null)\r
- return comment;\r
- return "";\r
- case 2:\r
- if (parent != null)\r
- return "<a class=\"small\" href=\"resource:"+ parent.getResource() +"\"" + (parent.getUri() == null ? "" : " title=\""+parent.getUri()+"\">")+StringUtil.escape(parent.getName())+"</a>";\r
- return "";\r
- default:\r
- return "";\r
- }\r
- }\r
- }\r
- \r
-}\r
-\r
+package org.simantics.document.linking.function;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.simantics.databoard.Bindings;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.common.utils.Logger;
+import org.simantics.db.common.utils.NameUtils;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.layer0.adapter.Instances;
+import org.simantics.document.linking.ontology.DocumentLink;
+import org.simantics.document.linking.utils.SourceLinkUtil;
+import org.simantics.scl.runtime.function.FunctionImpl5;
+import org.simantics.workbench.search.NamedResource;
+import org.simantics.workbench.search.SearchQuery;
+import org.simantics.workbench.search.SearchResult;
+import org.simantics.workbench.search.SearchResultColumn;
+import org.simantics.workbench.search.SearchResultRow;
+import org.simantics.workbench.search.StringUtil;
+
+public class SearchFunction extends FunctionImpl5<IProgressMonitor, ReadGraph, Resource, SearchQuery, Integer, SearchResult> {
+
+ public static List<SearchResultColumn> columns;
+
+ static {
+ columns = new ArrayList<SearchResultColumn>();
+ columns.add(new SearchResultColumn("Name"));
+ columns.add(new SearchResultColumn("Comment"));
+ columns.add(new SearchResultColumn("Part Of"));
+ }
+
+ @Override
+ public SearchResult apply(IProgressMonitor monitor, ReadGraph graph, Resource model, SearchQuery query, Integer maxResults) {
+ try {
+ DocumentLink sl = DocumentLink.getInstance(graph);
+ Instances instancesQuery = graph.adapt(sl.Source, Instances.class);
+ Collection<Resource> found = instancesQuery.find(graph, model);
+ return generateSearchResults(graph, found,query);
+ } catch (DatabaseException e) {
+ Logger.defaultLogError(e);
+ }
+ return null;
+ }
+
+
+ public static class NameComparator {
+ private String name;
+ int type = 0;
+
+ public NameComparator(String query) {
+ String parts[] = query.split(" OR ");
+ for (String s : parts) {
+ if (s.startsWith("Name:")) {
+ name = s.substring(5);
+ }
+ }
+ if (name == null)
+ return;
+ name = name.trim();
+ boolean freeStart = false;
+ boolean freeEnd = false;
+ if (name.endsWith("*")) {
+ name = name.substring(0,name.length()-1);
+ freeEnd = true;
+ }
+ if (name.startsWith("*")) {
+ name = name.substring(1,name.length());
+ freeStart = true;
+ }
+ if (freeStart && freeEnd)
+ type = 1;
+ else if (freeStart)
+ type = 2;
+ else if (freeEnd)
+ type = 3;
+ name = name.toLowerCase();
+ }
+
+ public boolean compare(String s) {
+ switch (type) {
+ case 0:
+ return s.toLowerCase().equals(name);
+ case 1:
+ return s.toLowerCase().contains(name);
+ case 2:
+ return s.toLowerCase().endsWith(name);
+ case 3:
+ return s.toLowerCase().startsWith(name);
+ }
+ return false;
+ }
+ }
+
+ public static final SearchResult generateSearchResults(ReadGraph graph,
+ Collection<Resource> results, SearchQuery query) throws DatabaseException {
+ DocumentLink sl = DocumentLink.getInstance(graph);
+
+ SearchResult result = new SearchResult(columns);
+ Set<Resource> processed = new HashSet<Resource>();
+
+ NameComparator c = new NameComparator(query.getQuery("Name"));
+
+ for (Resource source : results) {
+ // Prevent index corruption from producing duplicate results.
+ if (!processed.add(source))
+ continue;
+
+ Resource reference = SourceLinkUtil.getReferredDocument(graph, source);
+ if (!SourceLinkUtil.isValidReference(graph, reference)) {
+ // TODO: searching removed references
+ continue;
+ }
+
+ Resource parent = (Resource) graph.getSingleObject(source, sl.hasSource_Inverse);
+ String name = NameUtils.getSafeLabel(graph,reference);
+ if (name.length() == 0)
+ name = NameUtils.getSafeName(graph, reference);
+
+ if (!c.compare(name))
+ continue;
+
+ String parentName = NameUtils.getSafeLabel(graph, parent);
+ if (parentName.length() == 0)
+ parentName = NameUtils.getSafeName(graph, parent);
+
+ if (graph.isInstanceOf(source, sl.FunctionalSource)) {
+ Resource relation = graph.getSingleObject(source, sl.consernsRelation);
+ String relationName = NameUtils.getSafeLabel(graph, relation);
+ if (relationName.length() == 0)
+ relationName = NameUtils.getSafeName(graph, relation);
+ parentName = parentName +"#"+relationName;
+ }
+
+ DocumentLinkRow rst = new DocumentLinkRow();
+ rst.resource = NamedResource.of(graph, reference, name);
+ rst.parent = NamedResource.of(graph, parent,parentName);
+ rst.comment = graph.getPossibleRelatedValue(source, sl.hasSourceComment,Bindings.STRING);
+
+// Collection<Resource> typeResources = graph.getTypes(reference);
+// Collection<Resource> principalTypeResources = graph.getPrincipalTypes(reference);
+// if (!typeResources.isEmpty()) {
+// rst.types = new ArrayList<NamedResource>(typeResources.size());
+// rst.principalTypes = new ArrayList<NamedResource>(principalTypeResources.size());
+// for (Resource t : typeResources) {
+// String oname = NameUtils.getSafeLabel(graph, t);
+// NamedResource nr = NamedResource.of(graph, t, oname);
+// rst.types.add(nr);
+// if (principalTypeResources.contains(t))
+// rst.principalTypes.add(nr);
+// }
+// }
+
+ result.addRow(rst);
+ }
+ return result;
+ }
+
+ private static class DocumentLinkRow implements SearchResultRow {
+ public NamedResource resource;
+ public NamedResource parent;
+ public String comment;
+ @Override
+ public String getContent(int column) {
+ switch (column) {
+ case 0:
+ return "<a class=\"small\" href=\"resource:"+ resource.getResource() +"\"" + (resource.getUri() == null ? "" : " title=\""+resource.getUri()+"\">")+StringUtil.escape(resource.getName())+"</a>";
+ case 1:
+ if (comment != null)
+ return comment;
+ return "";
+ case 2:
+ if (parent != null)
+ return "<a class=\"small\" href=\"resource:"+ parent.getResource() +"\"" + (parent.getUri() == null ? "" : " title=\""+parent.getUri()+"\">")+StringUtil.escape(parent.getName())+"</a>";
+ return "";
+ default:
+ return "";
+ }
+ }
+ }
+
+}
+