diff --git a/janusgraph-backend-testutils/src/main/java/org/janusgraph/graphdb/JanusGraphIndexTest.java b/janusgraph-backend-testutils/src/main/java/org/janusgraph/graphdb/JanusGraphIndexTest.java index 060f6f86ef..32a37d02be 100644 --- a/janusgraph-backend-testutils/src/main/java/org/janusgraph/graphdb/JanusGraphIndexTest.java +++ b/janusgraph-backend-testutils/src/main/java/org/janusgraph/graphdb/JanusGraphIndexTest.java @@ -1550,6 +1550,15 @@ public void testDualMapping() { 1, new boolean[]{true, true}, "mixed"); evaluateQuery(tx.query().has("name", Text.CONTAINS_FUZZY, "Midle"), ElementCategory.VERTEX, 1, new boolean[]{true, true}, "mixed"); + evaluateQuery(tx.query().orderBy("name", asc), ElementCategory.VERTEX, + 3, new boolean[]{false, false}, tx.getPropertyKey("name"), Order.ASC); + evaluateQuery(tx.query().orderBy("name", desc), ElementCategory.VERTEX, + 3, new boolean[]{false, false}, tx.getPropertyKey("name"), Order.DESC); + evaluateQuery(tx.query().has("name", Text.CONTAINS, "Long").orderBy("name", asc), ElementCategory.VERTEX, + 2, new boolean[]{true, true}, tx.getPropertyKey("name"), Order.ASC, "mixed"); + evaluateQuery(tx.query().has("name", Text.CONTAINS, "Long").orderBy("name", desc), ElementCategory.VERTEX, + 2, new boolean[]{true, true}, tx.getPropertyKey("name"), Order.DESC, "mixed"); + for (final Vertex u : tx.getVertices()) { final String n = u.value("name"); if (n.endsWith("Don")) { diff --git a/janusgraph-es/src/main/java/org/janusgraph/diskstorage/es/ElasticSearchIndex.java b/janusgraph-es/src/main/java/org/janusgraph/diskstorage/es/ElasticSearchIndex.java index 85c270d941..b7c14a0f04 100644 --- a/janusgraph-es/src/main/java/org/janusgraph/diskstorage/es/ElasticSearchIndex.java +++ b/janusgraph-es/src/main/java/org/janusgraph/diskstorage/es/ElasticSearchIndex.java @@ -1225,7 +1225,8 @@ private void addOrderToQuery(KeyInformation.IndexRetriever informations, Elastic final KeyInformation information = informations.get(store).get(orderEntry.getKey()); final Mapping mapping = Mapping.getMapping(information); final Class datatype = orderEntry.getDatatype(); - sr.addSort(orderEntry.getKey(), order.toLowerCase(), convertToEsDataType(datatype, mapping)); + final String key = hasDualStringMapping(information) ? getDualMappingName(orderEntry.getKey()) : orderEntry.getKey(); + sr.addSort(key, order.toLowerCase(), convertToEsDataType(datatype, mapping)); } } diff --git a/janusgraph-es/src/test/java/org/janusgraph/diskstorage/es/ElasticsearchIndexTest.java b/janusgraph-es/src/test/java/org/janusgraph/diskstorage/es/ElasticsearchIndexTest.java index 9d3d6b8025..8e84bfd8b6 100644 --- a/janusgraph-es/src/test/java/org/janusgraph/diskstorage/es/ElasticsearchIndexTest.java +++ b/janusgraph-es/src/test/java/org/janusgraph/diskstorage/es/ElasticsearchIndexTest.java @@ -16,6 +16,7 @@ import com.google.common.base.Throwables; import com.google.common.collect.HashMultimap; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; import org.apache.commons.configuration.BaseConfiguration; @@ -43,6 +44,7 @@ import org.janusgraph.diskstorage.indexing.*; import org.janusgraph.core.schema.Mapping; import org.janusgraph.graphdb.configuration.GraphDatabaseConfiguration; +import org.janusgraph.graphdb.internal.Order; import org.janusgraph.graphdb.query.condition.PredicateCondition; import org.janusgraph.graphdb.types.ParameterType; import org.json.simple.JSONObject; @@ -405,6 +407,32 @@ public void testTextStringMapping() throws Exception { assertEquals(2, tx.queryStream(new IndexQuery("vertex", PredicateCondition.of(TEXT_STRING, Text.CONTAINS, "John"))).count()); } + @Test + public void testTextStringSort() throws Exception { + initialize("vertex"); + + Multimap firstDoc = HashMultimap.create(); + firstDoc.put(TEXT_STRING, "John Doe"); + + Multimap secondDoc = HashMultimap.create(); + secondDoc.put(TEXT_STRING, "Jane Doe"); + + add("vertex", "test1", firstDoc, true); + add("vertex", "test2", secondDoc, true); + + clopen(); + + Object[] result = tx.queryStream(new IndexQuery("vertex", PredicateCondition.of(TEXT_STRING, Text.CONTAINS, "Doe"), + ImmutableList.of(new IndexQuery.OrderEntry(TEXT_STRING, Order.ASC, String.class)))).toArray(); + assertEquals("test2", result[0]); + assertEquals("test1", result[1]); + + result = tx.queryStream(new IndexQuery("vertex", PredicateCondition.of(TEXT_STRING, Text.CONTAINS, "Doe"), + ImmutableList.of(new IndexQuery.OrderEntry(TEXT_STRING, Order.DESC, String.class)))).toArray(); + assertEquals("test1", result[0]); + assertEquals("test2", result[1]); + } + @Test public void testShouldNotShareIndexStoreNameCacheBetweenElasticSearchIndexInstances() throws BackendException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { final String index1 = "es1";