|
|
|
@ -8,6 +8,8 @@ import java.util.Iterator;
|
|
|
|
|
import java.util.Map; |
|
|
|
|
import java.util.regex.Pattern; |
|
|
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
|
|
|
|
|
|
import static com.jayway.jsonpath.internal.filter.ValueNodes.PatternNode; |
|
|
|
|
import static com.jayway.jsonpath.internal.filter.ValueNodes.ValueListNode; |
|
|
|
|
|
|
|
|
@ -102,10 +104,23 @@ public class EvaluatorFactory {
|
|
|
|
|
return left.asNumberNode().getNumber().compareTo(right.asNumberNode().getNumber()) < 0; |
|
|
|
|
} if(left.isStringNode() && right.isStringNode()){ |
|
|
|
|
return left.asStringNode().getString().compareTo(right.asStringNode().getString()) < 0; |
|
|
|
|
} if(left.isStringNode() && right.isNumberNode()){ |
|
|
|
|
return left.asStringNode().getString().compareTo(right.asNumberNode().getNumber().toString()) < 0; |
|
|
|
|
} if(left.isNumberNode() && right.isStringNode()){ |
|
|
|
|
return left.asNumberNode().getNumber().toString().compareTo(right.asStringNode().getString()) < 0; |
|
|
|
|
} if (left.isStringNode() && right.isNumberNode()) { |
|
|
|
|
// Try to parse the string as a number for comparison
|
|
|
|
|
try { |
|
|
|
|
BigDecimal leftAsNumber = new BigDecimal(left.asStringNode().getString()); |
|
|
|
|
return leftAsNumber.compareTo(right.asNumberNode().getNumber()) < 0; |
|
|
|
|
} catch (NumberFormatException e) { |
|
|
|
|
return left.asStringNode().getString().compareTo(right.asNumberNode().getNumber().toString()) < 0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (left.isNumberNode() && right.isStringNode()) { |
|
|
|
|
// Try to parse the string as a number for comparison
|
|
|
|
|
try { |
|
|
|
|
BigDecimal rightAsNumber = new BigDecimal(right.asStringNode().getString()); |
|
|
|
|
return left.asNumberNode().getNumber().compareTo(rightAsNumber) < 0; |
|
|
|
|
} catch (NumberFormatException e) { |
|
|
|
|
return left.asNumberNode().getNumber().toString().compareTo(right.asStringNode().getString()) < 0; |
|
|
|
|
} |
|
|
|
|
} if (left.isOffsetDateTimeNode() && right.isOffsetDateTimeNode()){ //workaround for issue: https://github.com/json-path/JsonPath/issues/613
|
|
|
|
|
return left.asOffsetDateTimeNode().getDate().compareTo(right.asOffsetDateTimeNode().getDate()) < 0; |
|
|
|
|
} |
|
|
|
@ -120,10 +135,24 @@ public class EvaluatorFactory {
|
|
|
|
|
return left.asNumberNode().getNumber().compareTo(right.asNumberNode().getNumber()) <= 0; |
|
|
|
|
} if(left.isStringNode() && right.isStringNode()){ |
|
|
|
|
return left.asStringNode().getString().compareTo(right.asStringNode().getString()) <= 0; |
|
|
|
|
} if(left.isStringNode() && right.isNumberNode()){ |
|
|
|
|
return left.asStringNode().getString().compareTo(right.asNumberNode().getNumber().toString()) <= 0; |
|
|
|
|
} if(left.isNumberNode() && right.isStringNode()){ |
|
|
|
|
return left.asNumberNode().getNumber().toString().compareTo(right.asStringNode().getString()) <= 0; |
|
|
|
|
} if (left.isStringNode() && right.isNumberNode()) { |
|
|
|
|
// Try to parse the string as a number for comparison
|
|
|
|
|
try { |
|
|
|
|
BigDecimal leftAsNumber = new BigDecimal(left.asStringNode().getString()); |
|
|
|
|
return leftAsNumber.compareTo(right.asNumberNode().getNumber()) <= 0; |
|
|
|
|
} catch (NumberFormatException e) { |
|
|
|
|
// If parsing fails, fall back to string comparison
|
|
|
|
|
return left.asStringNode().getString().compareTo(right.asNumberNode().getNumber().toString()) <= 0; |
|
|
|
|
} |
|
|
|
|
} if (left.isNumberNode() && right.isStringNode()) { |
|
|
|
|
// Try to parse the string as a number for comparison
|
|
|
|
|
try { |
|
|
|
|
BigDecimal rightAsNumber = new BigDecimal(right.asStringNode().getString()); |
|
|
|
|
return left.asNumberNode().getNumber().compareTo(rightAsNumber) <= 0; |
|
|
|
|
} catch (NumberFormatException e) { |
|
|
|
|
// If parsing fails, fall back to string comparison
|
|
|
|
|
return left.asNumberNode().getNumber().toString().compareTo(right.asStringNode().getString()) <= 0; |
|
|
|
|
} |
|
|
|
|
} if (left.isOffsetDateTimeNode() && right.isOffsetDateTimeNode()){ //workaround for issue: https://github.com/json-path/JsonPath/issues/613
|
|
|
|
|
return left.asOffsetDateTimeNode().getDate().compareTo(right.asOffsetDateTimeNode().getDate()) <= 0; |
|
|
|
|
} |
|
|
|
@ -136,13 +165,25 @@ public class EvaluatorFactory {
|
|
|
|
|
public boolean evaluate(ValueNode left, ValueNode right, Predicate.PredicateContext ctx) { |
|
|
|
|
if(left.isNumberNode() && right.isNumberNode()){ |
|
|
|
|
return left.asNumberNode().getNumber().compareTo(right.asNumberNode().getNumber()) > 0; |
|
|
|
|
} else if(left.isStringNode() && right.isStringNode()){ |
|
|
|
|
} if(left.isStringNode() && right.isStringNode()){ |
|
|
|
|
return left.asStringNode().getString().compareTo(right.asStringNode().getString()) > 0; |
|
|
|
|
} else if (left.isStringNode() && right.isNumberNode()){ |
|
|
|
|
return left.asStringNode().getString().compareTo(right.asNumberNode().getNumber().toString()) > 0; |
|
|
|
|
} else if (left.isNumberNode() && right.isStringNode()){ |
|
|
|
|
return left.asNumberNode().getNumber().toString().compareTo(right.asStringNode().getString()) > 0; |
|
|
|
|
} else if (left.isOffsetDateTimeNode() && right.isOffsetDateTimeNode()){ //workaround for issue: https://github.com/json-path/JsonPath/issues/613
|
|
|
|
|
} if (left.isStringNode() && right.isNumberNode()) { |
|
|
|
|
// Try to parse the string as a number for comparison
|
|
|
|
|
try { |
|
|
|
|
BigDecimal leftAsNumber = new BigDecimal(left.asStringNode().getString()); |
|
|
|
|
return leftAsNumber.compareTo(right.asNumberNode().getNumber()) > 0; |
|
|
|
|
} catch (NumberFormatException e) { |
|
|
|
|
return left.asStringNode().getString().compareTo(right.asNumberNode().getNumber().toString()) > 0; |
|
|
|
|
} |
|
|
|
|
} if (left.isNumberNode() && right.isStringNode()) { |
|
|
|
|
// Try to parse the string as a number for comparison
|
|
|
|
|
try { |
|
|
|
|
BigDecimal rightAsNumber = new BigDecimal(right.asStringNode().getString()); |
|
|
|
|
return left.asNumberNode().getNumber().compareTo(rightAsNumber) > 0; |
|
|
|
|
} catch (NumberFormatException e) { |
|
|
|
|
return left.asNumberNode().getNumber().toString().compareTo(right.asStringNode().getString()) > 0; |
|
|
|
|
} |
|
|
|
|
} if (left.isOffsetDateTimeNode() && right.isOffsetDateTimeNode()){ //workaround for issue: https://github.com/json-path/JsonPath/issues/613
|
|
|
|
|
return left.asOffsetDateTimeNode().getDate().compareTo(right.asOffsetDateTimeNode().getDate()) > 0; |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
@ -154,13 +195,25 @@ public class EvaluatorFactory {
|
|
|
|
|
public boolean evaluate(ValueNode left, ValueNode right, Predicate.PredicateContext ctx) { |
|
|
|
|
if(left.isNumberNode() && right.isNumberNode()){ |
|
|
|
|
return left.asNumberNode().getNumber().compareTo(right.asNumberNode().getNumber()) >= 0; |
|
|
|
|
} else if(left.isStringNode() && right.isStringNode()){ |
|
|
|
|
} if(left.isStringNode() && right.isStringNode()){ |
|
|
|
|
return left.asStringNode().getString().compareTo(right.asStringNode().getString()) >= 0; |
|
|
|
|
} else if (left.isStringNode() && right.isNumberNode()){ |
|
|
|
|
return left.asStringNode().getString().compareTo(right.asNumberNode().getNumber().toString()) >= 0; |
|
|
|
|
} else if (left.isNumberNode() && right.isStringNode()){ |
|
|
|
|
return left.asNumberNode().getNumber().toString().compareTo(right.asStringNode().getString()) >= 0; |
|
|
|
|
} else if (left.isOffsetDateTimeNode() && right.isOffsetDateTimeNode()){ //workaround for issue: https://github.com/json-path/JsonPath/issues/613
|
|
|
|
|
} if (left.isStringNode() && right.isNumberNode()) { |
|
|
|
|
// Try to parse the string as a number for comparison
|
|
|
|
|
try { |
|
|
|
|
BigDecimal leftAsNumber = new BigDecimal(left.asStringNode().getString()); |
|
|
|
|
return leftAsNumber.compareTo(right.asNumberNode().getNumber()) >= 0; |
|
|
|
|
} catch (NumberFormatException e) { |
|
|
|
|
return left.asStringNode().getString().compareTo(right.asNumberNode().getNumber().toString()) >= 0; |
|
|
|
|
} |
|
|
|
|
} if (left.isNumberNode() && right.isStringNode()) { |
|
|
|
|
// Try to parse the string as a number for comparison
|
|
|
|
|
try { |
|
|
|
|
BigDecimal rightAsNumber = new BigDecimal(right.asStringNode().getString()); |
|
|
|
|
return left.asNumberNode().getNumber().compareTo(rightAsNumber) >= 0; |
|
|
|
|
} catch (NumberFormatException e) { |
|
|
|
|
return left.asNumberNode().getNumber().toString().compareTo(right.asStringNode().getString()) >= 0; |
|
|
|
|
} |
|
|
|
|
} if (left.isOffsetDateTimeNode() && right.isOffsetDateTimeNode()){ //workaround for issue: https://github.com/json-path/JsonPath/issues/613
|
|
|
|
|
return left.asOffsetDateTimeNode().getDate().compareTo(right.asOffsetDateTimeNode().getDate()) >= 0; |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|