You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by th...@apache.org on 2011/09/01 10:47:42 UTC
svn commit: r1163945 - in /jackrabbit/sandbox/microkernel/src:
main/java/org/apache/jackrabbit/mk/index/
main/java/org/apache/jackrabbit/mk/mem/
test/java/org/apache/jackrabbit/mk/index/
Author: thomasm
Date: Thu Sep 1 08:47:42 2011
New Revision: 1163945
URL: http://svn.apache.org/viewvc?rev=1163945&view=rev
Log:
Index mechanism (WIP)
Modified:
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/Index.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/PrefixIndex.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/PropertyIndex.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/MemoryKernelImpl.java
jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/index/PrefixIndexTest.java
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/Index.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/Index.java?rev=1163945&r1=1163944&r2=1163945&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/Index.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/Index.java Thu Sep 1 08:47:42 2011
@@ -26,17 +26,22 @@ import org.apache.jackrabbit.mk.mem.Node
public interface Index {
/**
- * The given node was added.
+ * The given node was added or removed.
*
- * @param add the added node
+ * @param node the node including (old or new) data
+ * @param add true if added, false if removed
*/
- void add(NodeImpl add);
+ void addOrRemoveNode(NodeImpl node, boolean add);
/**
- * The given node was removed.
+ * The given property was added or removed.
*
- * @param remove the removed node
+ * @param nodePath the path of the node
+ * @param propertyName the property name
+ * @param value the old (when deleting) or new (when adding) value
+ * @param add true if added, false if removed
*/
- void remove(NodeImpl remove);
+ void addOrRemoveProperty(String nodePath, String propertyName,
+ String value, boolean add);
}
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java?rev=1163945&r1=1163944&r2=1163945&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java Thu Sep 1 08:47:42 2011
@@ -212,7 +212,7 @@ public class Indexer {
NodeMap map = new NodeMap();
if (t.matches('{')) {
NodeImpl n = NodeImpl.parse(map, t, 0, path);
- addOrRemoveRecursive(n, true, true);
+ addOrRemoveRecursive(n, false, true);
} else {
String value = t.readRawValue().trim();
String nodePath = PathUtils.getParentPath(path);
@@ -232,19 +232,12 @@ public class Indexer {
path = t.readString();
removeProperty(path, lastRevision);
t.read(':');
- String value;
- NodeMap map = new NodeMap();
- NodeImpl node = new NodeImpl(map, 0);
if (t.matches(JsopTokenizer.NULL)) {
- value = null;
+ // ignore
} else {
- value = t.readRawValue().trim();
+ String value = t.readRawValue().trim();
+ addProperty(path, value);
}
- String nodePath = PathUtils.getParentPath(path);
- node.setPath(nodePath);
- String propertyName = PathUtils.getName(path);
- node.cloneAndSetProperty(propertyName, value, 0);
- addOrRemoveRecursive(node, true, true);
break;
}
case '>':
@@ -321,10 +314,10 @@ public class Indexer {
}
for (Index index : indexes) {
if (remove) {
- index.remove(n);
+ index.addOrRemoveNode(n, false);
}
if (add) {
- index.add(n);
+ index.addOrRemoveNode(n, true);
}
}
for (Iterator<String> it = n.getChildNodeNames(); it.hasNext();) {
@@ -341,20 +334,33 @@ public class Indexer {
// don't index the index
return;
}
- String nodeName = PathUtils.getParentPath(path);
+ String nodePath = PathUtils.getParentPath(path);
String property = PathUtils.getName(path);
- String node = mk.getNodes(nodeName, lastRevision, 0, 0, 0);
+ String node = mk.getNodes(nodePath, lastRevision, Integer.MAX_VALUE, 0, Integer.MAX_VALUE);
JsopTokenizer t = new JsopTokenizer(node);
NodeMap map = new NodeMap();
t.read('{');
- NodeImpl n = NodeImpl.parse(map, t, 0, nodeName);
+ NodeImpl n = NodeImpl.parse(map, t, 0, path);
if (n.hasProperty(property)) {
+ n.setPath(nodePath);
for (Index index : indexes) {
- index.remove(n);
+ index.addOrRemoveProperty(nodePath, property, n.getProperty(property), false);
}
}
}
+ private void addProperty(String path, String value) {
+ if (isInIndex(path)) {
+ // don't index the index
+ return;
+ }
+ String nodePath = PathUtils.getParentPath(path);
+ String property = PathUtils.getName(path);
+ for (Index index : indexes) {
+ index.addOrRemoveProperty(nodePath, property, value, true);
+ }
+ }
+
private void removeNode(String path, String lastRevision) {
if (isInIndex(path)) {
// don't index the index
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/PrefixIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/PrefixIndex.java?rev=1163945&r1=1163944&r2=1163945&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/PrefixIndex.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/PrefixIndex.java Thu Sep 1 08:47:42 2011
@@ -37,51 +37,42 @@ public class PrefixIndex implements Inde
tree.setMinSize(10);
}
- public void add(NodeImpl node) {
- addOrRemove(node, true);
- }
-
- public void remove(NodeImpl node) {
- addOrRemove(node, false);
- }
-
- private void addOrRemove(NodeImpl node, boolean add) {
- String path = null;
+ public void addOrRemoveNode(NodeImpl node, boolean add) {
+ String nodePath = node.getPath();
for (Entry<String, String> e : node.getProperties()) {
String propertyName = e.getKey();
String value = e.getValue();
- JsopTokenizer t = new JsopTokenizer(value);
- if (t.matches(JsopTokenizer.STRING)) {
- String v = t.getToken();
- if (v.startsWith(prefix)) {
- if (path == null) {
- path = node.getPath();
- }
- addOrRemove(path, propertyName, v, add);
- }
- } else if (t.matches('[')) {
- if (path == null) {
- path = node.getPath();
- }
- if (!t.matches(']')) {
- do {
- if (t.matches(JsopTokenizer.STRING)) {
- String v = t.getToken();
- if (v.startsWith(prefix)) {
- addOrRemove(path, propertyName, v, add);
- }
- } else if (t.matches(JsopTokenizer.FALSE)) {
- // ignore
- } else if (t.matches(JsopTokenizer.TRUE)) {
- // ignore
- } else if (t.matches(JsopTokenizer.NULL)) {
- // ignore
- } else if (t.matches(JsopTokenizer.NUMBER)) {
- // ignore
+ addOrRemoveProperty(nodePath, propertyName, value, add);
+ }
+ }
+
+ public void addOrRemoveProperty(String nodePath, String propertyName,
+ String value, boolean add) {
+ JsopTokenizer t = new JsopTokenizer(value);
+ if (t.matches(JsopTokenizer.STRING)) {
+ String v = t.getToken();
+ if (v.startsWith(prefix)) {
+ addOrRemove(nodePath, propertyName, v, add);
+ }
+ } else if (t.matches('[')) {
+ if (!t.matches(']')) {
+ do {
+ if (t.matches(JsopTokenizer.STRING)) {
+ String v = t.getToken();
+ if (v.startsWith(prefix)) {
+ addOrRemove(nodePath, propertyName, v, add);
}
- } while (t.matches(','));
- t.read(']');
- }
+ } else if (t.matches(JsopTokenizer.FALSE)) {
+ // ignore
+ } else if (t.matches(JsopTokenizer.TRUE)) {
+ // ignore
+ } else if (t.matches(JsopTokenizer.NULL)) {
+ // ignore
+ } else if (t.matches(JsopTokenizer.NUMBER)) {
+ // ignore
+ }
+ } while (t.matches(','));
+ t.read(']');
}
}
}
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/PropertyIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/PropertyIndex.java?rev=1163945&r1=1163944&r2=1163945&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/PropertyIndex.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/index/PropertyIndex.java Thu Sep 1 08:47:42 2011
@@ -38,33 +38,33 @@ public class PropertyIndex implements In
tree.setMinSize(10);
}
- public void add(NodeImpl node) {
+ public void addOrRemoveNode(NodeImpl node, boolean add) {
String value = node.getProperty(propertyName);
if (value != null) {
- addOrRemoveRaw(value, node.getPath(), true);
+ addOrRemoveRaw(node.getPath(), value, add);
}
}
- public void remove(NodeImpl node) {
- String value = node.getProperty(propertyName);
- if (value != null) {
- addOrRemoveRaw(value, node.getPath(), false);
+ public void addOrRemoveProperty(String nodePath, String propertyName,
+ String value, boolean add) {
+ if (this.propertyName.equals(propertyName)) {
+ addOrRemoveRaw(nodePath, value, add);
}
}
- private void addOrRemoveRaw(String value, String path, boolean add) {
+ private void addOrRemoveRaw(String nodePath, String value, boolean add) {
JsopTokenizer t = new JsopTokenizer(value);
if (t.matches(JsopTokenizer.STRING) || t.matches(JsopTokenizer.NUMBER)) {
String v = t.getToken();
- addOrRemove(v, path, add);
+ addOrRemove(nodePath, v, add);
}
}
- private void addOrRemove(String value, String path, boolean add) {
+ private void addOrRemove(String nodePath, String value, boolean add) {
if (add) {
- tree.add(value, path);
+ tree.add(value, nodePath);
} else {
- tree.remove(value, path);
+ tree.remove(value, nodePath);
}
}
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/MemoryKernelImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/MemoryKernelImpl.java?rev=1163945&r1=1163944&r2=1163945&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/MemoryKernelImpl.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/MemoryKernelImpl.java Thu Sep 1 08:47:42 2011
@@ -83,7 +83,7 @@ public class MemoryKernelImpl implements
public static synchronized MemoryKernelImpl get(String name) {
MemoryKernelImpl instance = INSTANCES.get(name);
- if (instance == null) {
+ if (instance == null || instance.nodeMap.getRootId() == 0) {
instance = new MemoryKernelImpl(name);
INSTANCES.put(name, instance);
}
Modified: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/index/PrefixIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/index/PrefixIndexTest.java?rev=1163945&r1=1163944&r2=1163945&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/index/PrefixIndexTest.java (original)
+++ jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/index/PrefixIndexTest.java Thu Sep 1 08:47:42 2011
@@ -65,6 +65,11 @@ public class PrefixIndexTest extends Tes
head = mk.commit("/", "+\"test6\" : {\"data\":[true, false, null, 1, -1]}", head, null);
assertEquals("/test2/blob2, /test4/blob4, /test5/blobs", getPathList(index, "d:2", head));
+ head = mk.commit("/", "+\"test7\" : {\"a\":\"d:4\", \"b\":\"d:4\"}", head, null);
+ assertEquals("/test7/a, /test7/b", getPathList(index, "d:4", head));
+ head = mk.commit("/", "^\"test7/a\" : null", head, null);
+ assertEquals("/test7/b", getPathList(index, "d:4", head));
+
mk.dispose();
}