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:
Catalina Wei 2009-04-07 17:06:19 +00:00
parent dbeb9b4b61
commit df18282acd
4 changed files with 45 additions and 46 deletions

View File

@ -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);
}
}

View File

@ -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()
}

View File

@ -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;
@ -269,6 +270,7 @@ public class TestCriteria extends SingleEMFTestCase {
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"));

View File

@ -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);
}