/*
* Copyright 2011 jmarsden.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* under the License.
*/
package jsonij.json.jpath;
import java.util.ArrayList;
import java.util.List;
import jsonij.json.Value;
/**
* Complex Predicate Implementation.
*
* @author J.W.Marsden
*/
public class ExpressionPredicate extends PredicateComponent {
String expression;
ArrayList<ExpressionPredicateCondition> conditions;
static {
}
public ExpressionPredicate() {
this.expression = null;
this.conditions = new ArrayList<ExpressionPredicateCondition>();
}
public ArrayList<ExpressionPredicateCondition> getConditions() {
return conditions;
}
public void setConditions(ArrayList<ExpressionPredicateCondition> conditions) {
this.conditions = conditions;
}
public String getExpression() {
return expression;
}
public void setExpression(String expression) {
this.expression = expression;
}
public ArrayList<ExpressionPredicateCondition> conditions() {
return conditions;
}
@Override
public String toString() {
StringBuilder conditionString = new StringBuilder();
for (ExpressionPredicateCondition epc : conditions()) {
conditionString.append(epc);
conditionString.append(" ");
}
String output = String.format("ExpressionPredicate (\"%s\" -> %s)", getExpression(), conditionString);
return output;
}
@Override
public List<Value> evaluate(List<Value> values, List<Value> results) {
for (Value value : values) {
if (value.getValueType() == Value.TYPE.ARRAY) {
for (int j = 0; j < value.size(); j++) {
Value checkElement = value.get(j);
if (checkElement.getValueType() == Value.TYPE.OBJECT) {
boolean expressionValid = true;
for (ExpressionPredicateCondition condition : conditions) {
Value checkValue = checkElement.get(condition.getAttribute());
if (checkValue == null) {
expressionValid = false;
break;
}
ExpressionPredicateOperator expressionConditionOperator = condition.getOperator();
if (expressionConditionOperator.equals(ExpressionPredicateOperator.NOT_NULL)) {
if (checkValue.isNull()) {
expressionValid = false;
break;
}
} else if (expressionConditionOperator.equals(ExpressionPredicateOperator.EQUAL)) {
if (!checkValue.equals(condition.value)) {
expressionValid = false;
break;
}
} else if (expressionConditionOperator.equals(ExpressionPredicateOperator.LESS)) {
} else if (expressionConditionOperator.equals(ExpressionPredicateOperator.GREATER)) {
} else if (expressionConditionOperator.equals(ExpressionPredicateOperator.LESS_EQUAL)) {
} else if (expressionConditionOperator.equals(ExpressionPredicateOperator.GREATER_EQUAL)) {
}
}
if (expressionValid) {
results.add(checkElement);
}
}
}
}
}
return results;
}
public enum ExpressionPredicateOperator {
NOT_NULL,
EQUAL,
LESS,
GREATER,
LESS_EQUAL,
GREATER_EQUAL
}
public enum ExpressionPredicateCombineOperator {
AND,
OR,
}
/**
* Complex Predicate Implementation.
*
* @author openecho
*/
public static class ExpressionPredicateCondition {
ExpressionPredicateCombineOperator combine;
String attribute;
ExpressionPredicateOperator operator;
Value value;
public ExpressionPredicateCondition() {
combine = null;
attribute = null;
operator = null;
value = null;
}
public ExpressionPredicateCondition(String attribute, ExpressionPredicateOperator operator) {
this.attribute = attribute;
this.operator = operator;
value = null;
}
public ExpressionPredicateCondition(String attribute, ExpressionPredicateOperator operator, Value value) {
this.attribute = attribute;
this.operator = operator;
this.value = value;
}
public ExpressionPredicateCondition(ExpressionPredicateCombineOperator combine, String attribute, ExpressionPredicateOperator operator, Value value) {
this.combine = combine;
this.attribute = attribute;
this.operator = operator;
this.value = value;
}
public ExpressionPredicateCombineOperator getCombine() {
return combine;
}
public void setCombine(ExpressionPredicateCombineOperator combine) {
this.combine = combine;
}
public String getAttribute() {
return attribute;
}
public void setAttribute(String attribute) {
this.attribute = attribute;
}
public ExpressionPredicateOperator getOperator() {
return operator;
}
public void setOperator(ExpressionPredicateOperator operator) {
this.operator = operator;
}
public Value getValue() {
return value;
}
public void setValue(Value value) {
this.value = value;
}
@Override
public String toString() {
return String.format("ExpressionPredicateCondition (%s%s %s %s)", ( ( combine != null ) ? String.format("%s ", combine) : "" ), attribute, operator, value.toJSON());
}
}
}