You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ju...@apache.org on 2012/09/17 14:54:06 UTC
svn commit: r1386591 [5/7] - in /jackrabbit/oak/trunk: ./ oak-mongomk-api/
oak-mongomk-api/src/ oak-mongomk-api/src/main/
oak-mongomk-api/src/main/java/ oak-mongomk-api/src/main/java/org/
oak-mongomk-api/src/main/java/org/apache/ oak-mongomk-api/src/ma...
Added: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodeByPathQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodeByPathQuery.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodeByPathQuery.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodeByPathQuery.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.mongomk.query;
+
+import java.util.List;
+
+import org.apache.jackrabbit.mongomk.MongoConnection;
+import org.apache.jackrabbit.mongomk.model.NodeMongo;
+
+import com.mongodb.DBCollection;
+import com.mongodb.DBObject;
+import com.mongodb.QueryBuilder;
+
+/**
+ * An query for fetching a node by a given path.
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public class FetchNodeByPathQuery extends AbstractQuery<NodeMongo> {
+
+ private final String path;
+ private long revisionId;
+ private boolean fetchAll;
+
+ /**
+ * Constructs a new {@code FetchNodeByPathQuery}.
+ *
+ * @param mongoConnection The {@link MongoConnection}.
+ * @param path The path.
+ */
+ public FetchNodeByPathQuery(MongoConnection mongoConnection, String path) {
+ this(mongoConnection, path, 0);
+ }
+
+ /**
+ * Constructs a new {@code FetchNodeByPathQuery}.
+ *
+ * @param mongoConnection
+ * The {@link MongoConnection}.
+ * @param path
+ * The path.
+ * @param revisionId
+ * The revision id.
+ */
+ public FetchNodeByPathQuery(MongoConnection mongoConnection, String path, long revisionId) {
+ super(mongoConnection);
+
+ this.path = path;
+ this.revisionId = revisionId;
+ }
+
+ public void setFetchAll(boolean fetchAll) {
+ this.fetchAll = fetchAll;
+ }
+
+ @Override
+ public NodeMongo execute() {
+ if (!revisionIdExists()) {
+ throw new RuntimeException("Revision id '" + revisionId + "' is not valid.");
+ }
+
+ DBCollection nodeCollection = mongoConnection.getNodeCollection();
+ QueryBuilder queryBuilder = QueryBuilder.start(NodeMongo.KEY_PATH).is(path);
+ if (revisionId > 0) {
+ queryBuilder = queryBuilder.and(NodeMongo.KEY_REVISION_ID).is(revisionId);
+ }
+ DBObject query = queryBuilder.get();
+
+ DBObject filter = null;
+ if (!fetchAll) {
+ QueryBuilder filterBuilder = QueryBuilder.start(NodeMongo.KEY_REVISION_ID).is(1);
+ filterBuilder.and(NodeMongo.KEY_CHILDREN).is(1);
+ filter = filterBuilder.get();
+ }
+
+ NodeMongo nodeMongo = (NodeMongo) nodeCollection.findOne(query, filter);
+
+ return nodeMongo;
+ }
+
+ private boolean revisionIdExists() {
+ if (revisionId == 0) {
+ return true;
+ }
+ FetchValidRevisionsQuery query = new FetchValidRevisionsQuery(mongoConnection, String.valueOf(Long.MAX_VALUE));
+ List<Long> revisionIds = query.execute();
+ return revisionIds.contains(revisionId);
+ }
+}
Propchange: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodeByPathQuery.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodesByPathAndDepthQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodesByPathAndDepthQuery.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodesByPathAndDepthQuery.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodesByPathAndDepthQuery.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,120 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.mongomk.query;
+
+import java.util.List;
+import java.util.regex.Pattern;
+
+import org.apache.jackrabbit.mongomk.MongoConnection;
+import org.apache.jackrabbit.mongomk.model.NodeMongo;
+import org.apache.jackrabbit.mongomk.util.MongoUtil;
+import org.apache.log4j.Logger;
+
+import com.mongodb.DBCollection;
+import com.mongodb.DBCursor;
+import com.mongodb.DBObject;
+import com.mongodb.QueryBuilder;
+
+/**
+ * An query for fetching nodes by path and depth.
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public class FetchNodesByPathAndDepthQuery extends AbstractQuery<List<NodeMongo>> {
+ private static final Logger LOG = Logger.getLogger(FetchNodesByPathAndDepthQuery.class);
+ private final int depth;
+ private final String path;
+ private final String revisionId;
+
+ /**
+ * Constructs a new {@code FetchNodesByPathAndDepthQuery}.
+ *
+ * @param mongoConnection
+ * The {@link MongoConnection}.
+ * @param path
+ * The path.
+ * @param revisionId
+ * The revision id.
+ * @param depth
+ * The depth.
+ */
+ public FetchNodesByPathAndDepthQuery(MongoConnection mongoConnection, String path, String revisionId, int depth) {
+ super(mongoConnection);
+ this.path = path;
+ this.revisionId = revisionId;
+ this.depth = depth;
+ }
+
+ @Override
+ public List<NodeMongo> execute() {
+ Pattern pattern = createPrefixRegExp();
+ List<Long> validRevisions = fetchValidRevisions(mongoConnection, revisionId);
+
+ DBCursor dbCursor = performQuery(pattern);
+ List<NodeMongo> nodes = QueryUtils.convertToNodes(dbCursor, validRevisions);
+
+ return nodes;
+ }
+
+ private Pattern createPrefixRegExp() {
+ StringBuilder sb = new StringBuilder();
+
+ if (depth < 0) {
+ sb.append("^");
+ sb.append(path);
+ }
+ if (depth == 0) {
+ sb.append("^");
+ sb.append(path);
+ sb.append("$");
+ } else if (depth > 0) {
+ sb.append("^");
+ if (!"/".equals(path)) {
+ sb.append(path);
+ }
+ sb.append("(/[^/]*)");
+ sb.append("{0,");
+ sb.append(depth);
+ sb.append("}$");
+ }
+
+ Pattern pattern = Pattern.compile(sb.toString());
+
+ return pattern;
+ }
+
+ private List<Long> fetchValidRevisions(MongoConnection mongoConnection, String revisionId) {
+ return new FetchValidRevisionsQuery(mongoConnection, revisionId).execute();
+ }
+
+ private DBCursor performQuery(Pattern pattern) {
+ DBCollection nodeCollection = mongoConnection.getNodeCollection();
+
+ QueryBuilder qb = QueryBuilder.start(NodeMongo.KEY_PATH).regex(pattern);
+ if (revisionId != null) {
+ qb = qb.and(NodeMongo.KEY_REVISION_ID).lessThanEquals(MongoUtil.toMongoRepresentation(revisionId));
+ }
+
+ DBObject query = qb.get();
+
+ LOG.debug(String.format("Executing query: %s", query));
+
+ DBCursor dbCursor = nodeCollection.find(query);
+
+ return dbCursor;
+ }
+}
Propchange: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodesByPathAndDepthQuery.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodesForRevisionQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodesForRevisionQuery.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodesForRevisionQuery.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodesForRevisionQuery.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.mongomk.query;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.jackrabbit.mongomk.MongoConnection;
+import org.apache.jackrabbit.mongomk.model.NodeMongo;
+import org.apache.jackrabbit.mongomk.util.MongoUtil;
+import org.apache.log4j.Logger;
+
+import com.mongodb.DBCollection;
+import com.mongodb.DBCursor;
+import com.mongodb.DBObject;
+import com.mongodb.QueryBuilder;
+
+/**
+ * An query for fetching nodes for a specific revision.
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public class FetchNodesForRevisionQuery extends AbstractQuery<List<NodeMongo>> {
+ private static final Logger LOG = Logger.getLogger(FetchNodesForRevisionQuery.class);
+ private final Set<String> paths;
+ private final String revisionId;
+
+ /**
+ * Constructs a new {@code FetchNodesForRevisionQuery}.
+ *
+ * @param mongoConnection
+ * The {@link MongoConnection}.
+ * @param paths
+ * The paths to fetch.
+ * @param revisionId
+ * The revision id.
+ */
+ public FetchNodesForRevisionQuery(MongoConnection mongoConnection, Set<String> paths, String revisionId) {
+ super(mongoConnection);
+ this.paths = paths;
+ this.revisionId = revisionId;
+ }
+
+ /**
+ * Constructs a new {@code FetchNodesForRevisionQuery}.
+ *
+ * @param mongoConnection
+ * The {@link MongoConnection}.
+ * @param paths
+ * The paths to fetch.
+ * @param revisionId
+ * The revision id.
+ */
+ public FetchNodesForRevisionQuery(MongoConnection mongoConnection, String[] paths, String revisionId) {
+ this(mongoConnection, new HashSet<String>(Arrays.asList(paths)), revisionId);
+ }
+
+ @Override
+ public List<NodeMongo> execute() {
+ List<Long> validRevisions = fetchValidRevisions(mongoConnection, revisionId);
+
+ DBCursor dbCursor = retrieveAllNodes();
+ List<NodeMongo> nodes = QueryUtils.convertToNodes(dbCursor, validRevisions);
+
+ return nodes;
+ }
+
+ private List<Long> fetchValidRevisions(MongoConnection mongoConnection, String revisionId) {
+ return new FetchValidRevisionsQuery(mongoConnection, revisionId).execute();
+ }
+
+ private DBCursor retrieveAllNodes() {
+ DBCollection nodeCollection = mongoConnection.getNodeCollection();
+ DBObject query = QueryBuilder.start(NodeMongo.KEY_PATH).in(paths).and(NodeMongo.KEY_REVISION_ID)
+ .lessThanEquals(MongoUtil.toMongoRepresentation(revisionId)).get();
+
+ LOG.debug(String.format("Executing query: %s", query));
+
+ DBCursor dbCursor = nodeCollection.find(query);
+
+ return dbCursor;
+ }
+}
Propchange: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchNodesForRevisionQuery.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchValidCommitsQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchValidCommitsQuery.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchValidCommitsQuery.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchValidCommitsQuery.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.mongomk.query;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.jackrabbit.mongomk.MongoConnection;
+import org.apache.jackrabbit.mongomk.model.CommitMongo;
+import org.apache.jackrabbit.mongomk.util.MongoUtil;
+import org.apache.log4j.Logger;
+
+import com.mongodb.DBCollection;
+import com.mongodb.DBCursor;
+import com.mongodb.DBObject;
+import com.mongodb.QueryBuilder;
+
+/**
+ * An query for fetching valid commits.
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public class FetchValidCommitsQuery extends AbstractQuery<List<CommitMongo>> {
+
+ private static final int LIMITLESS = 0;
+ private static final Logger LOG = Logger.getLogger(FetchValidCommitsQuery.class);
+
+ private final String fromRevisionId;
+ private String toRevisionId;
+ private int maxEntries = LIMITLESS;
+
+ /**
+ * Constructs a new {link FetchValidCommitsQuery}.
+ *
+ * @param mongoConnection Mongo connection.
+ * @param fromRevisionId From revision id.
+ */
+ public FetchValidCommitsQuery(MongoConnection mongoConnection, String toRevisionId) {
+ this(mongoConnection, null, toRevisionId);
+ }
+
+ /**
+ * Constructs a new {@link FetchValidCommitsQuery}
+ *
+ * @param mongoConnection Mongo connection.
+ * @param fromRevisionId From revision id.
+ * @param toRevisionId To revision id.
+ */
+ public FetchValidCommitsQuery(MongoConnection mongoConnection, String fromRevisionId,
+ String toRevisionId) {
+ super(mongoConnection);
+ this.fromRevisionId = fromRevisionId;
+ this.toRevisionId = toRevisionId;
+ }
+
+ /**
+ * FIXME - Maybe this should be removed.
+ *
+ * Constructs a new {@link FetchValidCommitsQuery}.
+ *
+ * @param mongoConnection The {@link MongoConnection}.
+ * @param maxEntries Max number of entries that should be fetched.
+ */
+ public FetchValidCommitsQuery(MongoConnection mongoConnection, int maxEntries) {
+ super(mongoConnection);
+ fromRevisionId = null;
+ toRevisionId = String.valueOf(Integer.MAX_VALUE);
+ this.maxEntries = maxEntries;
+ }
+
+ @Override
+ public List<CommitMongo> execute() {
+ DBCursor dbCursor = fetchListOfValidCommits();
+ List<CommitMongo> commits = convertToCommits(dbCursor);
+
+ return commits;
+ }
+
+ private List<CommitMongo> convertToCommits(DBCursor dbCursor) {
+ Map<Long, CommitMongo> revisions = new HashMap<Long, CommitMongo>();
+ while (dbCursor.hasNext()) {
+ CommitMongo commitMongo = (CommitMongo) dbCursor.next();
+ revisions.put(commitMongo.getRevisionId(), commitMongo);
+ }
+
+ List<CommitMongo> validCommits = new LinkedList<CommitMongo>();
+ if (revisions.isEmpty()) {
+ return validCommits;
+ }
+
+ Long currentRevision = MongoUtil.toMongoRepresentation(toRevisionId);
+ if (!revisions.containsKey(currentRevision)) {
+ currentRevision = Collections.max(revisions.keySet());
+ }
+
+ while (true) {
+ CommitMongo commitMongo = revisions.get(currentRevision);
+ validCommits.add(commitMongo);
+ Long baseRevision = commitMongo.getBaseRevisionId();
+ Long fromRevision = MongoUtil.toMongoRepresentation(fromRevisionId);
+ if ((currentRevision == 0L) || (baseRevision == null || baseRevision < fromRevision)) {
+ break;
+ }
+
+ currentRevision = baseRevision;
+ }
+
+ LOG.debug(String.format("Found list of valid revisions for max revision %s: %s", toRevisionId, validCommits));
+
+ return validCommits;
+ }
+
+ private DBCursor fetchListOfValidCommits() {
+ DBCollection commitCollection = mongoConnection.getCommitCollection();
+ DBObject query = QueryBuilder.start(CommitMongo.KEY_FAILED).notEquals(Boolean.TRUE)
+ .and(CommitMongo.KEY_REVISION_ID).lessThanEquals(MongoUtil.toMongoRepresentation(toRevisionId))
+ .get();
+
+ LOG.debug(String.format("Executing query: %s", query));
+
+ return commitCollection.find(query).limit(maxEntries);
+ }
+}
Propchange: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchValidCommitsQuery.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchValidRevisionsQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchValidRevisionsQuery.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchValidRevisionsQuery.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchValidRevisionsQuery.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.mongomk.query;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.jackrabbit.mongomk.MongoConnection;
+import org.apache.jackrabbit.mongomk.model.CommitMongo;
+
+
+/**
+ * An query for fetching valid revisions.
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public class FetchValidRevisionsQuery extends AbstractQuery<List<Long>> {
+
+ private final String maxRevisionId;
+
+ /**
+ * Constructs a new {@code FetchValidRevisionsQuery}.
+ *
+ * @param mongoConnection
+ * The {@link MongoConnection}.
+ * @param maxRevisionId
+ * The max revision id which should be fetched.
+ */
+ public FetchValidRevisionsQuery(MongoConnection mongoConnection, String maxRevisionId) {
+ super(mongoConnection);
+ this.maxRevisionId = maxRevisionId;
+ }
+
+ @Override
+ public List<Long> execute() {
+ List<CommitMongo> validCommits = fetchValidCommits();
+ List<Long> validRevisions = new ArrayList<Long>(validCommits.size());
+ for (CommitMongo commitMongo : validCommits) {
+ validRevisions.add(commitMongo.getRevisionId());
+ }
+
+ return validRevisions;
+ }
+
+ private List<CommitMongo> fetchValidCommits() {
+ return new FetchValidCommitsQuery(mongoConnection, maxRevisionId).execute();
+ }
+}
Propchange: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/FetchValidRevisionsQuery.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/QueryUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/QueryUtils.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/QueryUtils.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/QueryUtils.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.mongomk.query;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.jackrabbit.mongomk.model.NodeMongo;
+import org.apache.log4j.Logger;
+
+import com.mongodb.DBCursor;
+
+/**
+ * Utility class for queries.
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public class QueryUtils {
+
+ private static final Logger LOG = Logger.getLogger(QueryUtils.class);
+
+ /**
+ * Reads nodes from the given {@link DBCursor} and add them to the returned list if their revision id is contained
+ * in the list of given valid revisions. If multiple nodes with the same path are read by the cursor the one with
+ * the highest revision id will win.
+ *
+ * @param dbCursor
+ * The {@code DBCursor} to read from.
+ * @param validRevisions
+ * The list of valid revisions.
+ * @return The list containing the valid nodes.
+ */
+ static List<NodeMongo> convertToNodes(DBCursor dbCursor, List<Long> validRevisions) {
+ Map<String, NodeMongo> nodeMongos = new HashMap<String, NodeMongo>();
+
+ while (dbCursor.hasNext()) {
+ NodeMongo nodeMongo = (NodeMongo) dbCursor.next();
+
+ String path = nodeMongo.getPath();
+ long revId = nodeMongo.getRevisionId();
+
+ LOG.debug(String.format("Converting node %s (%d)", path, revId));
+
+ if (!validRevisions.contains(revId)) {
+ LOG.debug(String.format("Node will not be converted b/c it is not a valid commit %s (%d)", path, revId));
+
+ continue;
+ }
+
+ NodeMongo existingNodeMongo = nodeMongos.get(path);
+ if (existingNodeMongo != null) {
+ long existingRevId = existingNodeMongo.getRevisionId();
+
+ if (revId > existingRevId) {
+ nodeMongos.put(path, nodeMongo);
+ LOG.debug(String.format("Converted nodes was put into map and replaced %s (%d)", path, revId));
+ } else {
+ LOG.debug(String.format(
+ "Converted nodes was not put into map because a newer version is available %s (%d)", path,
+ revId));
+ }
+ } else {
+ nodeMongos.put(path, nodeMongo);
+ LOG.debug("Converted node was put into map");
+ }
+ }
+
+ return new ArrayList<NodeMongo>(nodeMongos.values());
+ }
+
+ private QueryUtils() {
+ // no initialization
+ }
+}
Propchange: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/QueryUtils.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/ReadAndIncHeadRevisionQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/ReadAndIncHeadRevisionQuery.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/ReadAndIncHeadRevisionQuery.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/ReadAndIncHeadRevisionQuery.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.mongomk.query;
+
+import org.apache.jackrabbit.mongomk.MongoConnection;
+import org.apache.jackrabbit.mongomk.model.HeadMongo;
+
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBCollection;
+import com.mongodb.DBObject;
+
+/**
+ * An query for reading and incrementing the head revisio id.
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public class ReadAndIncHeadRevisionQuery extends AbstractQuery<HeadMongo> {
+
+ /**
+ * Constructs a new {@code ReadAndIncHeadRevisionQuery}.
+ *
+ * @param mongoConnection
+ * The {@link MongoConnection}.
+ */
+ public ReadAndIncHeadRevisionQuery(MongoConnection mongoConnection) {
+ super(mongoConnection);
+ }
+
+ @Override
+ public HeadMongo execute() throws Exception {
+ DBObject query = new BasicDBObject();
+ DBObject inc = new BasicDBObject(HeadMongo.KEY_NEXT_REVISION_ID, Long.valueOf(1));
+ DBObject update = new BasicDBObject("$inc", inc);
+ DBCollection headCollection = mongoConnection.getHeadCollection();
+
+ DBObject dbObject = headCollection.findAndModify(query, null, null, false, update, true, false);
+ // Not sure why but sometimes dbObject is null. Simply retry for now.
+ while (dbObject == null) {
+ dbObject = headCollection.findAndModify(query, null, null, false, update, true, false);
+ }
+ return HeadMongo.fromDBObject(dbObject);
+ }
+}
Propchange: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/ReadAndIncHeadRevisionQuery.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveAndSetHeadRevisionQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveAndSetHeadRevisionQuery.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveAndSetHeadRevisionQuery.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveAndSetHeadRevisionQuery.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.mongomk.query;
+
+import org.apache.jackrabbit.mongomk.MongoConnection;
+import org.apache.jackrabbit.mongomk.model.HeadMongo;
+
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBCollection;
+import com.mongodb.DBObject;
+import com.mongodb.QueryBuilder;
+
+/**
+ * An query for saveing and setting the head revision id.
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public class SaveAndSetHeadRevisionQuery extends AbstractQuery<HeadMongo> {
+
+ private final long newHeadRevision;
+ private final long oldHeadRevision;
+
+ /**
+ * Constructs a new {@code SaveAndSetHeadRevisionQuery}.
+ *
+ * @param mongoConnection
+ * The {@link MongoConnection}.
+ * @param oldHeadRevision
+ * @param newHeadRevision
+ */
+ public SaveAndSetHeadRevisionQuery(MongoConnection mongoConnection, long oldHeadRevision, long newHeadRevision) {
+ super(mongoConnection);
+
+ this.oldHeadRevision = oldHeadRevision;
+ this.newHeadRevision = newHeadRevision;
+ }
+
+ @Override
+ public HeadMongo execute() throws Exception {
+ HeadMongo headMongo = null;
+
+ DBCollection headCollection = mongoConnection.getHeadCollection();
+ DBObject query = QueryBuilder.start(HeadMongo.KEY_HEAD_REVISION_ID).is(oldHeadRevision).get();
+ DBObject update = new BasicDBObject("$set", new BasicDBObject(HeadMongo.KEY_HEAD_REVISION_ID, newHeadRevision));
+
+ DBObject dbObject = headCollection.findAndModify(query, null, null, false, update, true, false);
+ if (dbObject != null) {
+ headMongo = HeadMongo.fromDBObject(dbObject);
+ }
+
+ return headMongo;
+ }
+}
Propchange: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveAndSetHeadRevisionQuery.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveCommitQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveCommitQuery.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveCommitQuery.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveCommitQuery.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.mongomk.query;
+
+import org.apache.jackrabbit.mongomk.MongoConnection;
+import org.apache.jackrabbit.mongomk.model.CommitMongo;
+
+import com.mongodb.DBCollection;
+import com.mongodb.WriteResult;
+
+/**
+ * An query for saving a commit.
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public class SaveCommitQuery extends AbstractQuery<Boolean> {
+
+ private final CommitMongo commitMongo;
+
+ /**
+ * Constructs a new {@code SaveCommitQuery}.
+ *
+ * @param mongoConnection
+ * The {@link MongoConnection}.
+ * @param commitMongo
+ * The {@link CommitMongo} to save.
+ */
+ public SaveCommitQuery(MongoConnection mongoConnection, CommitMongo commitMongo) {
+ super(mongoConnection);
+
+ this.commitMongo = commitMongo;
+ }
+
+ @Override
+ public Boolean execute() throws Exception {
+ DBCollection commitCollection = mongoConnection.getCommitCollection();
+ WriteResult writeResult = commitCollection.insert(commitMongo);
+ if (writeResult.getError() != null) {
+ throw new Exception(String.format("Insertion wasn't successful: %s", writeResult));
+ }
+
+ return Boolean.TRUE;
+ }
+}
Propchange: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveCommitQuery.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveNodesQuery.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveNodesQuery.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveNodesQuery.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveNodesQuery.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.mongomk.query;
+
+import java.util.Collection;
+
+import org.apache.jackrabbit.mongomk.MongoConnection;
+import org.apache.jackrabbit.mongomk.model.NodeMongo;
+
+import com.mongodb.DBCollection;
+import com.mongodb.DBObject;
+import com.mongodb.WriteConcern;
+import com.mongodb.WriteResult;
+
+/**
+ * An query for saving a list of nodes.
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+public class SaveNodesQuery extends AbstractQuery<Boolean> {
+
+ private final Collection<NodeMongo> nodeMongos;
+
+ /**
+ * Constructs a new {@code SaveNodesQuery}.
+ *
+ * @param mongoConnection
+ * The {@link MongoConnection}.
+ * @param nodeMongos
+ * The list of {@link NodeMongo}s.
+ */
+ public SaveNodesQuery(MongoConnection mongoConnection, Collection<NodeMongo> nodeMongos) {
+ super(mongoConnection);
+
+ this.nodeMongos = nodeMongos;
+ }
+
+ @Override
+ public Boolean execute() throws Exception {
+ DBCollection nodeCollection = mongoConnection.getNodeCollection();
+ DBObject[] temp = nodeMongos.toArray(new DBObject[nodeMongos.size()]);
+ WriteResult writeResult = nodeCollection.insert(temp, WriteConcern.SAFE);
+ if ((writeResult != null) && (writeResult.getError() != null)) {
+ throw new Exception(String.format("Insertion wasn't successful: %s", writeResult));
+ }
+
+ return Boolean.TRUE;
+ }
+}
Propchange: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/query/SaveNodesQuery.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/util/MongoUtil.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/util/MongoUtil.java?rev=1386591&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/util/MongoUtil.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/util/MongoUtil.java Mon Sep 17 12:54:01 2012
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.mongomk.util;
+
+import java.util.Arrays;
+
+import org.apache.jackrabbit.mongomk.MongoConnection;
+import org.apache.jackrabbit.mongomk.model.CommitMongo;
+import org.apache.jackrabbit.mongomk.model.HeadMongo;
+import org.apache.jackrabbit.mongomk.model.NodeMongo;
+
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBCollection;
+import com.mongodb.DBObject;
+
+/**
+ * Utility classes for preparing the {@code MongoDB} environement.
+ *
+ * @author <a href="mailto:pmarx@adobe.com>Philipp Marx</a>
+ */
+@SuppressWarnings("javadoc")
+public class MongoUtil {
+
+ public static void clearCommitCollection(MongoConnection mongoConnection) {
+ DBCollection commitCollection = mongoConnection.getCommitCollection();
+ commitCollection.drop();
+ }
+
+ public static void clearDatabase(MongoConnection mongoConnection) {
+ clearNodeCollection(mongoConnection);
+ clearCommitCollection(mongoConnection);
+ clearHeadCollection(mongoConnection);
+ }
+
+ public static void clearHeadCollection(MongoConnection mongoConnection) {
+ DBCollection headCollection = mongoConnection.getHeadCollection();
+ headCollection.drop();
+ }
+
+ public static void clearNodeCollection(MongoConnection mongoConnection) {
+ DBCollection nodeCollection = mongoConnection.getNodeCollection();
+ nodeCollection.drop();
+ }
+
+ public static void initCommitCollection(MongoConnection mongoConnection) {
+ DBCollection commitCollection = mongoConnection.getCommitCollection();
+ DBObject index = new BasicDBObject();
+ index.put(CommitMongo.KEY_REVISION_ID, Long.valueOf(1));
+ DBObject options = new BasicDBObject();
+ options.put("unique", Boolean.TRUE);
+ commitCollection.ensureIndex(index, options);
+ CommitMongo commit = new CommitMongo();
+ commit.setAffectedPaths(Arrays.asList(new String[] { "/" }));
+ commit.setBaseRevId(0L);
+ commit.setDiff("+/ : {}");
+ commit.setMessage("This is an autogenerated initial commit");
+ commit.setPath("");
+ commit.setRevisionId(0L);
+ commitCollection.insert(commit);
+ }
+
+ public static void initDatabase(MongoConnection mongoConnection) {
+ clearDatabase(mongoConnection);
+
+ initNodeCollection(mongoConnection);
+ initCommitCollection(mongoConnection);
+ initHeadCollection(mongoConnection);
+ }
+
+ public static void initHeadCollection(MongoConnection mongoConnection) {
+ DBCollection headCollection = mongoConnection.getHeadCollection();
+ HeadMongo headMongo = new HeadMongo();
+ headMongo.setHeadRevisionId(0L);
+ headMongo.setNextRevisionId(1L);
+ headCollection.insert(headMongo);
+ }
+
+ public static void initNodeCollection(MongoConnection mongoConnection) {
+ DBCollection nodeCollection = mongoConnection.getNodeCollection();
+ DBObject index = new BasicDBObject();
+ index.put(NodeMongo.KEY_PATH, Long.valueOf(1));
+ index.put(NodeMongo.KEY_REVISION_ID, Long.valueOf(1));
+ DBObject options = new BasicDBObject();
+ options.put("unique", Boolean.TRUE);
+ nodeCollection.ensureIndex(index, options);
+ NodeMongo root = new NodeMongo();
+ root.setRevisionId(0L);
+ root.setPath("/");
+ nodeCollection.insert(root);
+ }
+
+ public static Long toMongoRepresentation(String revisionId) {
+ return revisionId != null? Long.parseLong(revisionId) : 0L;
+ }
+}
Propchange: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/util/MongoUtil.java
------------------------------------------------------------------------------
svn:eol-style = native