You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 09:56:21 UTC
[sling-org-apache-sling-nosql-mongodb-resourceprovider] 07/10:
SLING-4381/SLING-5024 for query efficiency on listChildren store parentPath
as separate attribute
This is an automated email from the ASF dual-hosted git repository.
rombert pushed a commit to annotated tag org.apache.sling.nosql.mongodb-resourceprovider-1.0.0
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-nosql-mongodb-resourceprovider.git
commit 90efe7a948cd458d663a94f3ccd0326d9589655a
Author: Stefan Seifert <ss...@apache.org>
AuthorDate: Thu Sep 17 06:00:21 2015 +0000
SLING-4381/SLING-5024 for query efficiency on listChildren store parentPath as separate attribute
git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/contrib/nosql/mongodb-resourceprovider@1703494 13f79535-47bb-0310-9956-ffa450edef68
---
pom.xml | 7 ----
.../resourceprovider/impl/MongoDBNoSqlAdapter.java | 42 ++++++++++++----------
2 files changed, 24 insertions(+), 25 deletions(-)
diff --git a/pom.xml b/pom.xml
index 1498704..26adc53 100644
--- a/pom.xml
+++ b/pom.xml
@@ -69,13 +69,6 @@
</dependency>
<dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-lang3</artifactId>
- <version>3.3.2</version>
- <scope>provided</scope>
- </dependency>
-
- <dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.testing.sling-mock</artifactId>
<version>1.5.0</version>
diff --git a/src/main/java/org/apache/sling/nosql/mongodb/resourceprovider/impl/MongoDBNoSqlAdapter.java b/src/main/java/org/apache/sling/nosql/mongodb/resourceprovider/impl/MongoDBNoSqlAdapter.java
index e1931d3..a25abd5 100644
--- a/src/main/java/org/apache/sling/nosql/mongodb/resourceprovider/impl/MongoDBNoSqlAdapter.java
+++ b/src/main/java/org/apache/sling/nosql/mongodb/resourceprovider/impl/MongoDBNoSqlAdapter.java
@@ -23,7 +23,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;
-import org.apache.commons.lang3.StringUtils;
+import org.apache.sling.api.resource.ResourceUtil;
import org.apache.sling.nosql.generic.adapter.AbstractNoSqlAdapter;
import org.apache.sling.nosql.generic.adapter.MultiValueMode;
import org.apache.sling.nosql.generic.adapter.NoSqlData;
@@ -44,8 +44,9 @@ import com.mongodb.client.result.UpdateResult;
*/
public final class MongoDBNoSqlAdapter extends AbstractNoSqlAdapter {
- private static final String ID_PROPERTY = "_id";
- private static final String DATA_PROPERTY = "_data";
+ private static final String PN_PATH = "_id";
+ private static final String PN_PARENT_PATH = "parentPath";
+ private static final String PN_DATA = "data";
private final MongoCollection<Document> collection;
@@ -61,25 +62,24 @@ public final class MongoDBNoSqlAdapter extends AbstractNoSqlAdapter {
@Override
public NoSqlData get(String path) {
- Document wrapper = collection.find(Filters.eq(ID_PROPERTY, path)).first();
- if (wrapper == null) {
+ Document envelope = collection.find(Filters.eq(PN_PATH, path)).first();
+ if (envelope == null) {
return null;
}
else {
- return new NoSqlData(path, wrapper.get(DATA_PROPERTY, Document.class), MultiValueMode.LISTS);
+ return new NoSqlData(path, envelope.get(PN_DATA, Document.class), MultiValueMode.LISTS);
}
}
@Override
public Iterator<NoSqlData> getChildren(String parentPath) {
List<NoSqlData> children = new ArrayList<>();
- Pattern directChildren = Pattern.compile("^" + Pattern.quote(StringUtils.removeEnd(parentPath, "/")) + "/[^/]+$");
- FindIterable<Document> result = collection.find(Filters.regex(ID_PROPERTY, directChildren));
- try (MongoCursor<Document> wrappers = result.iterator()) {
- while (wrappers.hasNext()) {
- Document wrapper = wrappers.next();
- String path = wrapper.get(ID_PROPERTY, String.class);
- Document data = wrapper.get(DATA_PROPERTY, Document.class);
+ FindIterable<Document> result = collection.find(Filters.eq(PN_PARENT_PATH, parentPath));
+ try (MongoCursor<Document> envelopes = result.iterator()) {
+ while (envelopes.hasNext()) {
+ Document envelope = envelopes.next();
+ String path = envelope.get(PN_PATH, String.class);
+ Document data = envelope.get(PN_DATA, Document.class);
children.add(new NoSqlData(path, data, MultiValueMode.LISTS));
}
}
@@ -88,11 +88,17 @@ public final class MongoDBNoSqlAdapter extends AbstractNoSqlAdapter {
@Override
public boolean store(NoSqlData data) {
- Document wrapper = new Document();
- wrapper.put(ID_PROPERTY, data.getPath());
- wrapper.put(DATA_PROPERTY, new Document(data.getProperties(MultiValueMode.LISTS)));
+ Document envelope = new Document();
+ envelope.put(PN_PATH, data.getPath());
+ envelope.put(PN_DATA, new Document(data.getProperties(MultiValueMode.LISTS)));
- UpdateResult result = collection.replaceOne(Filters.eq(ID_PROPERTY, data.getPath()), wrapper, new UpdateOptions().upsert(true));
+ // for list-children query efficiency store parent path as well
+ String parentPath = ResourceUtil.getParent(data.getPath());
+ if (parentPath != null) {
+ envelope.put(PN_PARENT_PATH, parentPath);
+ }
+
+ UpdateResult result = collection.replaceOne(Filters.eq(PN_PATH, data.getPath()), envelope, new UpdateOptions().upsert(true));
// return true if a new entry was inserted, false if an existing was replaced
return (result.getMatchedCount() == 0);
@@ -101,7 +107,7 @@ public final class MongoDBNoSqlAdapter extends AbstractNoSqlAdapter {
@Override
public boolean deleteRecursive(String path) {
Pattern descendantsAndSelf = Pattern.compile("^" + Pattern.quote(path) + "(/.+)?$");
- DeleteResult result = collection.deleteMany(Filters.regex(ID_PROPERTY, descendantsAndSelf));
+ DeleteResult result = collection.deleteMany(Filters.regex(PN_PATH, descendantsAndSelf));
// return true if any document was deleted
return result.getDeletedCount() > 0;
--
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.