Revision: 15218
http://datanucleus.svn.sourceforge.net/datanucleus/?rev=15218&view=rev
Author: andy_jefferson
Date: 2012-07-20 11:11:16 +0000 (Fri, 20 Jul 2012)
Log Message:
-----------
[NUCCORE-878] Pass query language into in-memory evaluator, and use it to convert the JPQL LIKE expression to a String.matches expression
Modified Paths:
--------------
platform/core/trunk/src/java/org/datanucleus/query/QueryUtils.java
platform/core/trunk/src/java/org/datanucleus/query/evaluator/JavaQueryEvaluator.java
platform/core/trunk/src/java/org/datanucleus/query/evaluator/memory/InMemoryExpressionEvaluator.java
platform/core/trunk/src/java/org/datanucleus/query/evaluator/memory/StringMatchesMethodEvaluator.java
Modified: platform/core/trunk/src/java/org/datanucleus/query/QueryUtils.java
===================================================================
--- platform/core/trunk/src/java/org/datanucleus/query/QueryUtils.java 2012-07-20 09:57:32 UTC (rev 15217)
+++ platform/core/trunk/src/java/org/datanucleus/query/QueryUtils.java 2012-07-20 11:11:16 UTC (rev 15218)
@@ -1270,7 +1270,8 @@
}
}
- public static List orderCandidates(List candidates, Class type, String ordering, ExecutionContext ec, ClassLoaderResolver clr)
+ public static List orderCandidates(List candidates, Class type, String ordering, ExecutionContext ec,
+ ClassLoaderResolver clr, String queryLanguage)
{
if (candidates == null || candidates.isEmpty() || ordering == null || ordering.equals("#PK"))
{
@@ -1281,7 +1282,7 @@
null, type, null, null, null, ordering, null, null, null, null, null);
QueryCompilation compilation = compiler.compile(null, null);
return QueryUtils.orderCandidates(candidates, compilation.getExprOrdering(), new HashMap(), "this", ec, clr,
- null, null);
+ null, null, queryLanguage);
}
/**
@@ -1298,7 +1299,7 @@
*/
public static List orderCandidates(List candidates, final Expression[] ordering, final Map state,
final String candidateAlias, final ExecutionContext ec, final ClassLoaderResolver clr,
- final Map parameterValues, final Imports imports)
+ final Map parameterValues, final Imports imports, final String queryLanguage)
{
if (ordering == null)
{
@@ -1315,11 +1316,11 @@
{
state.put(candidateAlias, obj1);
Object a = ordering[i].evaluate(
- new InMemoryExpressionEvaluator(ec, parameterValues, state, imports, clr, candidateAlias));
+ new InMemoryExpressionEvaluator(ec, parameterValues, state, imports, clr, candidateAlias, queryLanguage));
state.put(candidateAlias, obj2);
Object b = ordering[i].evaluate(
- new InMemoryExpressionEvaluator(ec, parameterValues, state, imports, clr, candidateAlias));
+ new InMemoryExpressionEvaluator(ec, parameterValues, state, imports, clr, candidateAlias, queryLanguage));
// Put any null values at the end
if (a == null && b == null)
Modified: platform/core/trunk/src/java/org/datanucleus/query/evaluator/JavaQueryEvaluator.java
===================================================================
--- platform/core/trunk/src/java/org/datanucleus/query/evaluator/JavaQueryEvaluator.java 2012-07-20 09:57:32 UTC (rev 15217)
+++ platform/core/trunk/src/java/org/datanucleus/query/evaluator/JavaQueryEvaluator.java 2012-07-20 11:11:16 UTC (rev 15218)
@@ -106,7 +106,7 @@
state.put(this.candidateAlias, query.getCandidateClass());
evaluator = new InMemoryExpressionEvaluator(query.getExecutionContext(),
- parameterValues, state, query.getParsedImports(), clr, this.candidateAlias);
+ parameterValues, state, query.getParsedImports(), clr, this.candidateAlias, query.getLanguage());
}
/**
@@ -324,7 +324,7 @@
InMemoryExpressionEvaluator eval =
new InMemoryExpressionEvaluator(query.getExecutionContext(),
- parameterValues, state, query.getParsedImports(), clr, candidateAlias);
+ parameterValues, state, query.getParsedImports(), clr, candidateAlias, query.getLanguage());
Object evalResult = evaluateBooleanExpression(filter, eval);
if (Boolean.TRUE.equals(evalResult))
@@ -469,7 +469,7 @@
state.put(RESULTS_SET, set);
return QueryUtils.orderCandidates(set, ordering, state, candidateAlias,
- query.getExecutionContext(), clr, parameterValues, query.getParsedImports());
+ query.getExecutionContext(), clr, parameterValues, query.getParsedImports(), query.getLanguage());
}
/**
Modified: platform/core/trunk/src/java/org/datanucleus/query/evaluator/memory/InMemoryExpressionEvaluator.java
===================================================================
--- platform/core/trunk/src/java/org/datanucleus/query/evaluator/memory/InMemoryExpressionEvaluator.java 2012-07-20 09:57:32 UTC (rev 15217)
+++ platform/core/trunk/src/java/org/datanucleus/query/evaluator/memory/InMemoryExpressionEvaluator.java 2012-07-20 11:11:16 UTC (rev 15218)
@@ -65,6 +65,8 @@
protected static final Localiser LOCALISER = Localiser.getInstance(
"org.datanucleus.Localisation", org.datanucleus.ClassConstants.NUCLEUS_CONTEXT_LOADER);
+ String queryLanguage = null;
+
Stack stack = new Stack();
/** Map of input parameter values, keyed by their name. */
@@ -97,7 +99,7 @@
* @param candidateAlias Alias for the candidate class. With JDOQL this is "this".
*/
public InMemoryExpressionEvaluator(ExecutionContext ec, Map params, Map<String, Object> state,
- Imports imports, ClassLoaderResolver clr, String candidateAlias)
+ Imports imports, ClassLoaderResolver clr, String candidateAlias, String queryLang)
{
this.ec = ec;
this.queryMgr = ec.getStoreManager().getQueryManager();
@@ -106,6 +108,7 @@
this.imports = imports;
this.clr = clr;
this.candidateAlias = candidateAlias;
+ this.queryLanguage = queryLang;
}
public Map getParameterValues()
@@ -113,6 +116,11 @@
return parameterValues;
}
+ public String getQueryLanguage()
+ {
+ return queryLanguage;
+ }
+
/* (non-Javadoc)
* @see org.datanucleus.query.evaluator.AbstractExpressionEvaluator#processAndExpression(org.datanucleus.query.expression.Expression)
*/
Modified: platform/core/trunk/src/java/org/datanucleus/query/evaluator/memory/StringMatchesMethodEvaluator.java
===================================================================
--- platform/core/trunk/src/java/org/datanucleus/query/evaluator/memory/StringMatchesMethodEvaluator.java 2012-07-20 09:57:32 UTC (rev 15217)
+++ platform/core/trunk/src/java/org/datanucleus/query/evaluator/memory/StringMatchesMethodEvaluator.java 2012-07-20 11:11:16 UTC (rev 15218)
@@ -25,6 +25,7 @@
import org.datanucleus.query.expression.PrimaryExpression;
import org.datanucleus.util.Localiser;
import org.datanucleus.util.NucleusLogger;
+import org.datanucleus.util.StringUtils;
/**
* Evaluator for the method "{stringExpr}.matches(expr)".
@@ -81,7 +82,16 @@
{
throw new NucleusException(method + "(param) where param is instanceof " + param.getClass().getName() + " not supported");
}
+
arg = QueryUtils.getStringValue(argObj);
+ if (eval.getQueryLanguage().equalsIgnoreCase("JPQL"))
+ {
+ // Convert JPQL like expression to String.matches input
+ String matchesArg = arg;
+ matchesArg = StringUtils.replaceAll(matchesArg, "%", ".*");
+ matchesArg = StringUtils.replaceAll(matchesArg, "_", ".");
+ arg = matchesArg;
+ }
return ((String)invokedValue).matches(arg) ? Boolean.TRUE : Boolean.FALSE;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|