Skip to content

Commit 8fa9800

Browse files
committed
ref: replace search_dataset with search_dataset_via_api
1 parent 052a9d6 commit 8fa9800

5 files changed

Lines changed: 61 additions & 36 deletions

File tree

CHANGELOG

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
- fix: error handling when connection to server fails on download (#75)
33
- enh: add `CKANAPI.hostname`
44
- ref: replace `user_list` with `user_autocomplete`
5+
- ref: replace `search_dataset` with `search_dataset_via_api`
6+
in `APIInterrogator`; `search_dataset` is now only free text search.
57
0.17.4
68
- fix: correctly handle dataset IDs and names in `DBExtract`
79
- fix: `get_datasets_user_shared` failed when many circles/collections exist

dcoraid/dbmodel/db_api.py

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def get_datasets_user_following(self):
6363
def get_datasets_user_owned(self):
6464
"""Return datasets the user created"""
6565
assert self.mode == "user"
66-
dbextract = self.search_dataset(
66+
dbextract = self.search_dataset_via_api(
6767
filter_queries=[f"+creator_user_id:{self.api.user_id}"],
6868
limit=0,
6969
)
@@ -78,14 +78,14 @@ def get_datasets_user_shared(self):
7878
dbextract = DBExtract()
7979

8080
for circles_batch in batched(self.get_circles(), 20):
81-
dbextract += self.search_dataset(
81+
dbextract += self.search_dataset_via_api(
8282
circles=list(circles_batch),
8383
filter_queries=[f"-creator_user_id:{self.api.user_id}"],
8484
limit=0,
8585
)
8686

8787
for collections_batch in batched(self.get_collections(), 20):
88-
dbextract += self.search_dataset(
88+
dbextract += self.search_dataset_via_api(
8989
collections=list(collections_batch),
9090
filter_queries=[f"-creator_user_id:{self.api.user_id}"],
9191
limit=0,
@@ -117,9 +117,27 @@ def get_users(self, ret_fullnames=False):
117117
else:
118118
return user_list
119119

120-
def search_dataset(self, query="*:*", filter_queries=None, circles=None,
121-
collections=None, circle_collection_union=False,
122-
limit=100):
120+
def search_dataset(self,
121+
text: str,
122+
limit: int = 100):
123+
"""Free text search for a dataset in the database
124+
125+
Parameters
126+
----------
127+
text: str
128+
text to search for
129+
limit: int
130+
number of results to return
131+
"""
132+
return self.search_dataset_via_api(query=text, limit=limit)
133+
134+
def search_dataset_via_api(self,
135+
query: str = "*:*",
136+
filter_queries: list[str] = None,
137+
circles: list[str] = None,
138+
collections: list[str] = None,
139+
circle_collection_union: bool = False,
140+
limit: int = 100):
123141
"""Search datasets via the CKAN API
124142
125143
Parameters

dcoraid/dbmodel/db_core.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ def get_users(self):
6565
pass
6666

6767
@abc.abstractmethod
68-
def search_dataset(self, query, circles=None, collections=None):
68+
def search_dataset(self, text):
69+
"""Free text search for a dataset in the database"""
6970
pass
7071

7172
@property

dcoraid/gui/browse_public/widget_browse_public.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ def on_public_search(self):
3333
api = get_ckan_api(
3434
public=not self.checkBox_public_include_private.isChecked())
3535
try:
36-
ai = APIInterrogator(api=api)
37-
dbextract = ai.search_dataset(
36+
db = APIInterrogator(api=api)
37+
dbextract = db.search_dataset(
3838
self.lineEdit_public_search.text(),
3939
limit=self.spinBox_public_rows.value())
4040
self.public_filter_chain.set_db_extract(dbextract)

tests/test_dbmodel_api.py

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -78,21 +78,21 @@ def test_search_dataset_basic():
7878
activate=True)
7979
db = db_api.APIInterrogator(api=api)
8080
# Positive test
81-
data = db.search_dataset(query="dcoraid",
82-
circles=[defaults["circle"]],
83-
collections=[defaults["collection"]],
84-
)
81+
data = db.search_dataset_via_api(query="dcoraid",
82+
circles=[defaults["circle"]],
83+
collections=[defaults["collection"]],
84+
)
8585
assert len(data) >= 1
8686
for dd in data:
8787
if dd["name"].endswith(ranstr):
8888
break
8989
else:
9090
assert False, "{} not found!".format(defaults["dataset"])
9191
# Negative test
92-
data = db.search_dataset(query="cliauwenlc_should_never_exist",
93-
circles=[defaults["circle"]],
94-
collections=[defaults["collection"]],
95-
)
92+
data = db.search_dataset_via_api(query="cliauwenlc_should_never_exist",
93+
circles=[defaults["circle"]],
94+
collections=[defaults["collection"]],
95+
)
9696
assert len(data) == 0, "search result for non-existent dataset?"
9797

9898

@@ -115,19 +115,21 @@ def test_search_dataset_limit():
115115
activate=True)
116116
dataset_ids.append(ds_dict["id"])
117117
db = db_api.APIInterrogator(api=api)
118-
data_limited = db.search_dataset(query=ranstr,
119-
circles=[defaults["circle"]],
120-
collections=[defaults["collection"]],
121-
circle_collection_union=True,
122-
limit=2
123-
)
118+
data_limited = db.search_dataset_via_api(
119+
query=ranstr,
120+
circles=[defaults["circle"]],
121+
collections=[defaults["collection"]],
122+
circle_collection_union=True,
123+
limit=2
124+
)
124125
assert len(data_limited) == 2
125-
data_unlimited = db.search_dataset(query=ranstr,
126-
circles=[defaults["circle"]],
127-
collections=[defaults["collection"]],
128-
circle_collection_union=True,
129-
limit=0
130-
)
126+
data_unlimited = db.search_dataset_via_api(
127+
query=ranstr,
128+
circles=[defaults["circle"]],
129+
collections=[defaults["collection"]],
130+
circle_collection_union=True,
131+
limit=0
132+
)
131133
assert len(data_unlimited) == 3
132134

133135

@@ -148,12 +150,13 @@ def test_search_dataset_limit_negative_error():
148150
activate=True)
149151
db = db_api.APIInterrogator(api=api)
150152
with pytest.raises(ValueError, match="must be 0 or >0"):
151-
db.search_dataset(query=ranstr,
152-
circles=[defaults["circle"]],
153-
collections=[defaults["collection"]],
154-
circle_collection_union=True,
155-
limit=-1
156-
)
153+
db.search_dataset_via_api(
154+
query=ranstr,
155+
circles=[defaults["circle"]],
156+
collections=[defaults["collection"]],
157+
circle_collection_union=True,
158+
limit=-1
159+
)
157160

158161

159162
@pytest.mark.skipif(not HAS_FIGSHARE_ACCESS,
@@ -162,7 +165,8 @@ def test_search_dataset_only_one_filter_query():
162165
# The figshare circle must have the testing user as a member
163166
api = common.get_api()
164167
db = db_api.APIInterrogator(api=api)
165-
ds = db.search_dataset(filter_queries=[f"-creator_user_id:{api.user_id}"])
168+
ds = db.search_dataset_via_api(
169+
filter_queries=[f"-creator_user_id:{api.user_id}"])
166170
for di in ds:
167171
if di["name"] == "figshare-7771184-v2":
168172
break

0 commit comments

Comments
 (0)