3
3
import math
4
4
import numpy as np
5
5
from numpy .testing import assert_array_equal
6
+ import pandas as pd
6
7
import string
7
8
8
9
import tiledb
11
12
12
13
13
14
class QueryConditionTest (DiskTestCase ):
14
- def filter_sparse (self , data , mask ):
15
+ def filter_dense (self , data , mask ):
15
16
if isinstance (mask , np .ndarray ):
16
17
mask = mask [0 ]
17
18
18
19
if isinstance (mask , float ) and np .isnan (mask ):
19
20
return data [np .invert (np .isnan (data ))]
21
+ elif np .isnat (mask ):
22
+ return data [np .invert (np .isnat (data ))]
20
23
else :
21
24
return data [data != mask ]
22
25
@@ -122,7 +125,7 @@ def test_unsigned_dense(self):
122
125
123
126
qc = tiledb .QueryCondition ("U < 5" )
124
127
result = A .query (attr_cond = qc , attrs = ["U" ])[:]
125
- assert all (self .filter_sparse (result ["U" ], mask ) < 5 )
128
+ assert all (self .filter_dense (result ["U" ], mask ) < 5 )
126
129
127
130
def test_signed_sparse (self ):
128
131
uri = self .create_input_array_UIDSA (sparse = True )
@@ -153,20 +156,20 @@ def test_signed_dense(self):
153
156
154
157
qc = tiledb .QueryCondition ("I < 1" )
155
158
result = A .query (attr_cond = qc , attrs = ["I" ])[:]
156
- assert all (self .filter_sparse (result ["I" ], mask ) < 1 )
159
+ assert all (self .filter_dense (result ["I" ], mask ) < 1 )
157
160
158
161
qc = tiledb .QueryCondition ("I < +1" )
159
162
result = A .query (attr_cond = qc , attrs = ["I" ])[:]
160
- assert all (self .filter_sparse (result ["I" ], mask ) < + 1 )
163
+ assert all (self .filter_dense (result ["I" ], mask ) < + 1 )
161
164
162
165
qc = tiledb .QueryCondition ("I < ---1" )
163
166
result = A .query (attr_cond = qc , attrs = ["I" ])[:]
164
- assert all (self .filter_sparse (result ["I" ], mask ) < - - - 1 )
167
+ assert all (self .filter_dense (result ["I" ], mask ) < - - - 1 )
165
168
166
169
qc = tiledb .QueryCondition ("-5 < I < 5" )
167
170
result = A .query (attr_cond = qc , attrs = ["I" ])[:]
168
- assert all (- 5 < self .filter_sparse (result ["I" ], mask ))
169
- assert all (self .filter_sparse (result ["I" ], mask ) < 5 )
171
+ assert all (- 5 < self .filter_dense (result ["I" ], mask ))
172
+ assert all (self .filter_dense (result ["I" ], mask ) < 5 )
170
173
171
174
def test_floats_sparse (self ):
172
175
with tiledb .open (self .create_input_array_UIDSA (sparse = True )) as A :
@@ -189,17 +192,17 @@ def test_floats_dense(self):
189
192
190
193
qc = tiledb .QueryCondition ("D > 5.0" )
191
194
result = A .query (attr_cond = qc , attrs = ["D" ])[:]
192
- assert all (self .filter_sparse (result ["D" ], mask ) > 5.0 )
195
+ assert all (self .filter_dense (result ["D" ], mask ) > 5.0 )
193
196
194
197
qc = tiledb .QueryCondition ("(D > 0.7) & (D < 3.5)" )
195
198
result = A .query (attr_cond = qc , attrs = ["D" ])[:]
196
- assert all (self .filter_sparse (result ["D" ], mask ) > 0.7 )
197
- assert all (self .filter_sparse (result ["D" ], mask ) < 3.5 )
199
+ assert all (self .filter_dense (result ["D" ], mask ) > 0.7 )
200
+ assert all (self .filter_dense (result ["D" ], mask ) < 3.5 )
198
201
199
202
qc = tiledb .QueryCondition ("0.2 < D < 0.75" )
200
203
result = A .query (attr_cond = qc , attrs = ["D" , "D" ])[:]
201
- assert all (0.2 < self .filter_sparse (result ["D" ], mask ))
202
- assert all (self .filter_sparse (result ["D" ], mask ) < 0.75 )
204
+ assert all (0.2 < self .filter_dense (result ["D" ], mask ))
205
+ assert all (self .filter_dense (result ["D" ], mask ) < 0.75 )
203
206
204
207
def test_string_sparse (self ):
205
208
with tiledb .open (self .create_input_array_UIDSA (sparse = True )) as A :
@@ -217,11 +220,11 @@ def test_string_dense(self):
217
220
with tiledb .open (self .create_input_array_UIDSA (sparse = False )) as A :
218
221
qc = tiledb .QueryCondition ("S == 'c'" )
219
222
result = A .query (attr_cond = qc , attrs = ["S" ])[:]
220
- assert all (self .filter_sparse (result ["S" ], A .attr ("S" ).fill ) == b"c" )
223
+ assert all (self .filter_dense (result ["S" ], A .attr ("S" ).fill ) == b"c" )
221
224
222
225
qc = tiledb .QueryCondition ("A == 'a'" )
223
226
result = A .query (attr_cond = qc , attrs = ["A" ])[:]
224
- assert all (self .filter_sparse (result ["A" ], A .attr ("A" ).fill ) == b"a" )
227
+ assert all (self .filter_dense (result ["A" ], A .attr ("A" ).fill ) == b"a" )
225
228
226
229
def test_combined_types_sparse (self ):
227
230
with tiledb .open (self .create_input_array_UIDSA (sparse = True )) as A :
@@ -256,34 +259,34 @@ def test_combined_types_dense(self):
256
259
257
260
qc = tiledb .QueryCondition ("(I > 0) & ((-3 < D) & (D < 3.0))" )
258
261
result = A .query (attr_cond = qc , attrs = ["I" , "D" ])[:]
259
- res_I = self .filter_sparse (result ["I" ], mask_I )
260
- res_D = self .filter_sparse (result ["D" ], mask_D )
262
+ res_I = self .filter_dense (result ["I" ], mask_I )
263
+ res_D = self .filter_dense (result ["D" ], mask_D )
261
264
assert all (res_I > 0 ) & all (- 3 < res_D ) & all (res_D < 3.0 )
262
265
263
266
qc = tiledb .QueryCondition ("U >= 3 and 0.7 < D" )
264
267
result = A .query (attr_cond = qc , attrs = ["U" , "D" ])[:]
265
- res_U = self .filter_sparse (result ["U" ], mask_U )
266
- res_D = self .filter_sparse (result ["D" ], mask_D )
268
+ res_U = self .filter_dense (result ["U" ], mask_U )
269
+ res_D = self .filter_dense (result ["D" ], mask_D )
267
270
assert all (res_U >= 3 ) & all (0.7 < res_D )
268
271
269
272
qc = tiledb .QueryCondition ("(0.2 < D and D < 0.75) and (-5 < I < 5)" )
270
273
result = A .query (attr_cond = qc , attrs = ["D" , "I" ])[:]
271
- res_D = self .filter_sparse (result ["D" ], mask_D )
272
- res_I = self .filter_sparse (result ["I" ], mask_I )
274
+ res_D = self .filter_dense (result ["D" ], mask_D )
275
+ res_I = self .filter_dense (result ["I" ], mask_I )
273
276
assert all ((0.2 < res_D ) & (res_D < 0.75 ))
274
277
assert all ((- 5 < res_I ) & (res_I < 5 ))
275
278
276
279
qc = tiledb .QueryCondition ("(-5 < I <= -1) and (0.2 < D < 0.75)" )
277
280
result = A .query (attr_cond = qc , attrs = ["D" , "I" ])[:]
278
- res_D = self .filter_sparse (result ["D" ], mask_D )
279
- res_I = self .filter_sparse (result ["I" ], mask_I )
281
+ res_D = self .filter_dense (result ["D" ], mask_D )
282
+ res_I = self .filter_dense (result ["I" ], mask_I )
280
283
assert all ((0.2 < res_D ) & (res_D < 0.75 ))
281
284
assert all ((- 5 < res_I ) & (res_I <= - 1 ))
282
285
283
286
qc = tiledb .QueryCondition ("(0.2 < D < 0.75) and (-5 < I < 5)" )
284
287
result = A .query (attr_cond = qc , attrs = ["D" , "I" ])[:]
285
- res_D = self .filter_sparse (result ["D" ], mask_D )
286
- res_I = self .filter_sparse (result ["I" ], mask_I )
288
+ res_D = self .filter_dense (result ["D" ], mask_D )
289
+ res_I = self .filter_dense (result ["I" ], mask_I )
287
290
assert all ((0.2 < res_D ) & (res_D < 0.75 ))
288
291
assert all ((- 5 < res_I ) & (res_I < 5 ))
289
292
@@ -315,11 +318,11 @@ def test_check_attrs_dense(self):
315
318
316
319
qc = tiledb .QueryCondition ("U < 0.1" )
317
320
result = A .query (attr_cond = qc , attrs = ["U" ])[:]
318
- assert all (self .filter_sparse (result ["U" ], mask ) < 0.1 )
321
+ assert all (self .filter_dense (result ["U" ], mask ) < 0.1 )
319
322
320
323
qc = tiledb .QueryCondition ("U < 1.0" )
321
324
result = A .query (attr_cond = qc , attrs = ["U" ])[:]
322
- assert all (self .filter_sparse (result ["U" ], mask ) < 1.0 )
325
+ assert all (self .filter_dense (result ["U" ], mask ) < 1.0 )
323
326
324
327
with self .assertRaises (tiledb .TileDBError ):
325
328
qc = tiledb .QueryCondition ("U < '1'" )
@@ -485,12 +488,12 @@ def test_or_dense(self):
485
488
486
489
qc = tiledb .QueryCondition ("(D < 0.25) | (D > 0.75)" )
487
490
result = A .query (attr_cond = qc , attrs = ["D" ])[:]
488
- res = self .filter_sparse (result ["D" ], mask )
491
+ res = self .filter_dense (result ["D" ], mask )
489
492
assert all ((res < 0.25 ) | (res > 0.75 ))
490
493
491
494
qc = tiledb .QueryCondition ("(D < 0.25) or (D > 0.75)" )
492
495
result = A .query (attr_cond = qc , attrs = ["D" ])[:]
493
- res = self .filter_sparse (result ["D" ], mask )
496
+ res = self .filter_dense (result ["D" ], mask )
494
497
assert all ((res < 0.25 ) | (res > 0.75 ))
495
498
496
499
@pytest .mark .skipif (
@@ -584,26 +587,51 @@ def test_in_operator_dense(self):
584
587
585
588
qc = tiledb .QueryCondition ("U in [1, 2, 3]" )
586
589
result = A .query (attr_cond = qc , attrs = ["U" ])[:]
587
- for val in self .filter_sparse (result ["U" ], U_mask ):
590
+ for val in self .filter_dense (result ["U" ], U_mask ):
588
591
assert val in [1 , 2 , 3 ]
589
592
590
593
qc = tiledb .QueryCondition ("S in ['a', 'e', 'i', 'o', 'u']" )
591
594
result = A .query (attr_cond = qc , attrs = ["S" ])[:]
592
- for val in self .filter_sparse (result ["S" ], S_mask ):
595
+ for val in self .filter_dense (result ["S" ], S_mask ):
593
596
assert val in [b"a" , b"e" , b"i" , b"o" , b"u" ]
594
597
595
598
qc = tiledb .QueryCondition (
596
599
"S in ['a', 'e', 'i', 'o', 'u'] and U in [5, 6, 7]"
597
600
)
598
601
result = A .query (attr_cond = qc )[:]
599
- for val in self .filter_sparse (result ["U" ], U_mask ):
602
+ for val in self .filter_dense (result ["U" ], U_mask ):
600
603
assert val in [5 , 6 , 7 ]
601
- for val in self .filter_sparse (result ["S" ], S_mask ):
604
+ for val in self .filter_dense (result ["S" ], S_mask ):
602
605
assert val in [b"a" , b"e" , b"i" , b"o" , b"u" ]
603
606
604
607
result = A .query (attr_cond = tiledb .QueryCondition ("U in [8]" ))[:]
605
- for val in self .filter_sparse (result ["U" ], U_mask ):
608
+ for val in self .filter_dense (result ["U" ], U_mask ):
606
609
assert val == 8
607
610
608
611
result = A .query (attr_cond = tiledb .QueryCondition ("S in ['8']" ))[:]
609
- assert len (self .filter_sparse (result ["S" ], S_mask )) == 0
612
+ assert len (self .filter_dense (result ["S" ], S_mask )) == 0
613
+
614
+ def test_dense_datetime (self ):
615
+ uri = self .path ("query-filter-dense-datetime.tdb" )
616
+
617
+ data = pd .DataFrame (
618
+ np .random .randint (438923600 , 243892360000 , 20 ),
619
+ columns = ["dates" ],
620
+ )
621
+
622
+ tiledb .from_pandas (
623
+ uri ,
624
+ data ,
625
+ column_types = {"dates" : "datetime64[ns]" },
626
+ )
627
+
628
+ with tiledb .open (uri ) as A :
629
+ idx = 5
630
+
631
+ dt_mask = A .attr ("dates" ).fill
632
+ search_date = data ["dates" ][idx ]
633
+
634
+ qc = tiledb .QueryCondition (f"dates == { search_date } " )
635
+ result = A .query (attr_cond = qc ).df [:]
636
+
637
+ assert all (self .filter_dense (result ["dates" ], dt_mask ) == A [idx ]["dates" ])
0 commit comments