Added resolution for plain EMF, all tests green
diff --git a/org.eclipse.opencert.elastic.test/src/org/eclipse/opencert/elastic/ElasticFinderTest.java b/org.eclipse.opencert.elastic.test/src/org/eclipse/opencert/elastic/ElasticFinderTest.java
index 2902440..142089b 100644
--- a/org.eclipse.opencert.elastic.test/src/org/eclipse/opencert/elastic/ElasticFinderTest.java
+++ b/org.eclipse.opencert.elastic.test/src/org/eclipse/opencert/elastic/ElasticFinderTest.java
@@ -55,7 +55,7 @@
ElasticClient client = ElasticClientImpl.on("localhost", 9200, "http")/*.delete("finder-test")*/.store(document);
ElasticFinder finder = ElasticFinderImpl.onClient(client);
- Set<Hit> hits = finder.search("finder-test", null, null);
+ Set<Hit> hits = finder.within("finder-test").search(null, null);
Assert.assertEquals(1, hits.size());
//
hits = finder.search("foobar", null);
diff --git a/org.eclipse.opencert.elastic.test/src/org/eclipse/opencert/elastic/HitResolutionTest.java b/org.eclipse.opencert.elastic.test/src/org/eclipse/opencert/elastic/HitResolutionTest.java
index 45f078f..d3d83ff 100644
--- a/org.eclipse.opencert.elastic.test/src/org/eclipse/opencert/elastic/HitResolutionTest.java
+++ b/org.eclipse.opencert.elastic.test/src/org/eclipse/opencert/elastic/HitResolutionTest.java
@@ -19,9 +19,12 @@
import org.eclipse.emf.ecore.EObject;
import org.eclipse.opencert.elastic.cdo.CDOObjectResolver;
import org.eclipse.opencert.elastic.search.DummyObjectResolver;
+import org.eclipse.opencert.elastic.search.EMFObjectResolver;
+import org.eclipse.opencert.elastic.search.ElasticFinder;
import org.eclipse.opencert.elastic.search.ElasticFinderImpl;
import org.eclipse.opencert.elastic.search.Hit;
import org.eclipse.opencert.elastic.search.HitResolution;
+import org.eclipse.opencert.elastic.search.ObjectResolver;
import org.junit.Assert;
import org.junit.Test;
@@ -29,14 +32,19 @@
@Test
public void testHitAndResolve() throws Exception {
+ testHitAndResolve(ElasticFinderImpl.onDummy(TestData.umlClasses()), new DummyObjectResolver());
+ testHitAndResolve(ElasticFinderImpl.onDefaultClient().within("uml"), new EMFObjectResolver());
+ }
+
+ private void testHitAndResolve(ElasticFinder finder, ObjectResolver<? extends Object> resolver) throws Exception {
Map<String, Object> filters = new HashMap<>();
filters.put("abstract", Boolean.FALSE);
filters.put("interface", Boolean.FALSE);
- Set<Hit> hits = ElasticFinderImpl.onDummy(TestData.uml()).search("Component", filters);
+ Set<Hit> hits = finder.search(".*Component.*", filters);
Assert.assertNotNull("set expected", hits);
Assert.assertEquals("2 hits expected", 2, hits.size());
- HitResolution<Object> res = HitResolution.on(TestData.uml()).using(new DummyObjectResolver());
+ HitResolution<Object> res = HitResolution.on(TestData.uml()).using(resolver);
Set<Object> resolved = res.resolve(hits, 2);
Assert.assertNotNull("set expected", resolved);
Assert.assertEquals("2 hits expected", 2, resolved.size());
diff --git a/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/EObjectToDocument.java b/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/EObjectToDocument.java
index aee7a62..9212ec1 100644
--- a/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/EObjectToDocument.java
+++ b/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/EObjectToDocument.java
@@ -17,10 +17,8 @@
import java.util.List;
import org.apache.commons.codec.digest.DigestUtils;
-import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.impl.EStringToStringMapEntryImpl;
import org.eclipse.emf.ecore.resource.Resource;
import com.google.gson.JsonObject;
diff --git a/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/EMFObjectResolver.java b/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/EMFObjectResolver.java
new file mode 100644
index 0000000..e643dec
--- /dev/null
+++ b/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/EMFObjectResolver.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (C) 2018 ANSYS medini Technologies AG
+ *
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * ANSYS medini Technologies AG - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.opencert.elastic.search;
+
+import java.util.Iterator;
+
+import org.apache.commons.codec.digest.DigestUtils;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+
+/**
+ * Generic {@link ObjectResolver} that tries to resolve against the object URI.
+ *
+ * @author mauersberger
+ *
+ */
+public class EMFObjectResolver implements ObjectResolver<EObject> {
+
+ @Override
+ public EObject resolve(String objectId, Object context) {
+ if (context instanceof Resource) {
+ context = ((Resource) context).getAllContents();
+ }
+
+ if (context instanceof Iterator) {
+ @SuppressWarnings("unchecked")
+ Iterator<Object> it = (Iterator<Object>) context;
+ while (it.hasNext()) {
+ Object next = (Object) it.next();
+ if (next instanceof EObject) {
+ EObject object = (EObject) next;
+ Resource resource = object.eResource();
+ if (resource != null && objectId.equals(DigestUtils.md5Hex(resource.getURIFragment(object)))) {
+ return object;
+ }
+ }
+ }
+ } else if (context instanceof Iterable) {
+ for (Object next : (Iterable<?>) context) {
+ if (next instanceof EObject) {
+ EObject object = (EObject) next;
+ Resource resource = object.eResource();
+ if (resource != null && objectId.equals(DigestUtils.md5Hex(resource.getURIFragment(object)))) {
+ return object;
+ }
+ }
+ }
+ }
+
+ // TODO Auto-generated method stub
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/ElasticFinder.java b/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/ElasticFinder.java
index a532ffb..ab49c42 100644
--- a/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/ElasticFinder.java
+++ b/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/ElasticFinder.java
@@ -36,16 +36,11 @@
Set<Hit> search(String query, Map<String, Object> filters);
/**
- * Search with the given query and additional attribute filters that must match.
+ * Limit this finder to the given index.
*
* @param index
* name of the index, or "_all" or <code>null</code> for all indexes
- * @param query
- * string following the Elastic query syntax (see
- * https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html)
- * @param filters
- * a set of filters, might be empty or <code>null</code>
- * @return zero or more hits, never <code>null</code>
+ * @return this
*/
- Set<Hit> search(String index, String query, Map<String, Object> filters);
+ ElasticFinder within(String index);
}
diff --git a/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/ElasticFinderImpl.java b/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/ElasticFinderImpl.java
index f9dfce9..2d27223 100644
--- a/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/ElasticFinderImpl.java
+++ b/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/ElasticFinderImpl.java
@@ -48,6 +48,8 @@
private RestClient client;
+ private String index = "_all";
+
@SuppressWarnings("unused")
private int lastStatus;
@@ -89,12 +91,13 @@
}
@Override
- public Set<Hit> search(String query, Map<String, Object> filters) {
- return search("_all", query, filters);
+ public ElasticFinder within(String index) {
+ this.index = (index != null ? index : "_all");
+ return this;
}
@Override
- public Set<Hit> search(String index, String query, Map<String, Object> filters) {
+ public Set<Hit> search(String query, Map<String, Object> filters) {
if (dummyData != null) {
return searchInDummyData(query, filters);
}
@@ -142,7 +145,6 @@
for (String key : keys) {
Object value = filters.get(key);
TermQueryBuilder termQuery = QueryBuilders.termQuery(key, value);
- // filterQueries.add(termQuery);
boolQuery.must(termQuery);
}
assert boolQuery.must().size() == 1 + filters.size();
@@ -155,7 +157,7 @@
SearchResponse response = highLevel.search(searchRequest);
lastStatus = response.status().getStatus();
-
+
Set<ElasticDocument> result = new HashSet<>();
SearchHits hits = response.getHits();
// Note: total hits might be much bigger
diff --git a/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/SampleApp.java b/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/SampleApp.java
index 9331e16..f752d45 100644
--- a/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/SampleApp.java
+++ b/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/SampleApp.java
@@ -48,13 +48,4 @@
Set<EObject> resolved = resolution.resolve(hits, 2);
System.out.println(resolved);
}
-
- class EMFObjectResolver implements ObjectResolver<EObject> {
-
- @Override
- public EObject resolve(String objectId, Object context) {
- // TODO Auto-generated method stub
- return null;
- }
- }
}