| | |
| | | return asText(left).compareTo(asText(right)); |
| | | } |
| | | |
| | | private static int compareNumbers(Object left, Object right) { |
| | | double leftNumber = Paths.toNumber(left); |
| | | double rightNumber = Paths.toNumber(right); |
| | | if (!Double.isFinite(leftNumber) || !Double.isFinite(rightNumber)) { |
| | | throw new RuleRuntimeException("数值比较缺少有效实测值或规格限值"); |
| | | } |
| | | return Double.compare(leftNumber, rightNumber); |
| | | } |
| | | |
| | | /** 判定结果类取值统一成 PASS / FAIL,识别不出返回空串 */ |
| | | public static String normalizeResultToken(Object value) { |
| | | if (value instanceof Boolean bool) { |
| | |
| | | |
| | | private static Object evaluateBetween(RuleNode.Between between, Object context) { |
| | | Object value = evaluateNode(between.value(), context); |
| | | boolean hit = compare(value, evaluateNode(between.lower(), context)) >= 0 |
| | | && compare(value, evaluateNode(between.upper(), context)) <= 0; |
| | | boolean hit = compareNumbers(value, evaluateNode(between.lower(), context)) >= 0 |
| | | && compareNumbers(value, evaluateNode(between.upper(), context)) <= 0; |
| | | return between.negated() != hit; |
| | | } |
| | | |
| | |
| | | return switch (binary.operator()) { |
| | | case "=" -> compare(left, right) == 0; |
| | | case "!=" -> compare(left, right) != 0; |
| | | case ">" -> compare(left, right) > 0; |
| | | case ">=" -> compare(left, right) >= 0; |
| | | case "<" -> compare(left, right) < 0; |
| | | case "<=" -> compare(left, right) <= 0; |
| | | case ">" -> compareNumbers(left, right) > 0; |
| | | case ">=" -> compareNumbers(left, right) >= 0; |
| | | case "<" -> compareNumbers(left, right) < 0; |
| | | case "<=" -> compareNumbers(left, right) <= 0; |
| | | case "+" -> add(left, right); |
| | | case "-" -> Paths.toNumber(left) - Paths.toNumber(right); |
| | | case "*" -> Paths.toNumber(left) * Paths.toNumber(right); |
| | |
| | | |
| | | } |
| | | |
| | | } |
| | | } |