From 8a5ab7b4dfbdea308b5cd182777e54b7daa6b290 Mon Sep 17 00:00:00 2001 From: zhangyi51 Date: Thu, 13 Dec 2018 20:21:46 +0800 Subject: [PATCH] fix bug left-index-remove can't handle has none-flatten query fixed: #280 Change-Id: I90fe4af3491b57fe7632dcc533df703b725dbd7e --- .../hugegraph/backend/tx/GraphIndexTransaction.java | 11 ++++++----- .../baidu/hugegraph/backend/tx/GraphTransaction.java | 8 +++++++- .../main/java/com/baidu/hugegraph/util/LockUtil.java | 2 +- .../java/com/baidu/hugegraph/core/VertexCoreTest.java | 7 +------ 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/tx/GraphIndexTransaction.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/tx/GraphIndexTransaction.java index b99596b51e..ede4b829ec 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/tx/GraphIndexTransaction.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/tx/GraphIndexTransaction.java @@ -89,11 +89,12 @@ protected void removeIndexLeft(ConditionQuery query, HugeElement element) { } // TODO: remove left index in async thread - // Process range index - this.processRangeIndexLeft(query, element); - // Process secondary index or search index - this.processSecondaryOrSearchIndexLeft(query, element); - + for (ConditionQuery cq: ConditionQueryFlatten.flatten(query)) { + // Process range index + this.processRangeIndexLeft(cq, element); + // Process secondary index or search index + this.processSecondaryOrSearchIndexLeft(cq, element); + } this.commit(); } diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/tx/GraphTransaction.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/tx/GraphTransaction.java index 5012038999..e81d7946b5 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/tx/GraphTransaction.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/tx/GraphTransaction.java @@ -312,6 +312,7 @@ public Iterator query(Query query) { } List queries = new ArrayList<>(); + IdQuery ids = new IdQuery(query.resultType(), query); for (ConditionQuery cq: ConditionQueryFlatten.flatten( (ConditionQuery) query)) { Query q = this.optimizeQuery(cq); @@ -320,13 +321,18 @@ public Iterator query(Query query) { * 1.sysprop-query, which would not be empty. * 2.index-query result(ids after optimization), which may be empty. */ - if (!q.empty()) { + if (q.getClass() == IdQuery.class && !q.ids().isEmpty()) { + ids.query(q.ids()); + } else if (!q.empty()) { // Return empty if there is no result after index-query queries.add(q); } } ExtendableIterator rs = new ExtendableIterator<>(); + if (!ids.empty()) { + queries.add(ids); + } for (Query q : queries) { rs.extend(super.query(q)); } diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/util/LockUtil.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/util/LockUtil.java index ec9cbe8812..25dfdd4307 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/util/LockUtil.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/util/LockUtil.java @@ -240,8 +240,8 @@ public void lockReads(String group, Id... locks) { // NOTE: when used in multi-threads, should add `synchronized` public void lockReads(String group, Collection locks) { List newLocks = new ArrayList<>(locks.size()); + Set locked = locksOfGroup(group); for (Id lock : locks) { - Set locked = locksOfGroup(group); if (!locked.contains(lock)) { newLocks.add(lock); } diff --git a/hugegraph-test/src/main/java/com/baidu/hugegraph/core/VertexCoreTest.java b/hugegraph-test/src/main/java/com/baidu/hugegraph/core/VertexCoreTest.java index 90a15c34cf..2e282f365e 100644 --- a/hugegraph-test/src/main/java/com/baidu/hugegraph/core/VertexCoreTest.java +++ b/hugegraph-test/src/main/java/com/baidu/hugegraph/core/VertexCoreTest.java @@ -1566,18 +1566,13 @@ public void testQueryWithMultiLayerConditions() { .and(P.lt(29).or(P.eq(35)).or(P.gt(45))) ).values("name").toList(); - Assert.assertEquals(5, vertices.size()); + Assert.assertEquals(4, vertices.size()); Set names = ImmutableSet.of("Hebe", "James", "Tom Cat", "Lisa"); - int numJames = 0; for (Object name : vertices) { Assert.assertTrue(names.contains(name)); - if (name.equals("James")) { - numJames++; - } } - Assert.assertEquals(2, numJames); } @Test