Skip to content

Commit 4d24517

Browse files
committed
updated query, get_subsets
1 parent 35b0846 commit 4d24517

File tree

7 files changed

+30
-159
lines changed

7 files changed

+30
-159
lines changed

src/superannotate/lib/app/interface/sdk_interface.py

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2435,12 +2435,22 @@ def query(
24352435
:rtype: list of dicts
24362436
"""
24372437
project_name, folder_name = extract_project_folder(project)
2438-
response = self.controller.query_entities(
2439-
project_name, folder_name, query, subset
2440-
)
2441-
if response.errors:
2442-
raise AppException(response.errors)
2443-
return BaseSerializer.serialize_iterable(response.data, exclude={"meta"})
2438+
project = self.controller.get_project(project_name)
2439+
subset_id = None
2440+
if subset:
2441+
subset = next(
2442+
(i for i in project.list_subsets() if i["name"] == subset), None
2443+
)
2444+
if not subset:
2445+
raise AppException("Subset not found")
2446+
subset_id = subset["id"]
2447+
if folder_name:
2448+
folder = project.get_folder(folder_name)
2449+
_items = folder.list_items(query=query, subset_id=subset_id)
2450+
else:
2451+
_items = project.list_items(query=query, subset_id=subset_id)
2452+
exclude = {"custom_metadata", "meta"}
2453+
return [serialize_item(i, project).dict(exclude=exclude) for i in _items]
24442454

24452455
def get_item_metadata(
24462456
self,
@@ -3213,6 +3223,8 @@ def delete_custom_values(
32133223
def add_items_to_subset(
32143224
self, project: NotEmptyStr, subset: NotEmptyStr, items: List[dict]
32153225
):
3226+
3227+
# todo we can update the interface because there has been no usage since may 26
32163228
"""
32173229
32183230
Associates selected items with a given subset. Non-existing subset will be automatically created.
@@ -3286,12 +3298,10 @@ def add_items_to_subset(
32863298
"""
32873299

32883300
project_name, _ = extract_project_folder(project)
3289-
project = self.controller.projects.get_by_name(project_name).data
3290-
response = self.controller.subsets.add_items(project, subset, items)
3291-
if response.errors:
3292-
raise AppException(response.errors)
3301+
project = self.controller.get_project(project_name)
3302+
successed, skipped, failed = project.add_items_to_subset(subset, items)
32933303

3294-
return response.data
3304+
return {"successed": successed, "skipped": skipped, "failed": failed}
32953305

32963306
def set_approval_statuses(
32973307
self,

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

Lines changed: 0 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from concurrent.futures import ThreadPoolExecutor
77
from typing import Dict
88
from typing import List
9-
from typing import Optional
109

1110
import superannotate.lib.core as constants
1211
from lib.core.conditions import Condition
@@ -17,7 +16,6 @@
1716
from lib.core.entities import FolderEntity
1817
from lib.core.entities import ImageEntity
1918
from lib.core.entities import ProjectEntity
20-
from lib.core.entities import SubSetEntity
2119
from lib.core.entities import VideoEntity
2220
from lib.core.exceptions import AppException
2321
from lib.core.exceptions import AppValidationException
@@ -34,31 +32,6 @@
3432
logger = logging.getLogger("sa")
3533

3634

37-
class GetItemByIDUseCase(BaseUseCase):
38-
def __init__(self, item_id, project, service_provider):
39-
self._item_id = item_id
40-
self._project = project
41-
self._service_provider = service_provider
42-
super().__init__()
43-
44-
def execute(
45-
self,
46-
):
47-
try:
48-
response = self._service_provider.items.get_by_id(
49-
item_id=self._item_id,
50-
project_id=self._project.id,
51-
project_type=self._project.type,
52-
)
53-
if not response.ok:
54-
self._response.errors = response.error
55-
except AppException as e:
56-
self._response.errors = e
57-
else:
58-
self._response.data = response.data
59-
return self._response
60-
61-
6235
class GetItem(BaseReportableUseCase):
6336
def __init__(
6437
self,
@@ -124,94 +97,6 @@ def execute(self) -> Response:
12497
return self._response
12598

12699

127-
class QueryEntitiesUseCase(BaseReportableUseCase):
128-
def __init__(
129-
self,
130-
reporter: Reporter,
131-
project: ProjectEntity,
132-
folder: FolderEntity,
133-
service_provider: BaseServiceProvider,
134-
query: str,
135-
subset: str = None,
136-
):
137-
super().__init__(reporter)
138-
self._project = project
139-
self._folder = folder
140-
self._service_provider = service_provider
141-
self._query = query
142-
self._subset = subset
143-
144-
def validate_arguments(self):
145-
if self._query:
146-
response = self._service_provider.validate_saqul_query(
147-
project=self._project, query=self._query
148-
)
149-
150-
if not response.ok:
151-
raise AppException(response.error)
152-
if response.data["isValidQuery"]:
153-
self._query = response.data["parsedQuery"]
154-
else:
155-
raise AppException("Incorrect query.")
156-
else:
157-
response = self._service_provider.validate_saqul_query(self._project, "-")
158-
if not response.ok:
159-
raise AppException(response.error)
160-
161-
if not any([self._query, self._subset]):
162-
raise AppException(
163-
"The query and subset params cannot have the value None at the same time."
164-
)
165-
if self._subset and not self._folder.is_root:
166-
raise AppException(
167-
"The folder name should be specified in the query string."
168-
)
169-
170-
def execute(self) -> Response:
171-
if self.is_valid():
172-
query_kwargs = {}
173-
if self._subset:
174-
subset: Optional[SubSetEntity] = None
175-
response = self._service_provider.subsets.list(self._project)
176-
if response.ok:
177-
subset = next(
178-
(_sub for _sub in response.data if _sub.name == self._subset),
179-
None,
180-
)
181-
else:
182-
self._response.errors = response.error
183-
return self._response
184-
if not subset:
185-
self._response.errors = AppException(
186-
"Subset not found. Use the superannotate."
187-
"get_subsets() function to get a list of the available subsets."
188-
)
189-
return self._response
190-
query_kwargs["subset_id"] = subset.id
191-
if self._query:
192-
query_kwargs["query"] = self._query
193-
query_kwargs["folder"] = (
194-
None if self._folder.name == "root" else self._folder
195-
)
196-
service_response = self._service_provider.saqul_query(
197-
self._project,
198-
**query_kwargs,
199-
)
200-
if service_response.ok:
201-
data = []
202-
for i, item in enumerate(service_response.data):
203-
tmp_item = GetItem.serialize_entity(
204-
BaseItemEntity(**item), self._project
205-
)
206-
folder_path = f"{'/' + item['folder_name'] if not item['is_root_folder'] else ''}"
207-
tmp_item.path = f"{self._project.name}" + folder_path
208-
data.append(tmp_item)
209-
self._response.data = data
210-
else:
211-
self._response.errors = service_response.data
212-
return self._response
213-
214-
215100
class ListItems(BaseUseCase):
216101
def __init__(
217102
self,

src/superannotate/lib/infrastructure/controller.py

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -306,14 +306,6 @@ def get_by_name(
306306
)
307307
return use_case.execute()
308308

309-
def get_by_id(self, item_id: int, project: ProjectEntity):
310-
use_case = usecases.GetItemByIDUseCase(
311-
item_id=item_id,
312-
project=project,
313-
service_provider=self.service_provider,
314-
)
315-
return use_case.execute()
316-
317309
def list(
318310
self,
319311
project: ProjectEntity,
@@ -1167,19 +1159,3 @@ def get_annotations_per_frame(
11671159
service_provider=self.service_provider,
11681160
)
11691161
return use_case.execute()
1170-
1171-
def query_entities(
1172-
self, project_name: str, folder_name: str, query: str = None, subset: str = None
1173-
):
1174-
project = self.get_project(project_name)
1175-
folder = self.get_folder(project, folder_name)
1176-
1177-
use_case = usecases.QueryEntitiesUseCase(
1178-
reporter=self.get_default_reporter(),
1179-
project=project,
1180-
folder=folder,
1181-
query=query,
1182-
subset=subset,
1183-
service_provider=self.service_provider,
1184-
)
1185-
return use_case.execute()

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def create_multiple(self, project: entities.ProjectEntity, name: List[str]):
3030
def add_items(
3131
self,
3232
project: entities.ProjectEntity,
33-
subset: entities.SubSetEntity,
33+
lis: entities.SubSetEntity,
3434
item_ids: List[int],
3535
):
3636
data = {"action": "ATTACH", "item_ids": item_ids}

tests/integration/base.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ def tearDown(self) -> None:
2929
try:
3030
sa.delete_project(project)
3131
except Exception:
32+
raise
3233
pass
3334
except Exception as e:
3435
raise e

tests/integration/items/test_saqul_query.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def test_query(self):
5252
except Exception as e:
5353
self.assertEqual(
5454
str(e),
55-
"Subset not found. Use the superannotate.get_subsets() function to get a list of the available subsets.",
55+
"Subset not found.", # todo removed "Use the superannotate.get_subsets() function to get a list of the available subsets.",
5656
)
5757

5858
def test_query_on_100(self):

tests/integration/subsets/test_subsets.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,12 @@ def test_add_items_to_subset(self):
1515
{"name": f"earth_mov_00{i}.jpg", "url": f"url_{i}"} for i in range(1, 6)
1616
]
1717
sa.attach_items(self.PROJECT_NAME, item_names) # noqa
18-
subset_data = []
19-
for i in item_names:
20-
subset_data.append({"name": i["name"], "path": self.PROJECT_NAME})
21-
result = sa.add_items_to_subset(
22-
self.PROJECT_NAME, self.SUBSET_NAME, subset_data
23-
)
24-
assert len(subset_data) == len(result["succeeded"])
18+
items = sa.search_items(self.PROJECT_NAME)
19+
# subset_data = []
20+
# for i in item_names:
21+
# subset_data.append({"name": i["name"], "path": self.PROJECT_NAME})
22+
result = sa.add_items_to_subset(self.PROJECT_NAME, self.SUBSET_NAME, items)
23+
assert len(result["succeeded"]) == 5
2524

2625
def test_add_to_subset_with_duplicates_items(self):
2726
with self.assertLogs("sa", level="INFO") as cm:

0 commit comments

Comments
 (0)