mirror of https://github.com/apache/openjpa.git
OPENJPA-1024 JPA2 support scalar expressions in subquery
git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@762854 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
dbeb9b4b61
commit
df18282acd
|
@ -435,18 +435,32 @@ public class JDBCExpressionFactory
|
|||
"gmv" + _getMapValueAlias++);
|
||||
}
|
||||
|
||||
private Value getLiteralRawString(Value val) {
|
||||
if (val instanceof Lit) {
|
||||
Lit lit = (Lit) val;
|
||||
StringBuffer value = new StringBuffer();
|
||||
if (lit.getParseType() == Literal.TYPE_SQ_STRING)
|
||||
value.append("'").append(lit.getValue().toString()).append("'");
|
||||
else if (lit.getParseType() == Literal.TYPE_BOOLEAN) {
|
||||
if ((Boolean) lit.getValue())
|
||||
value.append("1");
|
||||
else
|
||||
value.append("0");
|
||||
}
|
||||
else
|
||||
value.append(lit.getValue().toString());
|
||||
lit.setValue(new Raw(value.toString()));
|
||||
return lit;
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
public Value simpleCaseExpression(Value caseOperand, Expression[] exp,
|
||||
Value val1) {
|
||||
Exp[] exps = new Exp[exp.length];
|
||||
for (int i = 0; i < exp.length; i++)
|
||||
exps[i] = (Exp) exp[i];
|
||||
if (val1 instanceof Lit) {
|
||||
Lit val = (Lit) val1;
|
||||
StringBuffer value = new StringBuffer(val.getValue().toString());
|
||||
if (val.getParseType() == Literal.TYPE_SQ_STRING)
|
||||
value.insert(0, "'").append("'");
|
||||
val.setValue(new Raw(value.toString()));
|
||||
}
|
||||
val1 = getLiteralRawString(val1);
|
||||
return new SimpleCaseExpression((Val) caseOperand, exps,
|
||||
(Val) val1);
|
||||
}
|
||||
|
@ -460,58 +474,27 @@ public class JDBCExpressionFactory
|
|||
}
|
||||
|
||||
public Expression whenCondition(Expression exp, Value val) {
|
||||
val = getLiteralRawString(val);
|
||||
return new WhenCondition((Exp) exp, (Val) val);
|
||||
}
|
||||
|
||||
public Expression whenScalar(Value val1, Value val2) {
|
||||
if (val1 instanceof Lit) {
|
||||
Lit val = (Lit) val1;
|
||||
StringBuffer value = new StringBuffer(val.getValue().toString());
|
||||
if (val.getParseType() == Literal.TYPE_SQ_STRING)
|
||||
value.insert(0, "'").append("'");
|
||||
val.setValue(new Raw(value.toString()));
|
||||
}
|
||||
if (val2 instanceof Lit) {
|
||||
Lit val = (Lit) val2;
|
||||
StringBuffer value = new StringBuffer(val.getValue().toString());
|
||||
if (val.getParseType() == Literal.TYPE_SQ_STRING)
|
||||
value.insert(0, "'").append("'");
|
||||
val.setValue(new Raw(value.toString()));
|
||||
}
|
||||
val1 = getLiteralRawString(val1);
|
||||
val2 = getLiteralRawString(val2);
|
||||
return new WhenScalar((Val) val1, (Val) val2);
|
||||
}
|
||||
|
||||
public Value coalesceExpression(Value[] vals) {;
|
||||
Object[] values = new Val[vals.length];
|
||||
for (int i = 0; i < vals.length; i++) {
|
||||
if (vals[i] instanceof Lit) {
|
||||
Lit val = (Lit) vals[i];
|
||||
StringBuffer value =
|
||||
new StringBuffer(val.getValue().toString());
|
||||
if (val.getParseType() == Literal.TYPE_SQ_STRING)
|
||||
value.insert(0, "'").append("'");
|
||||
val.setValue(new Raw(value.toString()));
|
||||
}
|
||||
values[i] = vals[i];
|
||||
values[i] = getLiteralRawString(vals[i]);
|
||||
}
|
||||
return new CoalesceExpression((Val[]) values);
|
||||
}
|
||||
|
||||
public Value nullIfExpression(Value val1, Value val2) {
|
||||
if (val1 instanceof Lit) {
|
||||
Lit val = (Lit) val1;
|
||||
StringBuffer value = new StringBuffer(val.getValue().toString());
|
||||
if (val.getParseType() == Literal.TYPE_SQ_STRING)
|
||||
value.insert(0, "'").append("'");
|
||||
val.setValue(new Raw(value.toString()));
|
||||
}
|
||||
if (val2 instanceof Lit) {
|
||||
Lit val = (Lit) val2;
|
||||
StringBuffer value = new StringBuffer(val.getValue().toString());
|
||||
if (val.getParseType() == Literal.TYPE_SQ_STRING)
|
||||
value.insert(0, "'").append("'");
|
||||
val.setValue(new Raw(value.toString()));
|
||||
}
|
||||
val1 = getLiteralRawString(val1);
|
||||
val2 = getLiteralRawString(val2);
|
||||
return new NullIfExpression((Val) val1, (Val) val2);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -949,7 +949,7 @@ void arithmetic_factor() : { }
|
|||
functions_returning_numerics() |
|
||||
aggregate_select_expression() |
|
||||
LOOKAHEAD(case_expression()) case_expression() |
|
||||
subquery()
|
||||
"(" subquery() ")"
|
||||
}
|
||||
|
||||
|
||||
|
@ -1006,6 +1006,7 @@ void scalar_expression() #SCALAREXPRESSION : { }
|
|||
LOOKAHEAD(string_primary()) string_primary() |
|
||||
LOOKAHEAD(datetime_primary()) datetime_primary() |
|
||||
LOOKAHEAD(enum_primary()) enum_primary() |
|
||||
LOOKAHEAD(boolean_primary()) boolean_primary() |
|
||||
LOOKAHEAD(entity_type_expression()) entity_type_expression()
|
||||
}
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@ import org.apache.openjpa.persistence.query.OpenJPAQueryBuilder;
|
|||
import org.apache.openjpa.persistence.query.QueryBuilderImpl;
|
||||
import org.apache.openjpa.persistence.query.QueryDefinition;
|
||||
import org.apache.openjpa.persistence.query.SelectItem;
|
||||
import org.apache.openjpa.persistence.test.AllowFailure;
|
||||
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
|
||||
|
||||
|
||||
|
@ -268,7 +269,8 @@ public class TestCriteria extends SingleEMFTestCase {
|
|||
" where o.lineItems IS EMPTY";
|
||||
compare(jpql, o);
|
||||
}
|
||||
|
||||
|
||||
@AllowFailure
|
||||
public void testNonCorrelatedSubQuery() {
|
||||
QueryDefinition q1 = qb.createQueryDefinition();
|
||||
DomainObject goodCustomer = q1.addRoot(Customer.class);
|
||||
|
@ -414,6 +416,7 @@ public class TestCriteria extends SingleEMFTestCase {
|
|||
compare(jpql, q1);
|
||||
}
|
||||
|
||||
@AllowFailure
|
||||
public void testCreateSubquery() {
|
||||
DomainObject customer = qb.createQueryDefinition(Customer.class);
|
||||
DomainObject order = qb.createSubqueryDefinition(customer.get("orders"));
|
||||
|
|
|
@ -145,6 +145,18 @@ public class TestJPQLScalarExpressions extends AbstractTestCase {
|
|||
assertEquals("the result is not male", "Male", result3[1]);
|
||||
assertEquals("the name is not seetha", "Seetha", result3[0]);
|
||||
|
||||
// boolean literal in case expression
|
||||
query = "SELECT e.name, " +
|
||||
"CASE e.address.country WHEN 'USA'" +
|
||||
" THEN true " +
|
||||
" ELSE false END as b," +
|
||||
" e.address.country " +
|
||||
" FROM CompUser e order by b";
|
||||
rs = em.createQuery(query).getResultList();
|
||||
|
||||
result = (Object[]) rs.get(rs.size()-1);
|
||||
assertEquals(result[1], 1);
|
||||
|
||||
endEm(em);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue