1717
1818package org .apache .arrow .vector .compare ;
1919
20- import java .util .List ;
21-
2220import org .apache .arrow .vector .BaseFixedWidthVector ;
23- import org .apache .arrow .vector .FieldVector ;
2421import org .apache .arrow .vector .Float4Vector ;
2522import org .apache .arrow .vector .Float8Vector ;
2623import org .apache .arrow .vector .ValueVector ;
27- import org .apache .arrow .vector .complex .BaseRepeatedValueVector ;
28- import org .apache .arrow .vector .complex .FixedSizeListVector ;
29- import org .apache .arrow .vector .complex .ListVector ;
30- import org .apache .arrow .vector .complex .NonNullableStructVector ;
31- import org .apache .arrow .vector .complex .UnionVector ;
3224
3325/**
3426 * Visitor to compare floating point.
@@ -49,24 +41,16 @@ public class ApproxEqualsVisitor extends RangeEqualsVisitor {
4941 private DiffFunction <Double > doubleDiffFunction =
5042 (Double value1 , Double value2 ) -> Math .abs (value1 - value2 );
5143
52- public ApproxEqualsVisitor (ValueVector right , float epsilon ) {
53- this (right , epsilon , epsilon , true );
54- }
55-
56- public ApproxEqualsVisitor (ValueVector right , float floatEpsilon , double doubleEpsilon ) {
57- this (right , floatEpsilon , doubleEpsilon , true );
58- }
59-
60- public ApproxEqualsVisitor (ValueVector right , float floatEpsilon , double doubleEpsilon , boolean typeCheckNeeded ) {
61- this (right , floatEpsilon , doubleEpsilon , typeCheckNeeded , 0 , 0 , right .getValueCount ());
62- }
63-
6444 /**
65- * Construct an instance.
45+ * Constructs a new instance.
46+ *
47+ * @param left left vector
48+ * @param right right vector
49+ * @param floatEpsilon difference for float values
50+ * @param doubleEpsilon difference for double values
6651 */
67- public ApproxEqualsVisitor (ValueVector right , float floatEpsilon , double doubleEpsilon , boolean typeCheckNeeded ,
68- int leftStart , int rightStart , int length ) {
69- super (right , rightStart , leftStart , length , typeCheckNeeded );
52+ public ApproxEqualsVisitor (ValueVector left , ValueVector right , float floatEpsilon , double doubleEpsilon ) {
53+ super (left , right , true );
7054 this .floatEpsilon = floatEpsilon ;
7155 this .doubleEpsilon = doubleEpsilon ;
7256 }
@@ -80,151 +64,38 @@ public void setDoubleDiffFunction(DiffFunction<Double> doubleDiffFunction) {
8064 }
8165
8266 @ Override
83- public Boolean visit (BaseFixedWidthVector left , Void value ) {
67+ public Boolean visit (BaseFixedWidthVector left , Range range ) {
8468 if (left instanceof Float4Vector ) {
85- return validate ( left ) && float4ApproxEquals (( Float4Vector ) left );
69+ return float4ApproxEquals (range );
8670 } else if (left instanceof Float8Vector ) {
87- return validate ( left ) && float8ApproxEquals (( Float8Vector ) left );
71+ return float8ApproxEquals (range );
8872 } else {
89- return super .visit (left , value );
73+ return super .visit (left , range );
9074 }
9175 }
9276
9377 @ Override
94- protected boolean compareUnionVectors (UnionVector left ) {
95-
96- UnionVector rightVector = (UnionVector ) right ;
97-
98- List <FieldVector > leftChildren = left .getChildrenFromFields ();
99- List <FieldVector > rightChildren = rightVector .getChildrenFromFields ();
100-
101- if (leftChildren .size () != rightChildren .size ()) {
102- return false ;
103- }
104-
105- for (int k = 0 ; k < leftChildren .size (); k ++) {
106- ApproxEqualsVisitor visitor = new ApproxEqualsVisitor (rightChildren .get (k ),
107- floatEpsilon , doubleEpsilon );
108- if (!leftChildren .get (k ).accept (visitor , null )) {
109- return false ;
110- }
111- }
112- return true ;
78+ protected ApproxEqualsVisitor createInnerVisitor (ValueVector left , ValueVector right ) {
79+ return new ApproxEqualsVisitor (left , right , floatEpsilon , doubleEpsilon );
11380 }
11481
115- @ Override
116- protected boolean compareStructVectors (NonNullableStructVector left ) {
82+ private boolean float4ApproxEquals (Range range ) {
83+ Float4Vector leftVector = (Float4Vector ) getLeft ();
84+ Float4Vector rightVector = (Float4Vector ) getRight ();
11785
118- NonNullableStructVector rightVector = (NonNullableStructVector ) right ;
86+ for (int i = 0 ; i < range .getLength (); i ++) {
87+ int leftIndex = range .getLeftStart () + i ;
88+ int rightIndex = range .getRightStart () + i ;
11989
120- if (!left .getChildFieldNames ().equals (rightVector .getChildFieldNames ())) {
121- return false ;
122- }
90+ boolean isNull = leftVector .isNull (leftIndex );
12391
124- for (String name : left .getChildFieldNames ()) {
125- ApproxEqualsVisitor visitor = new ApproxEqualsVisitor (rightVector .getChild (name ),
126- floatEpsilon , doubleEpsilon );
127- if (!left .getChild (name ).accept (visitor , null )) {
92+ if (isNull != rightVector .isNull (rightIndex )) {
12893 return false ;
12994 }
130- }
131-
132- return true ;
133- }
134-
135- @ Override
136- protected boolean compareListVectors (ListVector left ) {
137-
138- for (int i = 0 ; i < length ; i ++) {
139- int leftIndex = leftStart + i ;
140- int rightIndex = rightStart + i ;
141-
142- boolean isNull = left .isNull (leftIndex );
143- if (isNull != right .isNull (rightIndex )) {
144- return false ;
145- }
146-
147- int offsetWidth = BaseRepeatedValueVector .OFFSET_WIDTH ;
14895
14996 if (!isNull ) {
150- final int startIndexLeft = left .getOffsetBuffer ().getInt (leftIndex * offsetWidth );
151- final int endIndexLeft = left .getOffsetBuffer ().getInt ((leftIndex + 1 ) * offsetWidth );
152-
153- final int startIndexRight = right .getOffsetBuffer ().getInt (rightIndex * offsetWidth );
154- final int endIndexRight = right .getOffsetBuffer ().getInt ((rightIndex + 1 ) * offsetWidth );
155-
156- if ((endIndexLeft - startIndexLeft ) != (endIndexRight - startIndexRight )) {
157- return false ;
158- }
159-
160- ValueVector leftDataVector = left .getDataVector ();
161- ValueVector rightDataVector = ((ListVector )right ).getDataVector ();
162-
163- if (!leftDataVector .accept (new ApproxEqualsVisitor (rightDataVector , floatEpsilon , doubleEpsilon ,
164- typeCheckNeeded , startIndexLeft , startIndexRight , (endIndexLeft - startIndexLeft )), null )) {
165- return false ;
166- }
167- }
168- }
169- return true ;
170- }
171-
172- protected boolean compareFixedSizeListVectors (FixedSizeListVector left ) {
173-
174- if (left .getListSize () != ((FixedSizeListVector )right ).getListSize ()) {
175- return false ;
176- }
177-
178- for (int i = 0 ; i < length ; i ++) {
179- int leftIndex = leftStart + i ;
180- int rightIndex = rightStart + i ;
181-
182- boolean isNull = left .isNull (leftIndex );
183- if (isNull != right .isNull (rightIndex )) {
184- return false ;
185- }
186-
187- int listSize = left .getListSize ();
188-
189- if (!isNull ) {
190- final int startIndexLeft = leftIndex * listSize ;
191- final int endIndexLeft = (leftIndex + 1 ) * listSize ;
192-
193- final int startIndexRight = rightIndex * listSize ;
194- final int endIndexRight = (rightIndex + 1 ) * listSize ;
195-
196- if ((endIndexLeft - startIndexLeft ) != (endIndexRight - startIndexRight )) {
197- return false ;
198- }
199-
200- ValueVector leftDataVector = left .getDataVector ();
201- ValueVector rightDataVector = ((FixedSizeListVector )right ).getDataVector ();
202-
203- if (!leftDataVector .accept (new ApproxEqualsVisitor (rightDataVector , floatEpsilon , doubleEpsilon ,
204- typeCheckNeeded , startIndexLeft , startIndexRight , (endIndexLeft - startIndexLeft )), null )) {
205- return false ;
206- }
207- }
208- }
209- return true ;
210- }
211-
212- private boolean float4ApproxEquals (Float4Vector left ) {
213-
214- for (int i = 0 ; i < length ; i ++) {
215- int leftIndex = leftStart + i ;
216- int rightIndex = rightStart + i ;
217-
218- boolean isNull = left .isNull (leftIndex );
219-
220- if (isNull != right .isNull (rightIndex )) {
221- return false ;
222- }
223-
224- if (!isNull ) {
225-
226- Float leftValue = left .get (leftIndex );
227- Float rightValue = ((Float4Vector )right ).get (rightIndex );
97+ Float leftValue = leftVector .get (leftIndex );
98+ Float rightValue = rightVector .get (rightIndex );
22899 if (leftValue .isNaN ()) {
229100 return rightValue .isNaN ();
230101 }
@@ -239,21 +110,24 @@ private boolean float4ApproxEquals(Float4Vector left) {
239110 return true ;
240111 }
241112
242- private boolean float8ApproxEquals (Float8Vector left ) {
243- for (int i = 0 ; i < length ; i ++) {
244- int leftIndex = leftStart + i ;
245- int rightIndex = rightStart + i ;
113+ private boolean float8ApproxEquals (Range range ) {
114+ Float8Vector leftVector = (Float8Vector ) getLeft ();
115+ Float8Vector rightVector = (Float8Vector ) getRight ();
116+
117+ for (int i = 0 ; i < range .getLength (); i ++) {
118+ int leftIndex = range .getLeftStart () + i ;
119+ int rightIndex = range .getRightStart () + i ;
246120
247- boolean isNull = left .isNull (leftIndex );
121+ boolean isNull = leftVector .isNull (leftIndex );
248122
249- if (isNull != right .isNull (rightIndex )) {
123+ if (isNull != rightVector .isNull (rightIndex )) {
250124 return false ;
251125 }
252126
253127 if (!isNull ) {
254128
255- Double leftValue = left .get (leftIndex );
256- Double rightValue = (( Float8Vector ) right ) .get (rightIndex );
129+ Double leftValue = leftVector .get (leftIndex );
130+ Double rightValue = rightVector .get (rightIndex );
257131 if (leftValue .isNaN ()) {
258132 return rightValue .isNaN ();
259133 }
0 commit comments