Skip to content

Commit 40be314

Browse files
authored
Merge pull request #760 from superannotateai/query_items
Add ability to query items count
2 parents 8990354 + f8db11f commit 40be314

File tree

6 files changed

+99
-2
lines changed

6 files changed

+99
-2
lines changed

src/superannotate/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import sys
44

55

6-
__version__ = "4.4.31dev2"
6+
__version__ = "4.4.32dev1"
77

88
os.environ.update({"sa_version": __version__})
99
sys.path.append(os.path.split(os.path.realpath(__file__))[0])

src/superannotate/lib/core/serviceproviders.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,14 @@ def saqul_query(
672672
) -> ServiceResponse:
673673
raise NotImplementedError
674674

675+
@abstractmethod
676+
def query_item_count(
677+
self,
678+
project: entities.ProjectEntity,
679+
query: str = None,
680+
) -> ServiceResponse:
681+
raise NotImplementedError
682+
675683

676684
class BaseServiceProvider:
677685
projects: BaseProjectService

src/superannotate/lib/core/usecases/items.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,52 @@ def execute(self) -> Response:
163163
return self._response
164164

165165

166+
class QueryEntitiesCountUseCase(BaseReportableUseCase):
167+
def __init__(
168+
self,
169+
reporter: Reporter,
170+
project: ProjectEntity,
171+
service_provider: BaseServiceProvider,
172+
query: str,
173+
):
174+
super().__init__(reporter)
175+
self._project = project
176+
self._service_provider = service_provider
177+
self._query = query
178+
179+
def validate_arguments(self):
180+
if self._query:
181+
response = self._service_provider.explore.validate_saqul_query(
182+
project=self._project, query=self._query
183+
)
184+
185+
if not response.ok:
186+
raise AppException(response.error)
187+
if response.data["isValidQuery"]:
188+
self._query = response.data["parsedQuery"]
189+
else:
190+
raise AppException("Incorrect query.")
191+
else:
192+
response = self._service_provider.explore.validate_saqul_query(
193+
self._project, "-"
194+
)
195+
if not response.ok:
196+
raise AppException(response.error)
197+
198+
def execute(self) -> Response:
199+
if self.is_valid():
200+
query_kwargs = {"query": self._query}
201+
service_response = self._service_provider.explore.query_item_count(
202+
self._project,
203+
**query_kwargs,
204+
)
205+
if service_response.ok:
206+
self._response.data = service_response.data
207+
else:
208+
self._response.errors = service_response.data
209+
return self._response
210+
211+
166212
class AssignItemsUseCase(BaseUseCase):
167213
CHUNK_SIZE = 500
168214

src/superannotate/lib/infrastructure/controller.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1678,3 +1678,17 @@ def query_entities(
16781678
return ItemManager.process_response(
16791679
self.service_provider, items, project, folder, map_fields=False
16801680
)
1681+
1682+
def query_items_count(self, project_name: str, query: str = None) -> int:
1683+
project = self.get_project(project_name)
1684+
1685+
use_case = usecases.QueryEntitiesCountUseCase(
1686+
reporter=self.get_default_reporter(),
1687+
project=project,
1688+
query=query,
1689+
service_provider=self.service_provider,
1690+
)
1691+
response = use_case.execute()
1692+
if response.errors:
1693+
raise AppException(response.errors)
1694+
return response.data["count"]

src/superannotate/lib/infrastructure/services/explore.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from lib.core.service_types import SubsetListResponse
1111
from lib.core.service_types import UploadCustomFieldValuesResponse
1212
from lib.core.serviceproviders import BaseExploreService
13+
from superannotate import AppException
1314

1415

1516
class ExploreService(BaseExploreService):
@@ -25,6 +26,7 @@ class ExploreService(BaseExploreService):
2526
URL_UPLOAD_CUSTOM_VALUE = "custom/metadata/item"
2627
URL_SAQUL_QUERY = "items/search"
2728
URL_VALIDATE_SAQUL_QUERY = "items/parse/query"
29+
URL_QUERY_COUNT = "items/count"
2830

2931
@property
3032
def explore_service_url(self):
@@ -201,3 +203,24 @@ def saqul_query(
201203
else:
202204
response = ServiceResponse(status=200, res_data=[])
203205
return response
206+
207+
def query_item_count(
208+
self,
209+
project: entities.ProjectEntity,
210+
query: str = None,
211+
) -> ServiceResponse:
212+
213+
params = {
214+
"project_id": project.id,
215+
"includeFolderNames": True,
216+
}
217+
data = {"query": query}
218+
response = self.client.request(
219+
urljoin(self.explore_service_url, self.URL_QUERY_COUNT),
220+
"post",
221+
params=params,
222+
data=data,
223+
)
224+
if not response.ok:
225+
raise AppException(response.error)
226+
return response

tests/integration/items/test_saqul_query.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,13 @@ def test_query(self):
5959
def test_query_on_100(self):
6060
sa.attach_items(self.PROJECT_NAME, os.path.join(DATA_SET_PATH, "100_urls.csv"))
6161
entities = sa.query(self.PROJECT_NAME, "metadata(status = NotStarted)")
62-
print(len(entities))
62+
assert len(entities) == 100
63+
assert (
64+
sa.controller.query_items_count(
65+
self.PROJECT_NAME, "metadata(status = NotStarted)"
66+
)
67+
== 100
68+
)
6369

6470
def test_validate_saqul_query(self):
6571
try:

0 commit comments

Comments
 (0)