|
1 | 1 | import copy |
2 | 2 | from typing import List |
| 3 | +from typing import Optional |
3 | 4 |
|
4 | 5 | import superannotate.lib.core as constants |
5 | 6 | from lib.core.conditions import Condition |
|
9 | 10 | from lib.core.entities import Entity |
10 | 11 | from lib.core.entities import FolderEntity |
11 | 12 | from lib.core.entities import ProjectEntity |
| 13 | +from lib.core.entities import SubSetEntity |
12 | 14 | from lib.core.entities import TmpImageEntity |
13 | 15 | from lib.core.entities import VideoEntity |
14 | 16 | from lib.core.exceptions import AppException |
@@ -112,41 +114,78 @@ def execute(self) -> Response: |
112 | 114 | return self._response |
113 | 115 |
|
114 | 116 |
|
115 | | -class QueryEntities(BaseReportableUseCase): |
| 117 | +class QueryEntitiesUseCase(BaseReportableUseCase): |
116 | 118 | def __init__( |
117 | 119 | self, |
118 | 120 | reporter: Reporter, |
119 | 121 | project: ProjectEntity, |
120 | 122 | folder: FolderEntity, |
121 | 123 | backend_service_provider: SuperannotateServiceProvider, |
122 | 124 | query: str, |
| 125 | + subset: str, |
123 | 126 | ): |
124 | 127 | super().__init__(reporter) |
125 | 128 | self._project = project |
126 | 129 | self._folder = folder |
127 | 130 | self._backend_client = backend_service_provider |
128 | 131 | self._query = query |
| 132 | + self._subset = subset |
129 | 133 |
|
130 | 134 | def validate_query(self): |
131 | | - response = self._backend_client.validate_saqul_query( |
132 | | - self._project.team_id, self._project.id, self._query |
133 | | - ) |
134 | | - if response.get("error"): |
135 | | - raise AppException(response["error"]) |
136 | | - if response["isValidQuery"]: |
137 | | - self._query = response["parsedQuery"] |
138 | | - else: |
139 | | - raise AppException("Incorrect query.") |
140 | | - if self._project.sync_status != constants.ProjectState.SYNCED.value: |
| 135 | + if self._project.sync_status != constances.ProjectState.SYNCED.value: |
141 | 136 | raise AppException("Data is not synced.") |
| 137 | + if self._query: |
| 138 | + response = self._backend_client.validate_saqul_query( |
| 139 | + self._project.team_id, self._project.id, self._query |
| 140 | + ) |
| 141 | + if response.get("error"): |
| 142 | + raise AppException(response["error"]) |
| 143 | + if response["isValidQuery"]: |
| 144 | + self._query = response["parsedQuery"] |
| 145 | + else: |
| 146 | + raise AppException("Incorrect query.") |
| 147 | + else: |
| 148 | + response = self._backend_client.validate_saqul_query( |
| 149 | + self._project.team_id, self._project.id, "-" |
| 150 | + ) |
| 151 | + if response.get("error"): |
| 152 | + raise AppException(response["error"]) |
142 | 153 |
|
143 | 154 | def execute(self) -> Response: |
| 155 | + if not any([self._query, self._subset]): |
| 156 | + self._response.errors = AppException( |
| 157 | + "AppException: The query and subset params cannot have the value None at the same time." |
| 158 | + ) |
| 159 | + return self._response |
| 160 | + |
144 | 161 | if self.is_valid(): |
| 162 | + query_kwargs = {} |
| 163 | + if self._subset: |
| 164 | + subset: Optional[SubSetEntity] = None |
| 165 | + response = self._backend_client.list_sub_sets( |
| 166 | + team_id=self._project.team_id, project_id=self._project.id |
| 167 | + ) |
| 168 | + if response.ok: |
| 169 | + subset = next( |
| 170 | + (_sub for _sub in response.data if _sub.name == self._subset), |
| 171 | + None, |
| 172 | + ) |
| 173 | + if not subset: |
| 174 | + self._response.errors = AppException( |
| 175 | + "Subset not found. Use the superannotate." |
| 176 | + "get_subsets() function to get a list of the available subsets." |
| 177 | + ) |
| 178 | + return self._response |
| 179 | + query_kwargs["subset_id"] = subset.id |
| 180 | + if self._query: |
| 181 | + query_kwargs["query"] = self._query |
| 182 | + query_kwargs["folder_id"] = ( |
| 183 | + None if self._folder.name == "root" else self._folder.uuid |
| 184 | + ) |
145 | 185 | service_response = self._backend_client.saqul_query( |
146 | 186 | self._project.team_id, |
147 | 187 | self._project.id, |
148 | | - self._query, |
149 | | - folder_id=None if self._folder.name == "root" else self._folder.uuid, |
| 188 | + **query_kwargs, |
150 | 189 | ) |
151 | 190 | if service_response.ok: |
152 | 191 | data = [] |
|
0 commit comments