From d0577b94af827efd6cdfa2fec5c49d5f05a97a60 Mon Sep 17 00:00:00 2001 From: bmccandless Date: Fri, 29 May 2020 14:47:46 -0700 Subject: [PATCH] Return an empty matrix if no rows or columns are selected (#1501) Return an empty matrix if no rows or columns are selected Fixes #1499 --- server/data_cxg/cxg_adaptor.py | 7 +++++++ server/data_cxg/cxg_util.py | 2 +- server/test/test_api.py | 13 +++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/server/data_cxg/cxg_adaptor.py b/server/data_cxg/cxg_adaptor.py index bbdd94c3..968be4eb 100644 --- a/server/data_cxg/cxg_adaptor.py +++ b/server/data_cxg/cxg_adaptor.py @@ -237,6 +237,13 @@ class CxgAdaptor(DataAdaptor): def get_X_array(self, obs_mask=None, var_mask=None): obs_items = pack_selector_from_mask(obs_mask) var_items = pack_selector_from_mask(var_mask) + if obs_items is None or var_items is None: + # If either zero rows or zero columns were selected, return an empty 2d array. + shape = self.get_shape() + obs_size = 0 if obs_items is None else shape[0] if obs_mask is None else np.count_nonzero(obs_mask) + var_size = 0 if var_items is None else shape[1] if var_mask is None else np.count_nonzero(var_mask) + return np.ndarray((obs_size, var_size)) + X = self.open_array("X") if X.schema.sparse: diff --git a/server/data_cxg/cxg_util.py b/server/data_cxg/cxg_util.py index 26ef2297..f5759e8d 100644 --- a/server/data_cxg/cxg_util.py +++ b/server/data_cxg/cxg_util.py @@ -20,7 +20,7 @@ def pack_selector_from_mask(boolarray): def pack_selector_from_indices(selector): if len(selector) == 0: - return slice(None) + return None result = [] current = slice(selector[0], selector[0]) diff --git a/server/test/test_api.py b/server/test/test_api.py index 319a5847..4db3aea5 100644 --- a/server/test/test_api.py +++ b/server/test/test_api.py @@ -244,6 +244,19 @@ class EndPoints(object): self.assertEqual(df["n_rows"], 2638) self.assertEqual(df["n_cols"], 1) + def test_data_get_unknown_filter_fbs(self): + index_col_name = self.schema["schema"]["annotations"]["var"]["index"] + endpoint = "data/var" + query = f"var:{index_col_name}=UNKNOWN" + url = f"{self.URL_BASE}{endpoint}?{query}" + header = {"Accept": "application/octet-stream"} + result = self.session.get(url, headers=header) + self.assertEqual(result.status_code, HTTPStatus.OK) + self.assertEqual(result.headers["Content-Type"], "application/octet-stream") + df = decode_fbs.decode_matrix_FBS(result.content) + self.assertEqual(df["n_rows"], 2638) + self.assertEqual(df["n_cols"], 0) + def test_data_put_single_var(self): endpoint = "data/var" url = f"{self.URL_BASE}{endpoint}"