if (!(left instanceof OSQLFilterCondition))
return null;
String rightField;
final OSQLFilterCondition rightCondition = (OSQLFilterCondition) right;
final OSQLFilterCondition leftCondition = (OSQLFilterCondition) left;
if (rightCondition.getLeft() instanceof OSQLFilterItemField && rightCondition.getRight() instanceof OSQLFilterItemField)
return null;
if (!(rightCondition.getLeft() instanceof OSQLFilterItemField) && !(rightCondition.getRight() instanceof OSQLFilterItemField))
return null;
if (leftCondition.getLeft() instanceof OSQLFilterItemField && leftCondition.getRight() instanceof OSQLFilterItemField)
return null;
if (!(leftCondition.getLeft() instanceof OSQLFilterItemField) && !(leftCondition.getRight() instanceof OSQLFilterItemField))
return null;
final List<Object> betweenBoundaries = new ArrayList<Object>();
if (rightCondition.getLeft() instanceof OSQLFilterItemField) {
OSQLFilterItemField itemField = (OSQLFilterItemField) rightCondition.getLeft();
if (!itemField.isFieldChain())
return null;
if (itemField.getFieldChain().getItemCount() > 1)
return null;
rightField = itemField.getRoot();
betweenBoundaries.add(rightCondition.getRight());
} else if (rightCondition.getRight() instanceof OSQLFilterItemField) {
OSQLFilterItemField itemField = (OSQLFilterItemField) rightCondition.getRight();
if (!itemField.isFieldChain())
return null;
if (itemField.getFieldChain().getItemCount() > 1)
return null;
rightField = itemField.getRoot();
betweenBoundaries.add(rightCondition.getLeft());
} else
return null;
betweenBoundaries.add("and");
String leftField;
if (leftCondition.getLeft() instanceof OSQLFilterItemField) {
OSQLFilterItemField itemField = (OSQLFilterItemField) leftCondition.getLeft();
if (!itemField.isFieldChain())
return null;
if (itemField.getFieldChain().getItemCount() > 1)
return null;
leftField = itemField.getRoot();
betweenBoundaries.add(leftCondition.getRight());
} else if (leftCondition.getRight() instanceof OSQLFilterItemField) {
OSQLFilterItemField itemField = (OSQLFilterItemField) leftCondition.getRight();
if (!itemField.isFieldChain())
return null;
if (itemField.getFieldChain().getItemCount() > 1)
return null;
leftField = itemField.getRoot();
betweenBoundaries.add(leftCondition.getLeft());
} else
return null;
if (!leftField.equalsIgnoreCase(rightField))
return null;
final OQueryOperator rightOperator = ((OSQLFilterCondition) right).getOperator();
final OQueryOperator leftOperator = ((OSQLFilterCondition) left).getOperator();
if ((rightOperator instanceof OQueryOperatorMajor || rightOperator instanceof OQueryOperatorMajorEquals)
&& (leftOperator instanceof OQueryOperatorMinor || leftOperator instanceof OQueryOperatorMinorEquals)) {
final OQueryOperatorBetween between = new OQueryOperatorBetween();
if (rightOperator instanceof OQueryOperatorMajor)
between.setLeftInclusive(false);
if (leftOperator instanceof OQueryOperatorMinor)
between.setRightInclusive(false);
return new OSQLFilterCondition(new OSQLFilterItemField(this, leftField), between, betweenBoundaries.toArray());
}
if ((leftOperator instanceof OQueryOperatorMajor || leftOperator instanceof OQueryOperatorMajorEquals)
&& (rightOperator instanceof OQueryOperatorMinor || rightOperator instanceof OQueryOperatorMinorEquals)) {
final OQueryOperatorBetween between = new OQueryOperatorBetween();
if (leftOperator instanceof OQueryOperatorMajor)
between.setLeftInclusive(false);
if (rightOperator instanceof OQueryOperatorMinor)
between.setRightInclusive(false);
Collections.reverse(betweenBoundaries);
return new OSQLFilterCondition(new OSQLFilterItemField(this, leftField), between, betweenBoundaries.toArray());
}
return null;
}