From 7d49b57332beee45b09bb2b6ca998a8768e6b064 Mon Sep 17 00:00:00 2001 From: liningrui Date: Wed, 27 Mar 2019 14:57:45 +0800 Subject: [PATCH] Combine two methods into doIndexQuery Change-Id: Iba5c32d39de390374a5492c8c15089c0f530a16a --- .../hugegraph/backend/page/IdHolder.java | 15 ++-- .../hugegraph/backend/page/IdHolderList.java | 2 +- .../hugegraph/backend/page/QueryList.java | 4 +- .../backend/tx/GraphIndexTransaction.java | 81 ++++++++----------- 4 files changed, 45 insertions(+), 57 deletions(-) diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/page/IdHolder.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/page/IdHolder.java index 5f1c095940..41bcebabda 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/page/IdHolder.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/page/IdHolder.java @@ -25,6 +25,8 @@ import com.baidu.hugegraph.backend.id.Id; import com.baidu.hugegraph.backend.query.ConditionQuery; import com.baidu.hugegraph.util.E; +import com.baidu.hugegraph.util.InsertionOrderUtil; +import com.google.common.collect.ImmutableSet; public final class IdHolder { @@ -35,23 +37,26 @@ public final class IdHolder { private Set ids; /** - * For non-paged situation + * For non-paging situation */ public IdHolder(Set ids) { this.query = null; this.idsFetcher = null; this.exhausted = false; - this.ids = ids; + if (ids instanceof ImmutableSet) { + this.ids = InsertionOrderUtil.newSet(ids); + } else { + this.ids = ids; + } } /** - * For paged situation + * For paging situation */ public IdHolder(ConditionQuery query, Function idsFetcher) { E.checkArgument(query.paging(), - "Query '%s' must carry the page info in paged mode", - query); + "Query '%s' must include page info", query); this.query = query.copy(); this.idsFetcher = idsFetcher; this.exhausted = false; diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/page/IdHolderList.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/page/IdHolderList.java index c01455b25f..98c8428233 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/page/IdHolderList.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/page/IdHolderList.java @@ -40,7 +40,7 @@ public boolean paging() { public boolean add(IdHolder holder) { E.checkArgument(this.paging == holder.paging(), "The IdHolder to be linked must be " + - "IdHolder in same paging mode"); + "in same paging mode"); if (this.paging || this.isEmpty()) { super.add(holder); } else { diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/page/QueryList.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/page/QueryList.java index 61d92453b9..d7f6ba78e6 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/page/QueryList.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/page/QueryList.java @@ -149,13 +149,13 @@ private static Set limit(Set ids, Query query) { private interface QueryHolder { /** - * For non-paged situation + * For non-paging situation * @return BackendEntry iterator */ public Iterator iterator(); /** - * For paged situation + * For paging situation * @param index position IdHolder(Query) * @param page set query page * @param pageSize set query page size 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 f233bd663c..640ffe581d 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 @@ -289,12 +289,7 @@ private List queryByLabel(ConditionQuery query) { indexQuery.offset(query.offset()); indexQuery.capacity(query.capacity()); - IdHolder idHolder; - if (query.paging()) { - idHolder = this.doIndexQueryInPage(il, indexQuery); - } else { - idHolder = this.doIndexQuery(il, indexQuery); - } + IdHolder idHolder = this.doIndexQuery(il, indexQuery); List holders = new IdHolderList(query.paging()); holders.add(idHolder); return holders; @@ -321,7 +316,7 @@ private List queryByUserprop(ConditionQuery query) { long idsSize = 0; for (MatchedIndex index : indexes) { if (paging && index.indexLabels().size() > 1) { - throw new NotSupportException("joint index query in page mode"); + throw new NotSupportException("joint index query in paging"); } if (index.containsSearchIndex()) { @@ -351,7 +346,7 @@ private List doSearchIndex(ConditionQuery query, IndexQueries queries = index.constructIndexQueries(q); assert !query.paging() || queries.size() <= 1; IdHolder holder = this.doIndexQueries(queries); - // NOTE: ids will be merged into one IdHolder if not in paging mode + // NOTE: ids will be merged into one IdHolder if not in paging holders.add(holder); } return holders; @@ -372,11 +367,7 @@ private IdHolder doSingleOrCompositeIndex(IndexQueries queries) { Map.Entry e = queries.one(); IndexLabel indexLabel = e.getKey(); ConditionQuery query = e.getValue(); - if (query.paging()) { - return this.doIndexQueryInPage(indexLabel, query); - } else { - return this.doIndexQuery(indexLabel, query); - } + return this.doIndexQuery(indexLabel, query); } @Watched(prefix = "index") @@ -454,8 +445,20 @@ private boolean needIndexForLabel() { } @Watched(prefix = "index") - private IdHolder doIndexQuery(IndexLabel indexLabel, - ConditionQuery query) { + private IdHolder doIndexQuery(IndexLabel indexLabel, ConditionQuery query) { + if (!query.paging()) { + PageIds pageIds = this.doIndexQueryOnce(indexLabel, query); + return new IdHolder(pageIds.ids()); + } else { + return new IdHolder(query, (q) -> { + return this.doIndexQueryOnce(indexLabel, q); + }); + } + } + + @Watched(prefix = "index") + private PageIds doIndexQueryOnce(IndexLabel indexLabel, + ConditionQuery query) { LockUtil.Locks locks = new LockUtil.Locks(this.graph().name()); try { locks.lockReads(LockUtil.INDEX_LABEL_DELETE, indexLabel.id()); @@ -471,45 +474,25 @@ private IdHolder doIndexQuery(IndexLabel indexLabel, break; } } - return new IdHolder(ids); + // If there is no data, the entries is not a Metadatable object + if (ids.isEmpty()) { + return PageIds.EMPTY; + } + // NOTE: Memory backend's iterator is not Metadatable + if (!query.paging()) { + return new PageIds(ids, null); + } + E.checkState(entries instanceof Metadatable, + "The entries must be Metadatable when query " + + "in paging, but got '%s'", + entries.getClass().getName()); + Object page = ((Metadatable) entries).metadata("page"); + return new PageIds(ids, (String) page); } finally { locks.unlock(); } } - @Watched(prefix = "index") - private IdHolder doIndexQueryInPage(IndexLabel indexLabel, - ConditionQuery query) { - return new IdHolder(query, (q) -> { - LockUtil.Locks locks = new LockUtil.Locks(this.graph().name()); - try { - locks.lockReads(LockUtil.INDEX_LABEL_DELETE, indexLabel.id()); - locks.lockReads(LockUtil.INDEX_LABEL_REBUILD, indexLabel.id()); - - Set ids = InsertionOrderUtil.newSet(); - Iterator entries = super.query(q); - while (entries.hasNext()) { - HugeIndex index = this.serializer.readIndex(graph(), q, - entries.next()); - ids.addAll(index.elementIds()); - } - // If there is no data, the entries is not a Metadatable object - if (ids.isEmpty()) { - return PageIds.EMPTY; - } - - E.checkState(entries instanceof Metadatable, - "The entries must be Metadatable when query " + - "in paging, but got '%s'", - entries.getClass().getName()); - Object page = ((Metadatable) entries).metadata("page"); - return new PageIds(ids, (String) page); - } finally { - locks.unlock(); - } - }); - } - @Watched(prefix = "index") private Set collectMatchedIndexes(ConditionQuery query) { SchemaTransaction schema = this.graph().schemaTransaction();