in odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java [96:290]
public static String parseToJPAWhereExpression(final CommonExpression whereExpression, final String tableAlias,
int index, Map<Integer,Object> positionalParameters,EdmMapping edmMapping) throws ODataException {
switch (whereExpression.getKind()) {
case UNARY:
final UnaryExpression unaryExpression = (UnaryExpression) whereExpression;
final String operand = parseToJPAWhereExpression(unaryExpression.getOperand(), tableAlias,
index, positionalParameters, edmMapping);
switch (unaryExpression.getOperator()) {
case NOT:
return JPQLStatement.Operator.NOT + JPQLStatement.DELIMITER.PARENTHESIS_LEFT + operand
+ JPQLStatement.DELIMITER.PARENTHESIS_RIGHT; //$NON-NLS-1$ //$NON-NLS-2$
case MINUS:
if (operand.startsWith("-")) {
return operand.substring(1);
} else {
return "-" + operand; //$NON-NLS-1$
}
default:
throw new ODataNotImplementedException();
}
case FILTER:
return parseToJPAWhereExpression(((FilterExpression) whereExpression).getExpression(), tableAlias,
index, positionalParameters, edmMapping);
case BINARY:
final BinaryExpression binaryExpression = (BinaryExpression) whereExpression;
MethodOperator operator = null;
if (binaryExpression.getLeftOperand().getKind() == ExpressionKind.METHOD) {
operator = ((MethodExpression) binaryExpression.getLeftOperand()).getMethod();
}
if (operator != null && ((binaryExpression.getOperator() == BinaryOperator.EQ) ||
(binaryExpression.getOperator() == BinaryOperator.NE))) {
if (operator == MethodOperator.SUBSTRINGOF) {
methodFlag.set(1);
}
}
final String left = parseToJPAWhereExpression(binaryExpression.getLeftOperand(), tableAlias,
getIndexValue(index, positionalParameters), positionalParameters, edmMapping);
edmMapping = getEdmMapping(binaryExpression);
final String right = parseToJPAWhereExpression(binaryExpression.getRightOperand(), tableAlias,
getIndexValue(index, positionalParameters), positionalParameters, edmMapping);
// Special handling for STARTSWITH and ENDSWITH method expression
if (operator != null && (operator == MethodOperator.STARTSWITH || operator == MethodOperator.ENDSWITH)) {
if (!binaryExpression.getOperator().equals(BinaryOperator.EQ) &&
!(binaryExpression.getRightOperand() instanceof LiteralExpression) &&
("true".equals(right) || "false".equals(right))) {
throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.OPERATOR_EQ_NE_MISSING
.addContent(binaryExpression.getOperator().toString()), null);
} else if (binaryExpression.getOperator().equals(BinaryOperator.EQ)) {
if ("false".equals(right)) {
return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left.replaceFirst("LIKE", "NOT LIKE")
+ JPQLStatement.DELIMITER.SPACE
+ JPQLStatement.DELIMITER.PARENTHESIS_RIGHT;
} else if ("true".equals(right)){
return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left
+ JPQLStatement.DELIMITER.SPACE
+ JPQLStatement.DELIMITER.PARENTHESIS_RIGHT;
}
}
}
switch (binaryExpression.getOperator()) {
case AND:
return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left + JPQLStatement.DELIMITER.SPACE
+ JPQLStatement.Operator.AND + JPQLStatement.DELIMITER.SPACE
+ right + JPQLStatement.DELIMITER.PARENTHESIS_RIGHT;
case OR:
return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left + JPQLStatement.DELIMITER.SPACE
+ JPQLStatement.Operator.OR + JPQLStatement.DELIMITER.SPACE + right
+ JPQLStatement.DELIMITER.PARENTHESIS_RIGHT;
case EQ:
EdmSimpleType type = (EdmSimpleType)((BinaryExpression)whereExpression).getLeftOperand().getEdmType();
if(EdmSimpleTypeKind.String.getEdmSimpleTypeInstance().isCompatible(type)){
if(edmMapping== null || (edmMapping!=null && !(((JPAEdmMappingImpl)edmMapping).getJPAType()).isEnum())){
return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left + JPQLStatement.DELIMITER.SPACE
+ (!"null".equals(right) ? JPQLStatement.Operator.LIKE : "IS") + JPQLStatement.DELIMITER.SPACE + right
+ ("null".equals(right) ? "" : " ESCAPE '\\'") + JPQLStatement.DELIMITER.PARENTHESIS_RIGHT;
}
}
return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left + JPQLStatement.DELIMITER.SPACE
+ (!"null".equals(right) ? JPQLStatement.Operator.EQ : "IS") + JPQLStatement.DELIMITER.SPACE + right
+ JPQLStatement.DELIMITER.PARENTHESIS_RIGHT;
case NE:
EdmSimpleType edmType = (EdmSimpleType)((BinaryExpression)whereExpression).getLeftOperand().getEdmType();
if(EdmSimpleTypeKind.String.getEdmSimpleTypeInstance().isCompatible(edmType)){
return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left + JPQLStatement.DELIMITER.SPACE
+ (!"null".equals(right) ?
JPQLStatement.Operator.NOT +JPQLStatement.DELIMITER.SPACE + JPQLStatement.Operator.LIKE :
"IS" + JPQLStatement.DELIMITER.SPACE + JPQLStatement.Operator.NOT)
+ JPQLStatement.DELIMITER.SPACE + right + ("null".equals(right) ? "" :" ESCAPE '\\'")
+ JPQLStatement.DELIMITER.PARENTHESIS_RIGHT;
}
return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left + JPQLStatement.DELIMITER.SPACE
+ (!"null".equals(right) ?
JPQLStatement.Operator.NE :
"IS" + JPQLStatement.DELIMITER.SPACE + JPQLStatement.Operator.NOT)
+ JPQLStatement.DELIMITER.SPACE + right
+ JPQLStatement.DELIMITER.PARENTHESIS_RIGHT;
case LT:
return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left + JPQLStatement.DELIMITER.SPACE
+ JPQLStatement.Operator.LT + JPQLStatement.DELIMITER.SPACE + right
+ JPQLStatement.DELIMITER.PARENTHESIS_RIGHT;
case LE:
return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left + JPQLStatement.DELIMITER.SPACE
+ JPQLStatement.Operator.LE + JPQLStatement.DELIMITER.SPACE + right
+ JPQLStatement.DELIMITER.PARENTHESIS_RIGHT;
case GT:
return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left + JPQLStatement.DELIMITER.SPACE
+ JPQLStatement.Operator.GT + JPQLStatement.DELIMITER.SPACE + right
+ JPQLStatement.DELIMITER.PARENTHESIS_RIGHT;
case GE:
return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left + JPQLStatement.DELIMITER.SPACE
+ JPQLStatement.Operator.GE + JPQLStatement.DELIMITER.SPACE + right
+ JPQLStatement.DELIMITER.PARENTHESIS_RIGHT;
case PROPERTY_ACCESS:
throw new ODataNotImplementedException();
default:
throw new ODataNotImplementedException();
}
case PROPERTY:
String returnStr = tableAlias + JPQLStatement.DELIMITER.PERIOD
+ getPropertyName(whereExpression);
return returnStr;
case MEMBER:
String memberExpStr = EMPTY;
int i = 0;
MemberExpression member = null;
CommonExpression tempExp = whereExpression;
while (tempExp != null && tempExp.getKind() == ExpressionKind.MEMBER) {
member = (MemberExpression) tempExp;
if (i > 0) {
memberExpStr = JPQLStatement.DELIMITER.PERIOD + memberExpStr;
}
i++;
memberExpStr = getPropertyName(member.getProperty()) + memberExpStr;
tempExp = member.getPath();
}
memberExpStr =
getPropertyName(tempExp) + JPQLStatement.DELIMITER.PERIOD + memberExpStr;
return tableAlias + JPQLStatement.DELIMITER.PERIOD + memberExpStr;
case LITERAL:
final LiteralExpression literal = (LiteralExpression) whereExpression;
final EdmSimpleType literalType = (EdmSimpleType) literal.getEdmType();
EdmLiteral uriLiteral = EdmSimpleTypeKind.parseUriLiteral(literal.getUriLiteral());
Class<?> edmMap = edmMapping != null ?((JPAEdmMappingImpl)edmMapping).getJPAType(): null;
return evaluateComparingExpression(uriLiteral.getLiteral(), literalType, edmMap,
positionalParameters, index);
case METHOD:
final MethodExpression methodExpression = (MethodExpression) whereExpression;
String first = parseToJPAWhereExpression(methodExpression.getParameters().get(0), tableAlias,
getIndexValue(index, positionalParameters), positionalParameters, edmMapping);
String second =
methodExpression.getParameterCount() > 1 ? parseToJPAWhereExpression(methodExpression.getParameters().get(1),
tableAlias, getIndexValue(index, positionalParameters), positionalParameters, edmMapping) : null;
String third =
methodExpression.getParameterCount() > 2 ? parseToJPAWhereExpression(methodExpression.getParameters().get(2),
tableAlias, getIndexValue(index, positionalParameters), positionalParameters, edmMapping) : null;
switch (methodExpression.getMethod()) {
case SUBSTRING:
third = third != null ? ", " + third : "";
return String.format("SUBSTRING(%s, %s + 1 %s)", first, second, third);
case SUBSTRINGOF:
if (methodFlag.get() != null && methodFlag.get() == 1) {
methodFlag.set(null);
return String.format("(CASE WHEN (%s LIKE CONCAT('%%',CONCAT(%s,'%%')) ESCAPE '\\') "
+ "THEN TRUE ELSE FALSE END)",
second, first);
} else {
return String.format("(CASE WHEN (%s LIKE CONCAT('%%',CONCAT(%s,'%%')) ESCAPE '\\') "
+ "THEN TRUE ELSE FALSE END) = true",
second, first);
}
case TOLOWER:
return String.format("LOWER(%s)", first);
case TOUPPER:
return String.format("UPPER(%s)", first);
case STARTSWITH:
return String.format("%s LIKE CONCAT(%s,'%%') ESCAPE '\\'", first, second);
case ENDSWITH:
return String.format("%s LIKE CONCAT('%%',%s) ESCAPE '\\'", first, second);
default:
throw new ODataNotImplementedException();
}
default:
throw new ODataNotImplementedException();
}
}