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 2013/10/29 09:14:22 UTC
svn commit: r1536602 - in /jackrabbit/oak/trunk:
oak-core/src/main/java/org/apache/jackrabbit/oak/api/
oak-core/src/main/java/org/apache/jackrabbit/oak/query/
oak-core/src/test/java/org/apache/jackrabbit/oak/query/
oak-jcr/src/main/java/org/apache/jack...
Author: thomasm
Date: Tue Oct 29 08:14:22 2013
New Revision: 1536602
URL: http://svn.apache.org/r1536602
Log:
OAK-1106 Query engine does not deal with remapped namespaces (namespace remapping while parsing)
Modified:
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/query/QueryEngineImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2ParserTest.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryImpl.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/RemappingTest.java
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=1536602&r1=1536601&r2=1536602&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 Tue Oct 29 08:14:22 2013
@@ -42,10 +42,12 @@ public interface QueryEngine {
*
* @param statement
* @param language
+ * @param namePathMapper the name and path mapper to use
* @return the list of bind variable names
* @throws ParseException
*/
- List<String> getBindVariableNames(String statement, String language) throws ParseException;
+ List<String> getBindVariableNames(String statement, String language,
+ NamePathMapper namePathMapper) throws ParseException;
/**
* Execute a query and get the result.
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=1536602&r1=1536601&r2=1536602&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 Tue Oct 29 08:14:22 2013
@@ -88,17 +88,18 @@ public abstract class QueryEngineImpl im
* @throws ParseException
*/
@Override
- public List<String> getBindVariableNames(String statement, String language) throws ParseException {
- Query q = parseQuery(statement, language, getExecutionContext());
+ public List<String> getBindVariableNames(String statement, String language, NamePathMapper namePathMapper) throws ParseException {
+ Query q = parseQuery(statement, language, getExecutionContext(), namePathMapper);
return q.getBindVariableNames();
}
- private static Query parseQuery(String statement, String language, ExecutionContext context) throws ParseException {
+ private static Query parseQuery(String statement, String language,
+ ExecutionContext context, NamePathMapper namePathMapper) throws ParseException {
LOG.debug("Parsing {} statement: {}", language, statement);
NodeState root = context.getRootState();
NodeState system = root.getChildNode(JCR_SYSTEM);
NodeState types = system.getChildNode(JCR_NODE_TYPES);
- SQL2Parser parser = new SQL2Parser(types);
+ SQL2Parser parser = new SQL2Parser(namePathMapper, types);
if (language.endsWith(NO_LITERALS)) {
language = language.substring(0, language.length() - NO_LITERALS.length());
parser.setAllowNumberLiterals(false);
@@ -116,7 +117,10 @@ public abstract class QueryEngineImpl im
try {
return parser.parse(sql2);
} catch (ParseException e) {
- throw new ParseException(statement + " converted to SQL-2 " + e.getMessage(), 0);
+ ParseException e2 = new ParseException(
+ statement + " converted to SQL-2 " + e.getMessage(), 0);
+ e2.initCause(e);
+ throw e2;
}
} else {
throw new ParseException("Unsupported language: " + language, 0);
@@ -135,7 +139,7 @@ public abstract class QueryEngineImpl im
}
ExecutionContext context = getExecutionContext();
- Query q = parseQuery(statement, language, context);
+ Query q = parseQuery(statement, language, context, namePathMapper);
q.setExecutionContext(context);
q.setNamePathMapper(namePathMapper);
q.setLimit(limit);
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java?rev=1536602&r1=1536601&r2=1536602&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java Tue Oct 29 08:14:22 2013
@@ -27,10 +27,12 @@ import java.util.HashMap;
import java.util.Map;
import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
import org.apache.jackrabbit.oak.api.PropertyValue;
import org.apache.jackrabbit.oak.api.Type;
import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.namepath.NamePathMapper;
import org.apache.jackrabbit.oak.query.ast.AstElementFactory;
import org.apache.jackrabbit.oak.query.ast.BindVariableValueImpl;
import org.apache.jackrabbit.oak.query.ast.ColumnImpl;
@@ -98,12 +100,16 @@ public class SQL2Parser {
private boolean supportSQL1;
+ private NamePathMapper namePathMapper;
+
/**
* Create a new parser. A parser can be re-used, but it is not thread safe.
*
+ * @param namePathMapper the name-path mapper to use
* @param types the node with the node type information
*/
- public SQL2Parser(NodeState types) {
+ public SQL2Parser(NamePathMapper namePathMapper, NodeState types) {
+ this.namePathMapper = namePathMapper;
this.types = checkNotNull(types);
}
@@ -206,6 +212,15 @@ public class SQL2Parser {
private SelectorImpl parseSelector() throws ParseException {
String nodeTypeName = readName();
+ if (namePathMapper != null) {
+ try {
+ nodeTypeName = namePathMapper.getOakName(nodeTypeName);
+ } catch (RepositoryException e) {
+ ParseException e2 = getSyntaxError("could not convert node type name " + nodeTypeName);
+ e2.initCause(e);
+ throw e2;
+ }
+ }
NodeState type = types.getChildNode(nodeTypeName);
if (!type.exists()) {
throw getSyntaxError("unknown node type");
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2ParserTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2ParserTest.java?rev=1536602&r1=1536601&r2=1536602&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2ParserTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2ParserTest.java Tue Oct 29 08:14:22 2013
@@ -35,7 +35,7 @@ public class SQL2ParserTest {
private final NodeState types =
INITIAL_CONTENT.getChildNode(JCR_SYSTEM).getChildNode(JCR_NODE_TYPES);
- private final SQL2Parser p = new SQL2Parser(types);
+ private final SQL2Parser p = new SQL2Parser(null, types);
@Test
public void testIgnoreSqlComment() throws ParseException {
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryImpl.java?rev=1536602&r1=1536601&r2=1536602&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryImpl.java Tue Oct 29 08:14:22 2013
@@ -74,11 +74,18 @@ public class QueryImpl implements Query
bindVariableMap.put(varName, value);
}
- private void parse() throws InvalidQueryException {
+ private void parse() throws InvalidQueryException, RepositoryException {
if (parsed) {
return;
}
- List<String> names = manager.parse(statement, language);
+ List<String> names = sessionContext.getSessionDelegate().perform(
+ new SessionOperation<List<String>>() {
+ @Override
+ public List<String> perform() throws RepositoryException {
+ return manager.parse(statement, language);
+ }
+ });
+
for (String n : names) {
bindVariableMap.put(n, null);
}
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java?rev=1536602&r1=1536601&r2=1536602&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java Tue Oct 29 08:14:22 2013
@@ -108,7 +108,7 @@ public class QueryManagerImpl implements
*/
public List<String> parse(String statement, String language) throws InvalidQueryException {
try {
- return queryEngine.getBindVariableNames(statement, language);
+ return queryEngine.getBindVariableNames(statement, language, sessionContext);
} catch (ParseException e) {
throw new InvalidQueryException(e);
}
Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/RemappingTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/RemappingTest.java?rev=1536602&r1=1536601&r2=1536602&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/RemappingTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/RemappingTest.java Tue Oct 29 08:14:22 2013
@@ -21,6 +21,7 @@ import javax.jcr.NodeIterator;
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
+import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
@@ -96,7 +97,26 @@ public class RemappingTest extends Abstr
assertEquals(resultPath, ni.nextNode().getPath());
}
+ public void testQuery4() throws Exception {
+ String statement =
+ "/jcr:root/myRep:security/myRep:authorizables//" +
+ "element(*,myRep:Authorizable)[@my:property='value']";
+
+ QueryManager qm = session.getWorkspace().getQueryManager();
+ Query q = qm.createQuery(statement, "xpath");
+
+ q.getBindVariableNames();
+
+ QueryResult qr = q.execute();
+ NodeIterator ni = qr.getNodes();
+ while (ni.hasNext()) {
+ ni.next();
+ }
+
+ }
+
private String createStatement(String propertyName, String value) throws RepositoryException {
return "/jcr:root"+ testRootNode.getPath() +"/my:node//element(*)[@"+propertyName+"='"+value+"']";
}
+
}
\ No newline at end of file