use of com.revolsys.record.query.CollectionValue in project com.revolsys.open by revolsys.
the class QueryWhereConditionField method toQueryValue.
@SuppressWarnings("unchecked")
private <V extends QueryValue> V toQueryValue(final ValueNode expression) {
if (expression instanceof BetweenOperatorNode) {
final BetweenOperatorNode betweenExpression = (BetweenOperatorNode) expression;
final ValueNode leftValueNode = betweenExpression.getLeftOperand();
final ValueNodeList rightOperandList = betweenExpression.getRightOperandList();
final ValueNode betweenExpressionStart = rightOperandList.get(0);
final ValueNode betweenExpressionEnd = rightOperandList.get(1);
if (!(leftValueNode instanceof ColumnReference)) {
setInvalidMessage("Between operator must use a column name not: " + leftValueNode);
return null;
}
if (!(betweenExpressionStart instanceof NumericConstantNode)) {
setInvalidMessage("Between min value must be a number not: " + betweenExpressionStart);
return null;
}
if (!(betweenExpressionEnd instanceof NumericConstantNode)) {
setInvalidMessage("Between max value must be a number not: " + betweenExpressionEnd);
return null;
}
final Column column = toQueryValue(leftValueNode);
final Value min = toQueryValue(betweenExpressionStart);
final Value max = toQueryValue(betweenExpressionEnd);
final FieldDefinition fieldDefinition = this.recordDefinition.getField(column.getName());
min.convert(fieldDefinition);
max.convert(fieldDefinition);
return (V) new Between(column, min, max);
} else if (expression instanceof BinaryLogicalOperatorNode) {
final BinaryLogicalOperatorNode binaryOperatorNode = (BinaryLogicalOperatorNode) expression;
final String operator = binaryOperatorNode.getOperator().toUpperCase();
final ValueNode leftValueNode = binaryOperatorNode.getLeftOperand();
final ValueNode rightValueNode = binaryOperatorNode.getRightOperand();
final QueryValue leftValue = toQueryValue(leftValueNode);
if (leftValue instanceof Condition) {
final Condition leftCondition = (Condition) leftValue;
final QueryValue rightValue = toQueryValue(rightValueNode);
if (rightValue instanceof Condition) {
final Condition rightCondition = (Condition) rightValue;
if ("AND".equals(operator)) {
return (V) new And(leftCondition, rightCondition);
} else if ("OR".equals(operator)) {
return (V) new Or(leftCondition, rightCondition);
} else {
setInvalidMessage("Binary logical operator " + operator + " not supported.");
return null;
}
} else {
setInvalidMessage("Right side of " + operator + " must be a condition (e.g. column_name = 'value') not: " + rightValue);
return null;
}
} else {
setInvalidMessage("Left side of " + operator + " must be a condition (e.g. column_name = 'value') not: " + leftValue);
return null;
}
} else if (expression instanceof BinaryOperatorNode) {
final BinaryOperatorNode binaryOperatorNode = (BinaryOperatorNode) expression;
final String operator = binaryOperatorNode.getOperator();
final ValueNode leftValueNode = binaryOperatorNode.getLeftOperand();
final ValueNode rightValueNode = binaryOperatorNode.getRightOperand();
if (QueryValue.SUPPORTED_BINARY_OPERATORS.contains(operator.toUpperCase())) {
final QueryValue leftCondition = toQueryValue(leftValueNode);
QueryValue rightCondition = toQueryValue(rightValueNode);
if (leftCondition instanceof Column) {
if (rightCondition instanceof Value) {
final Object value = ((Value) rightCondition).getValue();
if (value == null) {
setInvalidMessage("Values can't be null for " + operator + " use IS NULL or IS NOT NULL instead.");
} else {
final Column column = (Column) leftCondition;
final String name = column.getName();
final FieldDefinition fieldDefinition = this.recordDefinition.getField(name);
final CodeTable codeTable = this.recordDefinition.getCodeTableByFieldName(name);
if (codeTable == null || fieldDefinition == this.recordDefinition.getIdField()) {
try {
final Object convertedValue = fieldDefinition.toFieldValueException(value);
if (convertedValue == null) {
setInvalidMessage("Values can't be null for " + operator + " use IS NULL or IS NOT NULL instead.");
return null;
} else {
rightCondition = new Value(fieldDefinition, convertedValue);
}
} catch (final Throwable t) {
setInvalidMessage(name + "='" + value + "' is not a valid " + fieldDefinition.getDataType().getValidationName());
}
} else {
Object id;
if (value instanceof String) {
final String string = (String) value;
final String[] values = string.split(":");
id = codeTable.getIdentifier((Object[]) values);
} else {
id = codeTable.getIdentifier(value);
}
if (id == null) {
setInvalidMessage(name + "='" + value + "' could not be found in the code table " + codeTable.getName());
} else {
rightCondition = new Value(fieldDefinition, id);
}
}
}
}
}
if (expression instanceof BinaryArithmeticOperatorNode) {
final QueryValue arithmaticCondition = Q.arithmatic(leftCondition, operator, rightCondition);
return (V) arithmaticCondition;
} else {
final Condition binaryCondition = Q.binary(leftCondition, operator, rightCondition);
return (V) binaryCondition;
}
} else {
setInvalidMessage("Unsupported binary operator " + operator);
}
} else if (expression instanceof ColumnReference) {
final ColumnReference column = (ColumnReference) expression;
String columnName = column.getColumnName();
columnName = columnName.replaceAll("\"", "");
final FieldDefinition fieldDefinition = this.recordDefinition.getField(columnName);
if (fieldDefinition == null) {
setInvalidMessage("Invalid field name " + columnName);
} else {
return (V) new Column(fieldDefinition);
}
} else if (expression instanceof LikeEscapeOperatorNode) {
final LikeEscapeOperatorNode likeEscapeOperatorNode = (LikeEscapeOperatorNode) expression;
final ValueNode leftValueNode = likeEscapeOperatorNode.getReceiver();
final ValueNode rightValueNode = likeEscapeOperatorNode.getLeftOperand();
final QueryValue leftCondition = toQueryValue(leftValueNode);
final QueryValue rightCondition = toQueryValue(rightValueNode);
return (V) new ILike(leftCondition, rightCondition);
} else if (expression instanceof NotNode) {
final NotNode notNode = (NotNode) expression;
final ValueNode operand = notNode.getOperand();
final Condition condition = toQueryValue(operand);
return (V) new Not(condition);
} else if (expression instanceof InListOperatorNode) {
final InListOperatorNode inListOperatorNode = (InListOperatorNode) expression;
final ValueNode leftOperand = inListOperatorNode.getLeftOperand();
final QueryValue leftCondition = toQueryValue(leftOperand);
final List<QueryValue> conditions = new ArrayList<>();
final RowConstructorNode itemsList = inListOperatorNode.getRightOperandList();
for (final ValueNode itemValueNode : itemsList.getNodeList()) {
final QueryValue itemCondition = toQueryValue(itemValueNode);
conditions.add(itemCondition);
}
return (V) new In(leftCondition, new CollectionValue(conditions));
} else if (expression instanceof IsNullNode) {
final IsNullNode isNullNode = (IsNullNode) expression;
final ValueNode operand = isNullNode.getOperand();
final QueryValue value = toQueryValue(operand);
if (isNullNode.getNodeType() == NodeTypes.IS_NOT_NULL_NODE) {
return (V) new IsNotNull(value);
} else {
return (V) new IsNull(value);
}
// } else if (expression instanceof Parenthesis) {
// final Parenthesis parenthesis = (Parenthesis)expression;
// final ValueNode parenthesisValueNode = parenthesis.getExpression();
// final Condition condition = toCondition(parenthesisExpression);
// final ParenthesisCondition parenthesisCondition = new
// ParenthesisCondition(
// condition);
// if (parenthesis.isNot()) {
// return (V)Q.not(parenthesisCondition);
// } else {
// return (V)parenthesisCondition;
// }
} else if (expression instanceof RowConstructorNode) {
final RowConstructorNode rowConstructorNode = (RowConstructorNode) expression;
final ValueNodeList values = rowConstructorNode.getNodeList();
final ValueNode valueNode = values.get(0);
return (V) toQueryValue(valueNode);
} else if (expression instanceof UserTypeConstantNode) {
final UserTypeConstantNode constant = (UserTypeConstantNode) expression;
final Object objectValue = constant.getObjectValue();
return (V) new Value(objectValue);
} else if (expression instanceof ConstantNode) {
final ConstantNode constant = (ConstantNode) expression;
final Object value = constant.getValue();
return (V) new Value(value);
} else if (expression instanceof SimpleStringOperatorNode) {
final SimpleStringOperatorNode operatorNode = (SimpleStringOperatorNode) expression;
final String functionName = operatorNode.getMethodName().toUpperCase();
final ValueNode operand = operatorNode.getOperand();
final QueryValue condition = toQueryValue(operand);
return (V) new Function(functionName, condition);
} else if (expression instanceof CastNode) {
final CastNode castNode = (CastNode) expression;
final String typeName = castNode.getType().getSQLstring();
final ValueNode operand = castNode.getCastOperand();
final QueryValue condition = toQueryValue(operand);
return (V) new Cast(condition, typeName);
} else if (expression == null) {
return null;
} else {
setInvalidMessage("Unsupported expression" + expression.getClass() + " " + expression);
}
return null;
}
use of com.revolsys.record.query.CollectionValue in project com.revolsys.open by revolsys.
the class FileGdbRecordStore method appendQueryValue.
@Override
public void appendQueryValue(final Query query, final StringBuilder buffer, final QueryValue condition) {
if (condition instanceof Like || condition instanceof ILike) {
final BinaryCondition like = (BinaryCondition) condition;
final QueryValue left = like.getLeft();
final QueryValue right = like.getRight();
buffer.append("UPPER(CAST(");
appendQueryValue(query, buffer, left);
buffer.append(" AS VARCHAR(4000))) LIKE ");
if (right instanceof Value) {
final Value valueCondition = (Value) right;
final Object value = valueCondition.getValue();
buffer.append("'");
if (value != null) {
final String string = DataTypes.toString(value);
buffer.append(string.toUpperCase().replaceAll("'", "''"));
}
buffer.append("'");
} else {
appendQueryValue(query, buffer, right);
}
} else if (condition instanceof LeftUnaryCondition) {
final LeftUnaryCondition unaryCondition = (LeftUnaryCondition) condition;
final String operator = unaryCondition.getOperator();
final QueryValue right = unaryCondition.getValue();
buffer.append(operator);
buffer.append(" ");
appendQueryValue(query, buffer, right);
} else if (condition instanceof RightUnaryCondition) {
final RightUnaryCondition unaryCondition = (RightUnaryCondition) condition;
final QueryValue left = unaryCondition.getValue();
final String operator = unaryCondition.getOperator();
appendQueryValue(query, buffer, left);
buffer.append(" ");
buffer.append(operator);
} else if (condition instanceof BinaryCondition) {
final BinaryCondition binaryCondition = (BinaryCondition) condition;
final QueryValue left = binaryCondition.getLeft();
final String operator = binaryCondition.getOperator();
final QueryValue right = binaryCondition.getRight();
appendQueryValue(query, buffer, left);
buffer.append(" ");
buffer.append(operator);
buffer.append(" ");
appendQueryValue(query, buffer, right);
} else if (condition instanceof AbstractMultiCondition) {
final AbstractMultiCondition multipleCondition = (AbstractMultiCondition) condition;
buffer.append("(");
boolean first = true;
final String operator = multipleCondition.getOperator();
for (final QueryValue subCondition : multipleCondition.getQueryValues()) {
if (first) {
first = false;
} else {
buffer.append(" ");
buffer.append(operator);
buffer.append(" ");
}
appendQueryValue(query, buffer, subCondition);
}
buffer.append(")");
} else if (condition instanceof In) {
final In in = (In) condition;
if (in.isEmpty()) {
buffer.append("1==0");
} else {
final QueryValue left = in.getLeft();
appendQueryValue(query, buffer, left);
buffer.append(" IN (");
appendQueryValue(query, buffer, in.getValues());
buffer.append(")");
}
} else if (condition instanceof Value) {
final Value valueCondition = (Value) condition;
Object value = valueCondition.getValue();
if (value instanceof Identifier) {
final Identifier identifier = (Identifier) value;
value = identifier.getValue(0);
}
appendValue(buffer, value);
} else if (condition instanceof CollectionValue) {
final CollectionValue collectionValue = (CollectionValue) condition;
final List<Object> values = collectionValue.getValues();
boolean first = true;
for (final Object value : values) {
if (first) {
first = false;
} else {
buffer.append(", ");
}
appendValue(buffer, value);
}
} else if (condition instanceof Column) {
final Column column = (Column) condition;
final Object name = column.getName();
buffer.append(name);
} else if (condition instanceof SqlCondition) {
final SqlCondition sqlCondition = (SqlCondition) condition;
final String where = sqlCondition.getSql();
final List<Object> parameters = sqlCondition.getParameterValues();
if (parameters.isEmpty()) {
if (where.indexOf('?') > -1) {
throw new IllegalArgumentException("No arguments specified for a where clause with placeholders: " + where);
} else {
buffer.append(where);
}
} else {
final Matcher matcher = PLACEHOLDER_PATTERN.matcher(where);
int i = 0;
while (matcher.find()) {
if (i >= parameters.size()) {
throw new IllegalArgumentException("Not enough arguments for where clause with placeholders: " + where);
}
final Object argument = parameters.get(i);
final StringBuffer replacement = new StringBuffer();
matcher.appendReplacement(replacement, DataTypes.toString(argument));
buffer.append(replacement);
appendValue(buffer, argument);
i++;
}
final StringBuffer tail = new StringBuffer();
matcher.appendTail(tail);
buffer.append(tail);
}
} else if (condition instanceof EnvelopeIntersects) {
buffer.append("1 = 1");
} else if (condition instanceof WithinDistance) {
buffer.append("1 = 1");
} else {
condition.appendDefaultSql(query, this, buffer);
}
}
use of com.revolsys.record.query.CollectionValue in project com.revolsys.open by revolsys.
the class OgrRecordStore method appendQueryValue.
@Override
public void appendQueryValue(final Query query, final StringBuilder sql, final QueryValue condition) {
if (condition instanceof Like || condition instanceof ILike) {
final BinaryCondition like = (BinaryCondition) condition;
final QueryValue left = like.getLeft();
final QueryValue right = like.getRight();
sql.append("UPPER(");
appendQueryValue(query, sql, left);
sql.append(") LIKE ");
if (right instanceof Value) {
final Value valueCondition = (Value) right;
final Object value = valueCondition.getValue();
sql.append("'");
if (value != null) {
final String string = DataTypes.toString(value);
sql.append(string.toUpperCase());
}
sql.append("'");
} else {
appendQueryValue(query, sql, right);
}
} else if (condition instanceof LeftUnaryCondition) {
final LeftUnaryCondition unaryCondition = (LeftUnaryCondition) condition;
final String operator = unaryCondition.getOperator();
final QueryValue right = unaryCondition.getValue();
sql.append(operator);
sql.append(" ");
appendQueryValue(query, sql, right);
} else if (condition instanceof RightUnaryCondition) {
final RightUnaryCondition unaryCondition = (RightUnaryCondition) condition;
final QueryValue left = unaryCondition.getValue();
final String operator = unaryCondition.getOperator();
appendQueryValue(query, sql, left);
sql.append(" ");
sql.append(operator);
} else if (condition instanceof BinaryCondition) {
final BinaryCondition binaryCondition = (BinaryCondition) condition;
final QueryValue left = binaryCondition.getLeft();
final String operator = binaryCondition.getOperator();
final QueryValue right = binaryCondition.getRight();
appendQueryValue(query, sql, left);
sql.append(" ");
sql.append(operator);
sql.append(" ");
appendQueryValue(query, sql, right);
} else if (condition instanceof AbstractMultiCondition) {
final AbstractMultiCondition multipleCondition = (AbstractMultiCondition) condition;
sql.append("(");
boolean first = true;
final String operator = multipleCondition.getOperator();
for (final QueryValue subCondition : multipleCondition.getQueryValues()) {
if (first) {
first = false;
} else {
sql.append(" ");
sql.append(operator);
sql.append(" ");
}
appendQueryValue(query, sql, subCondition);
}
sql.append(")");
} else if (condition instanceof Value) {
final Value valueCondition = (Value) condition;
final Object value = valueCondition.getValue();
appendValue(sql, value);
} else if (condition instanceof CollectionValue) {
final CollectionValue collectionValue = (CollectionValue) condition;
final List<Object> values = collectionValue.getValues();
boolean first = true;
for (final Object value : values) {
if (first) {
first = false;
} else {
sql.append(", ");
}
appendValue(sql, value);
}
} else if (condition instanceof Column) {
final Column column = (Column) condition;
final Object name = column.getName();
sql.append(name);
} else if (condition instanceof SqlCondition) {
final SqlCondition sqlCondition = (SqlCondition) condition;
final String where = sqlCondition.getSql();
final List<Object> parameters = sqlCondition.getParameterValues();
if (parameters.isEmpty()) {
if (where.indexOf('?') > -1) {
throw new IllegalArgumentException("No arguments specified for a where clause with placeholders: " + where);
} else {
sql.append(where);
}
} else {
final Matcher matcher = PLACEHOLDER_PATTERN.matcher(where);
int i = 0;
while (matcher.find()) {
if (i >= parameters.size()) {
throw new IllegalArgumentException("Not enough arguments for where clause with placeholders: " + where);
}
final Object argument = parameters.get(i);
final StringBuffer replacement = new StringBuffer();
matcher.appendReplacement(replacement, DataTypes.toString(argument));
sql.append(replacement);
appendValue(sql, argument);
i++;
}
final StringBuffer tail = new StringBuffer();
matcher.appendTail(tail);
sql.append(tail);
}
} else if (condition instanceof EnvelopeIntersects) {
final EnvelopeIntersects envelopeIntersects = (EnvelopeIntersects) condition;
final QueryValue boundingBox1Value = envelopeIntersects.getBoundingBox1Value();
final QueryValue boundingBox2Value = envelopeIntersects.getBoundingBox2Value();
if (boundingBox1Value == null || boundingBox2Value == null) {
sql.append("1 = 0");
} else {
sql.append("Intersects(");
boundingBox1Value.appendSql(query, this, sql);
sql.append(",");
boundingBox2Value.appendSql(query, this, sql);
sql.append(")");
}
} else if (condition instanceof WithinDistance) {
final WithinDistance withinDistance = (WithinDistance) condition;
final QueryValue geometry1Value = withinDistance.getGeometry1Value();
final QueryValue geometry2Value = withinDistance.getGeometry2Value();
final QueryValue distanceValue = withinDistance.getDistanceValue();
if (geometry1Value == null || geometry2Value == null || distanceValue == null) {
sql.append("1 = 0");
} else {
sql.append("Distance(");
geometry1Value.appendSql(query, this, sql);
sql.append(", ");
geometry2Value.appendSql(query, this, sql);
sql.append(") <= ");
distanceValue.appendSql(query, this, sql);
sql.append(")");
}
} else {
condition.appendDefaultSql(query, this, sql);
}
}
Aggregations