svn commit: r1424484 - /jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionManagerImpl.java
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
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/
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
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/