1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package gov.nist.secauto.metaschema.core.metapath;
28
29 import gov.nist.secauto.metaschema.core.metapath.function.library.FnData;
30 import gov.nist.secauto.metaschema.core.metapath.item.atomic.IAnyAtomicItem;
31 import gov.nist.secauto.metaschema.core.metapath.item.atomic.IBooleanItem;
32 import gov.nist.secauto.metaschema.core.metapath.item.atomic.IDayTimeDurationItem;
33 import gov.nist.secauto.metaschema.core.metapath.item.atomic.IDecimalItem;
34 import gov.nist.secauto.metaschema.core.metapath.item.atomic.INumericItem;
35 import gov.nist.secauto.metaschema.core.metapath.item.atomic.IStringItem;
36 import gov.nist.secauto.metaschema.core.metapath.item.atomic.IUntypedAtomicItem;
37 import gov.nist.secauto.metaschema.core.metapath.item.atomic.IYearMonthDurationItem;
38
39 import edu.umd.cs.findbugs.annotations.NonNull;
40
41 class GeneralComparison
42 extends AbstractComparison {
43
44
45
46
47
48
49
50
51
52
53
54 protected GeneralComparison(@NonNull IExpression left, @NonNull Operator operator, @NonNull IExpression right) {
55 super(left, operator, right);
56 }
57
58 @Override
59 public <RESULT, CONTEXT> RESULT accept(IExpressionVisitor<RESULT, CONTEXT> visitor, CONTEXT context) {
60 return visitor.visitGeneralComparison(this, context);
61 }
62
63 @Override
64 public ISequence<? extends IBooleanItem> accept(DynamicContext dynamicContext, ISequence<?> focus) {
65 ISequence<? extends IAnyAtomicItem> leftItems = FnData.fnData(getLeft().accept(dynamicContext, focus));
66 ISequence<? extends IAnyAtomicItem> rightItems = FnData.fnData(getRight().accept(dynamicContext, focus));
67 return ISequence.of(valueCompairison(leftItems, getOperator(), rightItems));
68 }
69
70
71
72
73
74
75
76
77
78
79
80
81 @NonNull
82 protected IBooleanItem valueCompairison(
83 @NonNull ISequence<? extends IAnyAtomicItem> leftItems,
84 @NonNull Operator operator,
85 @NonNull ISequence<? extends IAnyAtomicItem> rightItems) {
86
87 IBooleanItem retval = IBooleanItem.FALSE;
88 for (IAnyAtomicItem left : leftItems.asList()) {
89 assert left != null;
90 for (IAnyAtomicItem right : rightItems.asList()) {
91 assert right != null;
92 IAnyAtomicItem leftCast;
93 IAnyAtomicItem rightCast;
94 if (left instanceof IUntypedAtomicItem) {
95 if (right instanceof IUntypedAtomicItem) {
96 leftCast = IStringItem.cast(left);
97 rightCast = IStringItem.cast(right);
98 } else {
99 leftCast = applyGeneralComparisonCast(right, left);
100 rightCast = right;
101 }
102 } else if (right instanceof IUntypedAtomicItem) {
103 leftCast = left;
104 rightCast = applyGeneralComparisonCast(left, right);
105 } else {
106 leftCast = left;
107 rightCast = right;
108 }
109
110 assert leftCast != null;
111 IBooleanItem result = compare(leftCast, operator, rightCast);
112 if (IBooleanItem.TRUE.equals(result)) {
113 retval = IBooleanItem.TRUE;
114 }
115 }
116 }
117 return retval;
118 }
119
120
121
122
123
124
125
126
127
128
129
130 @NonNull
131 protected IAnyAtomicItem applyGeneralComparisonCast(@NonNull IAnyAtomicItem item, @NonNull IAnyAtomicItem other) {
132 IAnyAtomicItem retval;
133 if (item instanceof INumericItem) {
134 retval = IDecimalItem.cast(other);
135 } else if (item instanceof IDayTimeDurationItem) {
136 retval = IDayTimeDurationItem.cast(other);
137 } else if (item instanceof IDayTimeDurationItem) {
138 retval = IYearMonthDurationItem.cast(other);
139 } else {
140 retval = item.getJavaTypeAdapter().cast(other);
141 }
142 return retval;
143 }
144 }