@@ -5807,62 +5807,82 @@ def test_astype_attrs(self):
5807
5807
assert not data .astype (float , keep_attrs = False ).attrs
5808
5808
assert not data .astype (float , keep_attrs = False ).var1 .attrs
5809
5809
5810
- def test_query_single_dim (self ):
5811
- """Test querying a single dimension."""
5810
+ @pytest .mark .parametrize ("parser" , ["pandas" , "python" ])
5811
+ @pytest .mark .parametrize ("engine" , ["python" , "numexpr" , None ])
5812
+ @pytest .mark .parametrize ("backend" , ["numpy" , "dask" ])
5813
+ def test_query (self , backend , engine , parser ):
5814
+ """Test querying a dataset."""
5812
5815
5813
5816
# setup test data
5814
5817
np .random .seed (42 )
5815
5818
a = np .arange (0 , 10 , 1 )
5816
5819
b = np .random .randint (0 , 100 , size = 10 )
5817
5820
c = np .linspace (0 , 1 , 20 )
5818
5821
d = np .arange (0 , 200 ).reshape (10 , 20 )
5819
- ds = Dataset (
5820
- {"a" : ("x" , a ), "b" : ("x" , b ), "c" : ("y" , c ), "d" : (("x" , "y" ), d )}
5821
- )
5822
+ if backend == "numpy" :
5823
+ ds = Dataset (
5824
+ {"a" : ("x" , a ), "b" : ("x" , b ), "c" : ("y" , c ), "d" : (("x" , "y" ), d )}
5825
+ )
5826
+ elif backend == "dask" :
5827
+ ds = Dataset (
5828
+ {
5829
+ "a" : ("x" , da .from_array (a , chunks = 3 )),
5830
+ "b" : ("x" , da .from_array (b , chunks = 3 )),
5831
+ "c" : ("y" , da .from_array (c , chunks = 7 )),
5832
+ "d" : (("x" , "y" ), da .from_array (d , chunks = (3 , 7 ))),
5833
+ }
5834
+ )
5822
5835
5823
5836
# query single dim, single variable
5824
- actual = ds .query (x = "a > 5" )
5837
+ actual = ds .query (x = "a > 5" , engine = engine , parser = parser )
5825
5838
expect = ds .isel (x = (a > 5 ))
5826
5839
assert_identical (expect , actual )
5827
5840
5828
5841
# query single dim, single variable, via dict
5829
- actual = ds .query (dict (x = "a > 5" ))
5842
+ actual = ds .query (dict (x = "a > 5" ), engine = engine , parser = parser )
5830
5843
expect = ds .isel (dict (x = (a > 5 )))
5831
5844
assert_identical (expect , actual )
5832
5845
5833
5846
# query single dim, single variable
5834
- actual = ds .query (x = "b > 50" )
5847
+ actual = ds .query (x = "b > 50" , engine = engine , parser = parser )
5835
5848
expect = ds .isel (x = (b > 50 ))
5836
5849
assert_identical (expect , actual )
5837
5850
5838
5851
# query single dim, single variable
5839
- actual = ds .query (y = "c < .5" )
5852
+ actual = ds .query (y = "c < .5" , engine = engine , parser = parser )
5840
5853
expect = ds .isel (y = (c < 0.5 ))
5841
5854
assert_identical (expect , actual )
5842
5855
5843
5856
# query single dim, multiple variables
5844
- actual = ds .query (x = "(a > 5) & (b > 50)" )
5857
+ actual = ds .query (x = "(a > 5) & (b > 50)" , engine = engine , parser = parser )
5845
5858
expect = ds .isel (x = ((a > 5 ) & (b > 50 )))
5846
5859
assert_identical (expect , actual )
5847
5860
5848
5861
# support pandas query parser
5849
- actual = ds .query (x = "(a > 5) and (b > 50)" )
5850
- expect = ds .isel (x = ((a > 5 ) & (b > 50 )))
5851
- assert_identical (expect , actual )
5862
+ if parser == "pandas" :
5863
+ actual = ds .query (x = "(a > 5) and (b > 50)" , engine = engine , parser = parser )
5864
+ expect = ds .isel (x = ((a > 5 ) & (b > 50 )))
5865
+ assert_identical (expect , actual )
5852
5866
5853
5867
# query multiple dims via kwargs
5854
- actual = ds .query (x = "a > 5" , y = "c < .5" )
5868
+ actual = ds .query (x = "a > 5" , y = "c < .5" , engine = engine , parser = parser )
5855
5869
expect = ds .isel (x = (a > 5 ), y = (c < 0.5 ))
5856
5870
assert_identical (expect , actual )
5857
5871
5858
5872
# query multiple dims via dict
5859
- actual = ds .query (dict (x = "a > 5" , y = "c < .5" ))
5873
+ actual = ds .query (dict (x = "a > 5" , y = "c < .5" ), engine = engine , parser = parser )
5860
5874
expect = ds .isel (dict (x = (a > 5 ), y = (c < 0.5 )))
5861
5875
assert_identical (expect , actual )
5862
5876
5863
- # TODO test error handling
5864
-
5865
- # TODO test dask data variables
5877
+ # test error handling
5878
+ with pytest .raises (ValueError ):
5879
+ ds .query ("a > 5" ) # must be dict
5880
+ with pytest .raises (IndexError ):
5881
+ ds .query (y = "a > 5" ) # wrong length dimension
5882
+ with pytest .raises (IndexError ):
5883
+ ds .query (x = "c < .5" ) # wrong length dimension
5884
+ with pytest .raises (IndexError ):
5885
+ ds .query (x = "d > 100" ) # wrong number of dimensions
5866
5886
5867
5887
5868
5888
# Py.test tests
0 commit comments