svn commit: r1424484 - /jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionManagerImpl.java

2012-12-20 Thread mreutegg
Author: mreutegg
Date: Thu Dec 20 14:24:02 2012
New Revision: 1424484

URL: http://svn.apache.org/viewvc?rev=1424484&view=rev
Log:
OAK-168: Basic JCR VersionManager support (WIP)
- disable partial checkin/checkout implementation until it's complete

Modified:

jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionManagerImpl.java

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionManagerImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionManagerImpl.java?rev=1424484&r1=1424483&r2=1424484&view=diff
==
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionManagerImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionManagerImpl.java
 Thu Dec 20 14:24:02 2012
@@ -188,6 +188,9 @@ public class VersionManagerImpl implemen
 
 @Override
 public void checkout(final String absPath) throws RepositoryException {
+if (true) {
+TODO.unimplemented().doNothing();
+}
 final SessionDelegate sessionDelegate = 
versionManagerDelegate.getSessionDelegate();
 sessionDelegate.perform(new SessionOperation() {
 @Override
@@ -208,6 +211,9 @@ public class VersionManagerImpl implemen
 
 @Override
 public Version checkin(final String absPath) throws RepositoryException {
+if (true) {
+return 
TODO.dummyImplementation().returnValue(getBaseVersion(absPath));
+}
 final SessionDelegate sessionDelegate = 
versionManagerDelegate.getSessionDelegate();
 return sessionDelegate.perform(new SessionOperation() {
 @Override




svn commit: r1424481 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/ oak-mongomk/src/main/java/org/ap

2012-12-20 Thread mreutegg
Author: mreutegg
Date: Thu Dec 20 14:20:39 2012
New Revision: 1424481

URL: http://svn.apache.org/viewvc?rev=1424481&view=rev
Log:
OAK-534: Inefficient NodeState comparison with MongoMK

Added:

jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/command/OneLevelDiffCommand.java
   (with props)
Modified:

jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeState.java

jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/MongoNodeStore.java

jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/MongoMKGetRevisionHistoryTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeState.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeState.java?rev=1424481&r1=1424480&r2=1424481&view=diff
==
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeState.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeState.java
 Thu Dec 20 14:20:39 2012
@@ -236,9 +236,11 @@ public final class KernelNodeState exten
 kbase.init();
 if (hash != null && hash.equals(kbase.hash)) {
 return; // no differences
-} else if (path.equals(kbase.path)) {
-// TODO: Parse the JSON diff returned by the kernel
-// kernel.diff(kbase.revision, revision, path);
+} else if (path.equals(kbase.path) && !path.equals("/")) {
+String jsonDiff = kernel.diff(kbase.getRevision(), 
revision, path, 0);
+if (!hasChanges(jsonDiff)) {
+return; // no differences
+}
 }
 }
 }
@@ -271,6 +273,9 @@ public final class KernelNodeState exten
 that.init();
 if (hash != null && that.hash != null) {
 return hash.equals(that.hash);
+} else if (path.equals(that.path) && !path.equals("/")) {
+String jsonDiff = kernel.diff(that.getRevision(), 
revision, path, 0);
+return !hasChanges(jsonDiff);
 }
 }
 }
@@ -293,6 +298,10 @@ public final class KernelNodeState exten
 
 //< private 
>---
 
+private boolean hasChanges(String journal) {
+return !journal.trim().isEmpty();
+}
+
 private Iterable getChildNodeEntries(
 final long offset, final int count) {
 return new Iterable() {

Modified: 
jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/MongoNodeStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/MongoNodeStore.java?rev=1424481&r1=1424480&r2=1424481&view=diff
==
--- 
jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/MongoNodeStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/MongoNodeStore.java
 Thu Dec 20 14:20:39 2012
@@ -36,6 +36,7 @@ import org.apache.jackrabbit.mongomk.imp
 import org.apache.jackrabbit.mongomk.impl.command.GetRevisionHistoryCommand;
 import org.apache.jackrabbit.mongomk.impl.command.MergeCommand;
 import org.apache.jackrabbit.mongomk.impl.command.NodeExistsCommand;
+import org.apache.jackrabbit.mongomk.impl.command.OneLevelDiffCommand;
 import org.apache.jackrabbit.mongomk.impl.command.WaitForCommitCommand;
 import org.apache.jackrabbit.mongomk.impl.model.MongoCommit;
 import org.apache.jackrabbit.mongomk.impl.model.MongoNode;
@@ -91,7 +92,12 @@ public class MongoNodeStore implements N
 @Override
 public String diff(String fromRevision, String toRevision, String path, 
int depth)
 throws Exception {
-Command command = new DiffCommand(this, fromRevision, 
toRevision, path, depth);
+Command command;
+if (depth == 0) {
+command = new OneLevelDiffCommand(this, fromRevision, toRevision, 
path);
+} else {
+command = new DiffCommand(this, fromRevision, toRevision, path, 
depth);
+}
 return commandExecutor.execute(command);
 }
 

Added: 
jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/command/OneLevelDiffCommand.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/command/OneLevelDiffCommand.java?rev=1

svn commit: r1424409 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/index/p2/ main/java/org/apache/jackrabbit/oak/plugins/index/p2/strategy/ test/java/org/apache/

2012-12-20 Thread thomasm
Author: thomasm
Date: Thu Dec 20 11:20:46 2012
New Revision: 1424409

URL: http://svn.apache.org/viewvc?rev=1424409&view=rev
Log:
OAK-515 Property2Index should be used for "[indexedProperty] is not null"

Modified:

jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2Index.java

jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2IndexLookup.java

jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/strategy/ContentMirrorStoreStrategy.java

jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/strategy/IndexStoreStrategy.java

jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexQueryTest.java

jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_index.txt

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2Index.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2Index.java?rev=1424409&r1=1424408&r2=1424409&view=diff
==
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2Index.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/p2/Property2Index.java
 Thu Dec 20 11:20:46 2012
@@ -81,7 +81,8 @@ class Property2Index implements QueryInd
 
 public static final String TYPE = "p2";
 
-private static final int MAX_STRING_LENGTH = 100; // TODO: configurable
+// TODO the max string length should be removed, or made configurable
+private static final int MAX_STRING_LENGTH = 100; 
 
 static List encode(PropertyValue value) {
 List values = new ArrayList();
@@ -110,10 +111,17 @@ class Property2Index implements QueryInd
 public double getCost(Filter filter, NodeState root) {
 Property2IndexLookup lookup = new Property2IndexLookup(root);
 for (PropertyRestriction pr : filter.getPropertyRestrictions()) {
-if (pr.firstIncluding && pr.lastIncluding
-&& pr.first.equals(pr.last) // TODO: range queries
-&& lookup.isIndexed(pr.propertyName, "/")) { // TODO: path
-return lookup.getCost(pr.propertyName, pr.first);
+// TODO support indexes on a path
+// currently, only indexes on the root node are supported
+if (lookup.isIndexed(pr.propertyName, "/")) {
+if (pr.firstIncluding && pr.lastIncluding
+&& pr.first != null && pr.first.equals(pr.last)) {
+// "[property] = $value"
+return lookup.getCost(pr.propertyName, pr.first);
+} else if (pr.first == null && pr.last == null) {
+// "[property] is not null"
+return lookup.getCost(pr.propertyName, null);
+}
 }
 }
 // not an appropriate index
@@ -126,18 +134,32 @@ class Property2Index implements QueryInd
 
 Property2IndexLookup lookup = new Property2IndexLookup(root);
 for (PropertyRestriction pr : filter.getPropertyRestrictions()) {
-if (pr.firstIncluding && pr.lastIncluding
-&& pr.first.equals(pr.last) // TODO: range queries
-&& lookup.isIndexed(pr.propertyName, "/")) { // TODO: path
-Set set = lookup.find(pr.propertyName, pr.first);
-if (paths == null) {
-paths = Sets.newHashSet(set);
-} else {
-paths.retainAll(set);
+// TODO support indexes on a path
+// currently, only indexes on the root node are supported
+if (lookup.isIndexed(pr.propertyName, "/")) {
+Set set = null;
+// equality
+if (pr.firstIncluding && pr.lastIncluding
+&& pr.first != null && pr.first.equals(pr.last)) {
+// "[property] = $value"
+// TODO don't load all entries in memory
+set = lookup.find(pr.propertyName, pr.first);
+} else if (pr.first == null && pr.last == null) {
+// "[property] is not null"
+// TODO don't load all entries in memory
+set = lookup.find(pr.propertyName, (PropertyValue) null);
+}
+// only keep the intersection
+// TODO this requires all paths are loaded in memory
+if (set != null) {
+if (paths == null) {
+paths = Sets.newHashSet(set);
+} else {
+paths.retainAll(

svn commit: r1424389 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/query/XPathToSQL2Converter.java test/resources/org/apache/jackrabbit/oak/query/sql2.txt test/resources

2012-12-20 Thread thomasm
Author: thomasm
Date: Thu Dec 20 10:13:29 2012
New Revision: 1424389

URL: http://svn.apache.org/viewvc?rev=1424389&view=rev
Log:
OAK-309 ParentNodeTest fails (XPath parent node navigation using "..")

Modified:

jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/XPathToSQL2Converter.java

jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2.txt

jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/xpath.txt

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/XPathToSQL2Converter.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/XPathToSQL2Converter.java?rev=1424389&r1=1424388&r2=1424389&view=diff
==
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/XPathToSQL2Converter.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/XPathToSQL2Converter.java
 Thu Dec 20 10:13:29 2012
@@ -85,9 +85,6 @@ public class XPathToSQL2Converter {
 currentSelector.name = "a";
 
 ArrayList columnList = new ArrayList();
-
-// TODO support "..", example:
-// /jcr:root/etc/..
 
 String pathPattern = "";
 boolean startOfQuery = true;
@@ -225,6 +222,29 @@ public class XPathToSQL2Converter {
 }
 }
 }
+} else if (readIf(".")) {
+// just "." this is simply ignored, so that
+// "a/./b" is the same as "a/b"
+if (readIf(".")) {
+// ".." means "the parent of the node"
+// handle like a regular path restriction
+String name = "..";
+pathPattern += name;
+if (!currentSelector.isChild) {
+currentSelector.nodeName = name;
+} else {
+if (currentSelector.isChild) {
+currentSelector.isChild = false;
+currentSelector.isParent = true;
+}
+}
+} else {
+if (selectors.size() > 0) {
+currentSelector = selectors.remove(selectors.size() - 
1);
+currentSelector.condition = null;
+currentSelector.joinCondition = null;
+}
+}
 } else {
 throw getSyntaxError();
 }
@@ -346,7 +366,7 @@ public class XPathToSQL2Converter {
 boolean isFirstSelector = selectors.size() == 0;
 String path = currentSelector.path;
 Expression condition = currentSelector.condition;
-Expression joinCondition = currentSelector.joinCondition;
+Expression joinCondition = null;
 if (currentSelector.nodeName != null) {
 Function f = new Function("name");
 f.params.add(new SelectorExpr(currentSelector));
@@ -372,6 +392,15 @@ public class XPathToSQL2Converter {
 c.params.add(new SelectorExpr(selectors.get(selectors.size() - 
1)));
 joinCondition = c;
 } 
+} else if (currentSelector.isParent) {
+if (isFirstSelector) {
+throw getSyntaxError();
+} else {
+Function c = new Function("ischildnode");
+c.params.add(new SelectorExpr(selectors.get(selectors.size() - 
1)));
+c.params.add(new SelectorExpr(currentSelector));
+joinCondition = c;
+}
 } else if (currentSelector.isChild) {
 if (isFirstSelector) {
 if (!path.isEmpty()) {
@@ -408,7 +437,7 @@ public class XPathToSQL2Converter {
 Selector nextSelector = new Selector();
 nextSelector.name = nextSelectorName;
 currentSelector.condition = condition;
-currentSelector.joinCondition = joinCondition;
+currentSelector.joinCondition = add(currentSelector.joinCondition, 
joinCondition);
 selectors.add(currentSelector);
 currentSelector = nextSelector;
 }
@@ -417,6 +446,8 @@ public class XPathToSQL2Converter {
 private static Expression add(Expression old, Expression add) {
 if (old == null) {
 return add;
+} else if (add == null) {
+return old;
 }
 return new Condition(old, "and", add, Expression.PRECEDENCE_AND);
 }
@@ -985,22 +1016,33 @@ public class XPathToSQL2Converter {
 
 /**
  * Whether this is a child node of the previous selector or a given 
path.
+ * Examples:
+ * /jcr:root/*
+ * /jcr:root/test/*
+ * /jcr:root/