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 th...@apache.org on 2012/05/03 17:29:43 UTC
svn commit: r1333504 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/mk/index/
main/java/org/apache/jackrabbit/oak/api/
main/java/org/apache/jackrabbit/oak/core/
main/java/org/apache/jackrabbit/oak/osgi/ main/java/org/apache/ja...
Author: thomasm
Date: Thu May 3 15:29:42 2012
New Revision: 1333504
URL: http://svn.apache.org/viewvc?rev=1333504&view=rev
Log:
OAK-28 Query implementation (removed QueryIndexProvider.init(); and implementation)
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/PropertyIndex.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/PropertyContentIndex.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingCursor.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/QueryIndexProvider.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PrefixIndexTest.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PropertyIndexTest.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/wrapper/IndexWrapperTest.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java
jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryTest.txt
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java?rev=1333504&r1=1333503&r2=1333504&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/IndexWrapper.java Thu May 3 15:29:42 2012
@@ -29,13 +29,13 @@ import org.apache.jackrabbit.mk.util.Exc
import org.apache.jackrabbit.oak.commons.PathUtils;
import org.apache.jackrabbit.mk.wrapper.MicroKernelWrapper;
import org.apache.jackrabbit.mk.wrapper.MicroKernelWrapperBase;
+import org.apache.jackrabbit.oak.spi.QueryIndexProvider;
/**
* The index mechanism, as a wrapper.
*/
public class IndexWrapper extends MicroKernelWrapperBase implements MicroKernel {
- private static final String INDEX_PATH = "/index";
private static final String TYPE_PREFIX = "prefix:";
private static final String TYPE_PROPERTY = "property:";
private static final String UNIQUE = "unique";
@@ -48,10 +48,14 @@ public class IndexWrapper extends MicroK
public IndexWrapper(MicroKernel mk) {
this.mk = MicroKernelWrapperBase.wrap(mk);
- this.indexer = new Indexer(mk);
+ this.indexer = new Indexer(this, mk, Indexer.INDEX_CONFIG_ROOT);
indexer.init();
}
+ public QueryIndexProvider getIndexer() {
+ return indexer;
+ }
+
@Override
public String getHeadRevision() {
return mk.getHeadRevision();
@@ -64,6 +68,10 @@ public class IndexWrapper extends MicroK
@Override
public boolean nodeExists(String path, String revisionId) {
+ String indexRoot = indexer.getIndexRootNode();
+ if (path.startsWith(indexRoot)) {
+ return false;
+ }
return mk.nodeExists(path, revisionId);
}
@@ -99,7 +107,8 @@ public class IndexWrapper extends MicroK
@Override
public String commitStream(String rootPath, JsopReader jsonDiff, String revisionId, String message) {
- if (!rootPath.startsWith(INDEX_PATH)) {
+ String indexRoot = indexer.getIndexRootNode();
+ if (!rootPath.startsWith(indexRoot)) {
String rev = mk.commitStream(rootPath, jsonDiff, revisionId, message);
jsonDiff.resetReader();
indexer.updateIndex(rootPath, jsonDiff, rev);
@@ -125,7 +134,7 @@ public class IndexWrapper extends MicroK
t.read('{');
// parse but ignore
NodeImpl.parse(map, t, 0);
- path = PathUtils.relativize(INDEX_PATH, path);
+ path = PathUtils.relativize(indexRoot, path);
if (path.startsWith(TYPE_PREFIX)) {
String prefix = path.substring(TYPE_PREFIX.length());
PrefixIndex idx = indexer.createPrefixIndex(prefix);
@@ -144,7 +153,20 @@ public class IndexWrapper extends MicroK
}
break;
case '-':
- throw ExceptionFactory.get("Removing indexes is not yet implemented");
+ path = PathUtils.relativize(indexRoot, path);
+ if (path.startsWith(TYPE_PREFIX)) {
+ String prefix = path.substring(TYPE_PREFIX.length());
+ indexer.removePrefixIndex(prefix);
+ } else if (path.startsWith(TYPE_PROPERTY)) {
+ String property = path.substring(TYPE_PROPERTY.length());
+ boolean unique = false;
+ if (property.endsWith("," + UNIQUE)) {
+ unique = true;
+ property = property.substring(0, property.length() - UNIQUE.length() - 1);
+ }
+ indexer.removePropertyIndex(property, unique);
+ }
+ break;
default:
throw ExceptionFactory.get("token: " + (char) t.getTokenType());
}
@@ -154,10 +176,11 @@ public class IndexWrapper extends MicroK
@Override
public JsopReader getNodesStream(String path, String revisionId, int depth, long offset, int count, String filter) {
- if (!path.startsWith(INDEX_PATH)) {
+ String indexRoot = indexer.getIndexRootNode();
+ if (!path.startsWith(indexRoot)) {
return mk.getNodesStream(path, revisionId, depth, offset, count, filter);
}
- String index = PathUtils.relativize(INDEX_PATH, path);
+ String index = PathUtils.relativize(indexRoot, path);
int idx = index.indexOf('?');
if (idx < 0) {
// invalid query - expected: /index/prefix:x?y
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java?rev=1333504&r1=1333503&r2=1333504&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/Indexer.java Thu May 3 15:29:42 2012
@@ -44,30 +44,41 @@ import java.util.Map.Entry;
public class Indexer implements QueryIndexProvider {
// TODO discuss where to store index config data
- private static final String INDEX_CONFIG_ROOT = "/jcr:system/indexes";
+ static final String INDEX_CONFIG_ROOT = "/jcr:system/indexes";
private static final boolean DISABLED = Boolean.getBoolean("mk.indexDisabled");
private MicroKernel mk;
+ private MicroKernel mkWrapper;
private String revision;
private String indexRootNode;
private StringBuilder buffer;
private HashMap<String, Index> indexes = new HashMap<String, Index>();
+ private ArrayList<QueryIndex> queryIndexList;
private HashMap<String, BTreePage> modified = new HashMap<String, BTreePage>();
private SimpleLRUCache<String, BTreePage> cache = SimpleLRUCache.newInstance(100);
private String readRevision;
+ private boolean init;
- public Indexer(MicroKernel mk, String indexRootNode) {
+ public Indexer(MicroKernel mkWrapper, MicroKernel mk, String indexRootNode) {
+ this.mkWrapper = mkWrapper;
this.mk = mk;
this.indexRootNode = indexRootNode;
}
public Indexer(MicroKernel mk) {
- this(mk, INDEX_CONFIG_ROOT);
+ this(mk, mk, INDEX_CONFIG_ROOT);
+ }
+
+ public String getIndexRootNode() {
+ return indexRootNode;
}
- @Override
public void init() {
+ if (init) {
+ return;
+ }
+ init = true;
if (!PathUtils.isAbsolute(indexRootNode)) {
indexRootNode = "/" + indexRootNode;
}
@@ -106,11 +117,18 @@ public class Indexer implements QueryInd
}
if (p != null) {
indexes.put(p.getName(), p);
+ queryIndexList = null;
}
}
}
}
+ public void removePropertyIndex(String property, boolean unique) {
+ PropertyIndex index = new PropertyIndex(this, property, unique);
+ indexes.remove(index.getName());
+ queryIndexList = null;
+ }
+
public PropertyIndex createPropertyIndex(String property, boolean unique) {
PropertyIndex index = new PropertyIndex(this, property, unique);
PropertyIndex existing = (PropertyIndex) indexes.get(index.getName());
@@ -121,6 +139,12 @@ public class Indexer implements QueryInd
return index;
}
+ public void removePrefixIndex(String prefix) {
+ PrefixIndex index = new PrefixIndex(this, prefix);
+ indexes.remove(index.getName());
+ queryIndexList = null;
+ }
+
public PrefixIndex createPrefixIndex(String prefix) {
PrefixIndex index = new PrefixIndex(this, prefix);
PrefixIndex existing = (PrefixIndex) indexes.get(index.getName());
@@ -490,6 +514,7 @@ public class Indexer implements QueryInd
private void buildAndAddIndex(Index index) {
addRecursive(index, "/");
indexes.put(index.getName(), index);
+ queryIndexList = null;
}
private void addRecursive(Index index, String path) {
@@ -510,20 +535,23 @@ public class Indexer implements QueryInd
@Override
public List<QueryIndex> getQueryIndexes(MicroKernel mk) {
- if (mk != this.mk) {
+ init();
+ if (mk != this.mkWrapper) {
return Collections.emptyList();
}
- ArrayList<QueryIndex> list = new ArrayList<QueryIndex>();
- for (Index index : indexes.values()) {
- QueryIndex qi = null;
- if (index instanceof PropertyIndex) {
- qi = new PropertyContentIndex(mk, (PropertyIndex) index);
- } else if (index instanceof PrefixIndex) {
- // TODO support prefix indexes?
+ if (queryIndexList == null) {
+ queryIndexList = new ArrayList<QueryIndex>();
+ for (Index index : indexes.values()) {
+ QueryIndex qi = null;
+ if (index instanceof PropertyIndex) {
+ qi = new PropertyContentIndex(mk, (PropertyIndex) index);
+ } else if (index instanceof PrefixIndex) {
+ // TODO support prefix indexes?
+ }
+ queryIndexList.add(qi);
}
- list.add(qi);
}
- return list;
+ return queryIndexList;
}
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/PropertyIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/PropertyIndex.java?rev=1333504&r1=1333503&r2=1333504&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/PropertyIndex.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/mk/index/PropertyIndex.java Thu May 3 15:29:42 2012
@@ -53,6 +53,10 @@ public class PropertyIndex implements In
return new PropertyIndex(indexer, propertyName, unique);
}
+ public String getPropertyName() {
+ return propertyName;
+ }
+
@Override
public String getName() {
return tree.getName();
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java?rev=1333504&r1=1333503&r2=1333504&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/QueryEngine.java Thu May 3 15:29:42 2012
@@ -28,11 +28,6 @@ import java.util.Map;
public interface QueryEngine {
/**
- * Initialize the query engine. This includes reading the list of indexes.
- */
- void init();
-
- /**
* Parse the query (check if it's valid) and get the list of bind variable names.
*
* @param statement
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java?rev=1333504&r1=1333503&r2=1333504&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java Thu May 3 15:29:42 2012
@@ -42,7 +42,7 @@ import javax.security.auth.login.LoginEx
public class ContentRepositoryImpl implements ContentRepository {
/** Logger instance */
- private static final Logger log =
+ private static final Logger LOG =
LoggerFactory.getLogger(ContentRepositoryImpl.class);
// TODO: retrieve default wsp-name from configuration
@@ -64,12 +64,6 @@ public class ContentRepositoryImpl imple
this(mk, getDefaultIndexProvider(mk));
}
- private static QueryIndexProvider getDefaultIndexProvider(MicroKernel mk) {
- QueryIndexProvider provider = new Indexer(mk);
- provider.init();
- return provider;
- }
-
/**
* Creates an Oak repository instance based on the given, already
* initialized components.
@@ -83,7 +77,6 @@ public class ContentRepositoryImpl imple
queryEngine = new QueryEngineImpl(nodeStore, microKernel, indexProvider);
// FIXME: workspace setup must be done elsewhere...
- queryEngine.init();
NodeState root = nodeStore.getRoot();
NodeState wspNode = root.getChildNode(DEFAULT_WORKSPACE_NAME);
@@ -97,6 +90,10 @@ public class ContentRepositoryImpl imple
}
}
+ private static QueryIndexProvider getDefaultIndexProvider(MicroKernel mk) {
+ return new Indexer(mk);
+ }
+
@Override
public ContentSession login(Object credentials, String workspaceName)
throws LoginException, NoSuchWorkspaceException {
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java?rev=1333504&r1=1333503&r2=1333504&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiIndexProvider.java Thu May 3 15:29:42 2012
@@ -80,11 +80,6 @@ public class OsgiIndexProvider implement
}
@Override
- public void init() {
- // nothing to do
- }
-
- @Override
public List<QueryIndex> getQueryIndexes(MicroKernel mk) {
if (providers.isEmpty()) {
return Collections.emptyList();
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java?rev=1333504&r1=1333503&r2=1333504&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java Thu May 3 15:29:42 2012
@@ -47,12 +47,6 @@ public class QueryEngineImpl implements
parserSQL2 = new SQL2Parser(vf);
}
- @Override
- public void init() {
- // TODO the list of index providers should be configurable as well
- indexProvider.init();
- }
-
/**
* Parse the query (check if it's valid) and get the list of bind variable names.
*
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java?rev=1333504&r1=1333503&r2=1333504&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java Thu May 3 15:29:42 2012
@@ -63,6 +63,9 @@ public class PropertyValueImpl extends D
NodeImpl n = selector.currentNode();
String[] elements = PathUtils.split(propertyName);
for (int i = 0; i < elements.length - 1; i++) {
+ if (n == null) {
+ return null;
+ }
String p = elements[i];
if (!n.exists(p)) {
return null;
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/PropertyContentIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/PropertyContentIndex.java?rev=1333504&r1=1333503&r2=1333504&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/PropertyContentIndex.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/PropertyContentIndex.java Thu May 3 15:29:42 2012
@@ -42,39 +42,29 @@ public class PropertyContentIndex implem
@Override
public double getCost(Filter filter) {
- String propertyName = index.getName();
+ String propertyName = index.getPropertyName();
Filter.PropertyRestriction restriction = filter.getPropertyRestriction(propertyName);
if (restriction == null) {
return Double.MAX_VALUE;
}
- boolean unique = index.isUnique();
- if (restriction.first == restriction.last) {
- return unique ? 2 : 20;
- }
- int estimatedMatches = 1000000;
- if (restriction.first != null) {
- estimatedMatches /= 10;
- }
- if (restriction.last != null) {
- estimatedMatches /= 10;
- }
- if (unique) {
- estimatedMatches /= 100;
+ if (restriction.first != restriction.last) {
+ // only support equality matches (for now)
+ return Double.MAX_VALUE;
}
- return estimatedMatches;
+ boolean unique = index.isUnique();
+ return unique ? 2 : 20;
}
@Override
public String getPlan(Filter filter) {
- String propertyName = index.getName();
+ String propertyName = index.getPropertyName();
Filter.PropertyRestriction restriction = filter.getPropertyRestriction(propertyName);
-
return "propertyIndex \"" + restriction.propertyName + " " + restriction.toString() + '"';
}
@Override
public Cursor query(Filter filter, String revisionId) {
- String propertyName = index.getName();
+ String propertyName = index.getPropertyName();
Filter.PropertyRestriction restriction = filter.getPropertyRestriction(propertyName);
if (restriction == null) {
throw new IllegalArgumentException("No restriction for " + propertyName);
@@ -131,6 +121,7 @@ public class PropertyContentIndex implem
public boolean next() {
if (it.hasNext()) {
currentPath = it.next();
+ return true;
}
return false;
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingCursor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingCursor.java?rev=1333504&r1=1333503&r2=1333504&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingCursor.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingCursor.java Thu May 3 15:29:42 2012
@@ -41,6 +41,9 @@ public class TraversingCursor implements
private boolean loadChildren(String path, long offset) {
String s = mk.getNodes(path, revisionId, 0, offset, childBlockSize, null);
+ if (s == null) {
+ return false;
+ }
NodeCursor c = new NodeCursor();
c.node = NodeImpl.parse(s);
c.node.setPath(path);
@@ -56,7 +59,11 @@ public class TraversingCursor implements
if (currentPath == null) {
return null;
}
- currentNode = NodeImpl.parse(mk.getNodes(currentPath, revisionId));
+ String s = mk.getNodes(currentPath, revisionId);
+ if (s == null) {
+ return null;
+ }
+ currentNode = NodeImpl.parse(s);
currentNode.setPath(currentPath);
}
return currentNode;
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/QueryIndexProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/QueryIndexProvider.java?rev=1333504&r1=1333503&r2=1333504&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/QueryIndexProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/QueryIndexProvider.java Thu May 3 15:29:42 2012
@@ -23,18 +23,12 @@ import org.apache.jackrabbit.mk.api.Micr
/**
* A mechanism to index data. Indexes might be added or removed at runtime,
- * possibly by changing content in the repository. The provider knows about
- * indexes, and informs the query engine about indexes that where added or
- * removed at runtime.
+ * possibly by changing content in the repository. The provider knows about the
+ * indexes available at a given time.
*/
public interface QueryIndexProvider {
/**
- * Initialize the instance.
- */
- void init();
-
- /**
* Get the currently configured indexes for the given MicroKernel instance.
*
* @param mk the MicroKernel instance
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PrefixIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PrefixIndexTest.java?rev=1333504&r1=1333503&r2=1333504&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PrefixIndexTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PrefixIndexTest.java Thu May 3 15:29:42 2012
@@ -30,7 +30,7 @@ public class PrefixIndexTest {
@Test
public void test() {
MicroKernel mk = new MicroKernelImpl();
- Indexer indexer = new Indexer(mk, "index");
+ Indexer indexer = new Indexer(mk, mk, "index");
indexer.init();
PrefixIndex index = indexer.createPrefixIndex("d:");
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PropertyIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PropertyIndexTest.java?rev=1333504&r1=1333503&r2=1333504&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PropertyIndexTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/index/PropertyIndexTest.java Thu May 3 15:29:42 2012
@@ -29,7 +29,7 @@ public class PropertyIndexTest {
@Test
public void test() {
MicroKernel mk = new MicroKernelImpl();
- Indexer indexer = new Indexer(mk, "index");
+ Indexer indexer = new Indexer(mk, mk, "index");
indexer.init();
PropertyIndex index = indexer.createPropertyIndex("id", true);
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/wrapper/IndexWrapperTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/wrapper/IndexWrapperTest.java?rev=1333504&r1=1333503&r2=1333504&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/wrapper/IndexWrapperTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/mk/wrapper/IndexWrapperTest.java Thu May 3 15:29:42 2012
@@ -36,47 +36,47 @@ public class IndexWrapperTest {
@Test
public void getNodes() {
- assertNull(mk.getNodes("/index/unknown", head));
+ assertNull(mk.getNodes("/jcr:system/indexes/unknown", head));
assertNull(mk.getNodes("/unknown", head));
}
@Test
public void prefix() {
- head = mk.commit("/index", "+ \"prefix:x\": {}", head, "");
+ head = mk.commit("/jcr:system/indexes", "+ \"prefix:x\": {}", head, "");
head = mk.commit("/", "+ \"n1\": { \"value\":\"a:no\" }", head, "");
head = mk.commit("/", "+ \"n2\": { \"value\":\"x:yes\" }", head, "");
head = mk.commit("/", "+ \"n3\": { \"value\":\"x:a\" }", head, "");
head = mk.commit("/", "+ \"n4\": { \"value\":\"x:a\" }", head, "");
- String empty = mk.getNodes("/index/prefix:x?x:no", head);
+ String empty = mk.getNodes("/jcr:system/indexes/prefix:x?x:no", head);
assertEquals("[]", empty);
- String yes = mk.getNodes("/index/prefix:x?x:yes", head);
+ String yes = mk.getNodes("/jcr:system/indexes/prefix:x?x:yes", head);
assertEquals("[\"/n2/value\"]", yes);
- String a = mk.getNodes("/index/prefix:x?x:a", head);
+ String a = mk.getNodes("/jcr:system/indexes/prefix:x?x:a", head);
assertEquals("[\"/n3/value\",\"/n4/value\"]", a);
}
@Test
public void propertyUnique() {
- head = mk.commit("/index", "+ \"property:id,unique\": {}", head, "");
+ head = mk.commit("/jcr:system/indexes", "+ \"property:id,unique\": {}", head, "");
head = mk.commit("/", "+ \"n1\": { \"value\":\"empty\" }", head, "");
head = mk.commit("/", "+ \"n2\": { \"id\":\"1\" }", head, "");
- String empty = mk.getNodes("/index/property:id,unique?0", head);
+ String empty = mk.getNodes("/jcr:system/indexes/property:id,unique?0", head);
assertEquals("[]", empty);
- String one = mk.getNodes("/index/property:id,unique?1", head);
+ String one = mk.getNodes("/jcr:system/indexes/property:id,unique?1", head);
assertEquals("[\"/n2\"]", one);
}
@Test
public void propertyNonUnique() {
- head = mk.commit("/index", "+ \"property:ref\": {}", head, "");
+ head = mk.commit("/jcr:system/indexes", "+ \"property:ref\": {}", head, "");
head = mk.commit("/", "+ \"n1\": { \"ref\":\"a\" }", head, "");
head = mk.commit("/", "+ \"n2\": { \"ref\":\"b\" }", head, "");
head = mk.commit("/", "+ \"n3\": { \"ref\":\"b\" }", head, "");
- String empty = mk.getNodes("/index/property:ref?no", head);
+ String empty = mk.getNodes("/jcr:system/indexes/property:ref?no", head);
assertEquals("[]", empty);
- String one = mk.getNodes("/index/property:ref?a", head);
+ String one = mk.getNodes("/jcr:system/indexes/property:ref?a", head);
assertEquals("[\"/n1\"]", one);
- String two = mk.getNodes("/index/property:ref?b", head);
+ String two = mk.getNodes("/jcr:system/indexes/property:ref?b", head);
assertEquals("[\"/n2\",\"/n3\"]", two);
}
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java?rev=1333504&r1=1333503&r2=1333504&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java Thu May 3 15:29:42 2012
@@ -16,8 +16,8 @@
*/
package org.apache.jackrabbit.oak.query;
-import org.apache.jackrabbit.mk.api.MicroKernel;
import org.apache.jackrabbit.mk.core.MicroKernelImpl;
+import org.apache.jackrabbit.mk.index.IndexWrapper;
import org.apache.jackrabbit.oak.api.CoreValueFactory;
import org.apache.jackrabbit.oak.kernel.KernelNodeStore;
import org.apache.jackrabbit.oak.spi.state.NodeStore;
@@ -28,7 +28,7 @@ import org.apache.jackrabbit.oak.spi.sta
public abstract class AbstractQueryTest {
// TODO improve: use ContentRepository here instead of creating mk instance.
- protected final MicroKernel mk = new MicroKernelImpl();
+ protected final IndexWrapper mk = new IndexWrapper(new MicroKernelImpl());
protected final NodeStore store = new KernelNodeStore(mk);
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java?rev=1333504&r1=1333503&r2=1333504&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java Thu May 3 15:29:42 2012
@@ -27,12 +27,10 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
-import org.apache.jackrabbit.mk.index.Indexer;
import org.apache.jackrabbit.oak.api.CoreValue;
import org.apache.jackrabbit.oak.api.Result;
import org.apache.jackrabbit.oak.api.ResultRow;
import org.apache.jackrabbit.oak.spi.QueryIndexProvider;
-import org.junit.Before;
import org.junit.Test;
/**
@@ -40,14 +38,9 @@ import org.junit.Test;
*/
public class QueryTest extends AbstractQueryTest {
- private QueryIndexProvider ip = new Indexer(mk);
+ private QueryIndexProvider ip = mk.getIndexer();
private QueryEngineImpl qe = new QueryEngineImpl(store, mk, ip);
- @Before
- public void setup() {
- qe.init();
- }
-
@Test
public void script() throws Exception {
test("queryTest.txt");
@@ -151,9 +144,13 @@ public class QueryTest extends AbstractQ
errors = true;
}
}
- } else {
+ } else if (line.startsWith("commit")) {
w.println(line);
- mk.commit("/", line, mk.getHeadRevision(), "");
+ line = line.substring("commit".length()).trim();
+ int spaceIndex = line.indexOf(' ');
+ String path = line.substring(0, spaceIndex).trim();
+ String diff = line.substring(spaceIndex).trim();
+ mk.commit(path, diff, mk.getHeadRevision(), "");
}
}
} finally {
Modified: jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryTest.txt
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryTest.txt?rev=1333504&r1=1333503&r2=1333504&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryTest.txt (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/queryTest.txt Thu May 3 15:29:42 2012
@@ -21,7 +21,24 @@
# * new tests are typically be added on top, after the syntax docs
# * use ascii character only
-+ "test": { "jcr:resource": {}, "resource": { "x" : {}}}
+# test the property content index
+
+commit / + "test": { "a": { "id": "10" }, "b": { "id" : "20" }}
+commit /jcr:system/indexes + "property:id": {}
+
+explain select * from [nt:base] where id = '10'
+nt:base AS nt:base /* propertyIndex "id [10..10]" */
+
+select * from [nt:base] where id = '10'
+/test/a
+
+explain select * from [nt:base] where id > '10'
+nt:base AS nt:base /* traverse "//*" */
+
+commit / - "test"
+commit /jcr:system/indexes - "property:id"
+
+commit / + "test": { "jcr:resource": {}, "resource": { "x" : {}}}
select * from [nt:base] where id = -1
@@ -54,10 +71,10 @@ select * from [nt:base] as x where isdes
/test/resource
/test/resource/x
-- "test"
+commit / - "test"
-+ "parents": { "p0": {"id": "0"}, "p1": {"id": "1"}, "p2": {"id": "2"}}
-+ "children": { "c1": {"p": "1"}, "c2": {"p": "1"}, "c3": {"p": "2"}, "c4": {"p": "3"}}
+commit / + "parents": { "p0": {"id": "0"}, "p1": {"id": "1"}, "p2": {"id": "2"}}
+commit / + "children": { "c1": {"p": "1"}, "c2": {"p": "1"}, "c3": {"p": "2"}, "c4": {"p": "3"}}
# relative property
select * from [nt:base] where [c1/p] = '1'
@@ -117,11 +134,11 @@ select * from [nt:base] as p inner join
explain select * from [nt:base] as p inner join [nt:base] as c on p.id = c.p
nt:base AS p /* traverse "//*" */ INNER JOIN nt:base AS c /* traverse "//*" */
-- "parents"
-- "children"
+commit / - "parents"
+commit / - "children"
-+ "test": { "hello": { "x": "1" }, "world": { "x": "2" } }
-+ "test2": { "id":"1", "x": "2" }
+commit / + "test": { "hello": { "x": "1" }, "world": { "x": "2" } }
+commit / + "test2": { "id":"1", "x": "2" }
select * from [nt:base]
/
@@ -155,14 +172,14 @@ select * from [nt:base] where x is null
/jcr:system/indexes
/test
-- "test"
-- "test2"
+commit / - "test"
+commit / - "test2"
-+ "test": { "name": "hello" }
-+ "test2": { "name": "World!" }
-+ "test3": { "name": "Hallo" }
-+ "test4": { "name": "10%" }
-+ "test5": { "name": "10 percent" }
+commit / + "test": { "name": "hello" }
+commit / + "test2": { "name": "World!" }
+commit / + "test3": { "name": "Hallo" }
+commit / + "test4": { "name": "10%" }
+commit / + "test5": { "name": "10 percent" }
select name from [nt:base] order by upper(name)
10 percent