@@ -5807,62 +5807,82 @@ def test_astype_attrs(self):
58075807 assert not data .astype (float , keep_attrs = False ).attrs
58085808 assert not data .astype (float , keep_attrs = False ).var1 .attrs
58095809
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."""
58125815
58135816 # setup test data
58145817 np .random .seed (42 )
58155818 a = np .arange (0 , 10 , 1 )
58165819 b = np .random .randint (0 , 100 , size = 10 )
58175820 c = np .linspace (0 , 1 , 20 )
58185821 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+ )
58225835
58235836 # query single dim, single variable
5824- actual = ds .query (x = "a > 5" )
5837+ actual = ds .query (x = "a > 5" , engine = engine , parser = parser )
58255838 expect = ds .isel (x = (a > 5 ))
58265839 assert_identical (expect , actual )
58275840
58285841 # 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 )
58305843 expect = ds .isel (dict (x = (a > 5 )))
58315844 assert_identical (expect , actual )
58325845
58335846 # query single dim, single variable
5834- actual = ds .query (x = "b > 50" )
5847+ actual = ds .query (x = "b > 50" , engine = engine , parser = parser )
58355848 expect = ds .isel (x = (b > 50 ))
58365849 assert_identical (expect , actual )
58375850
58385851 # query single dim, single variable
5839- actual = ds .query (y = "c < .5" )
5852+ actual = ds .query (y = "c < .5" , engine = engine , parser = parser )
58405853 expect = ds .isel (y = (c < 0.5 ))
58415854 assert_identical (expect , actual )
58425855
58435856 # 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 )
58455858 expect = ds .isel (x = ((a > 5 ) & (b > 50 )))
58465859 assert_identical (expect , actual )
58475860
58485861 # 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 )
58525866
58535867 # 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 )
58555869 expect = ds .isel (x = (a > 5 ), y = (c < 0.5 ))
58565870 assert_identical (expect , actual )
58575871
58585872 # 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 )
58605874 expect = ds .isel (dict (x = (a > 5 ), y = (c < 0.5 )))
58615875 assert_identical (expect , actual )
58625876
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
58665886
58675887
58685888# Py.test tests
0 commit comments