Skip to content

Commit f002541

Browse files
Merge pull request #586 from hinashi/feature/exclude_entity_param
Added exclude entity parameter
2 parents 856cdd0 + ced45c3 commit f002541

File tree

7 files changed

+65
-15
lines changed

7 files changed

+65
-15
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
## In development
44

55
### Added
6+
* Added exclude entity parameter in search_entries_for_simple.
7+
Contributed by @hinashi
8+
* Added exclude entity parameter in get_referred_objects.
9+
Contributed by @hinashi
610

711
### Changed
812
* Changed to allow parallel execution some job.

airone/lib/elasticsearch.py

+14-1
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,9 @@ def make_query(
223223
return query
224224

225225

226-
def make_query_for_simple(hint_string: str, hint_entity_name: str, offset: int) -> Dict[str, str]:
226+
def make_query_for_simple(
227+
hint_string: str, hint_entity_name: str, exclude_entity_names: List[str], offset: int
228+
) -> Dict[str, str]:
227229
"""Create a search query for Elasticsearch.
228230
229231
Do the following:
@@ -261,6 +263,17 @@ def make_query_for_simple(hint_string: str, hint_entity_name: str, offset: int)
261263
}
262264
)
263265

266+
if exclude_entity_names:
267+
query["query"]["bool"]["must_not"] = [
268+
{
269+
"nested": {
270+
"path": "entity",
271+
"query": {"term": {"entity.name": exclude_entity_name}},
272+
}
273+
}
274+
for exclude_entity_name in exclude_entity_names
275+
]
276+
264277
return query
265278

266279

airone/tests/test_elasticsearch.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ def test_make_query(self):
201201
)
202202

203203
def test_make_query_for_simple(self):
204-
query = elasticsearch.make_query_for_simple("hoge|fuga&1", None, 0)
204+
query = elasticsearch.make_query_for_simple("hoge|fuga&1", None, [], 0)
205205
self.assertEqual(
206206
query,
207207
{
@@ -296,14 +296,21 @@ def test_make_query_for_simple(self):
296296
)
297297

298298
# set hint_entity_name
299-
query = elasticsearch.make_query_for_simple("hoge", "fuga", 0)
299+
query = elasticsearch.make_query_for_simple("hoge", "fuga", [], 0)
300300
self.assertEqual(
301301
query["query"]["bool"]["must"][1],
302302
{"nested": {"path": "entity", "query": {"term": {"entity.name": "fuga"}}}},
303303
)
304304

305+
# set exclude_entity_names
306+
query = elasticsearch.make_query_for_simple("hoge", None, ["fuga"], 0)
307+
self.assertEqual(
308+
query["query"]["bool"]["must_not"][0],
309+
{"nested": {"path": "entity", "query": {"term": {"entity.name": "fuga"}}}},
310+
)
311+
305312
# set offset
306-
query = elasticsearch.make_query_for_simple("hoge", "fuga", 100)
313+
query = elasticsearch.make_query_for_simple("hoge", "fuga", [], 100)
307314
self.assertEqual(query["from"], 100)
308315

309316
def test_make_search_results(self):

api_v1/entry/views.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ def get(self, request):
103103
if param_entity:
104104
query &= Q(schema__name=param_entity)
105105

106+
filter_entities = [param_target_entity] if param_target_entity else []
107+
106108
ret_data = []
107109
for entry in Entry.objects.filter(query):
108110
ret_data.append(
@@ -117,7 +119,7 @@ def get(self, request):
117119
if param_quiet
118120
else {"id": x.schema.id, "name": x.schema.name},
119121
}
120-
for x in entry.get_referred_objects(entity_name=param_target_entity)
122+
for x in entry.get_referred_objects(filter_entities=filter_entities)
121123
],
122124
}
123125
)

dashboard/views.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ def _do_import(resource, iter_data):
9393
def _search_by_keyword(query, entity_name, per_page, page_num):
9494
# correct entries that contans query at EntryName or AttributeValue
9595
search_result = Entry.search_entries_for_simple(
96-
query, entity_name, per_page, (page_num - 1) * per_page
96+
query, entity_name, [], per_page, (page_num - 1) * per_page
9797
)
9898

9999
return (search_result["ret_count"], search_result["ret_values"])

entry/models.py

+12-6
Original file line numberDiff line numberDiff line change
@@ -1184,7 +1184,7 @@ def add_attribute_from_base(self, base, request_user):
11841184

11851185
return attr
11861186

1187-
def get_referred_objects(self, entity_name=None):
1187+
def get_referred_objects(self, filter_entities=[], exclude_entities=[]):
11881188
"""
11891189
This returns objects that refer current Entry in the AttributeValue
11901190
"""
@@ -1194,10 +1194,10 @@ def get_referred_objects(self, entity_name=None):
11941194

11951195
# if entity_name param exists, add schema name to reduce filter execution time
11961196
query = Q(pk__in=ids, is_active=True)
1197-
if entity_name:
1198-
query &= Q(schema__name=entity_name)
1197+
if filter_entities:
1198+
query &= Q(schema__name__in=filter_entities)
11991199

1200-
return Entry.objects.filter(query)
1200+
return Entry.objects.filter(query).exclude(schema__name__in=exclude_entities)
12011201

12021202
def may_append_attr(self, attr):
12031203
"""
@@ -1811,6 +1811,7 @@ def search_entries_for_simple(
18111811
kls,
18121812
hint_attr_value,
18131813
hint_entity_name=None,
1814+
exclude_entity_names=[],
18141815
limit=CONFIG.MAX_LIST_ENTRIES,
18151816
offset=0,
18161817
):
@@ -1823,9 +1824,12 @@ def search_entries_for_simple(
18231824
3. Process the search results, and return. (make_search_results_for_attrv)
18241825
18251826
Args:
1826-
hint_attr_value (str): Search string for AttributeValue
1827+
hint_attr_value (str): Required.
1828+
Search string for AttributeValue
18271829
hint_entity_name (str): Defaults to None.
18281830
Search string for Entity Name
1831+
exclude_entity_names (list[str]): Defaults to [].
1832+
Entity name string list to exclude from search
18291833
limit (int): Defaults to 100.
18301834
Maximum number of search results to return
18311835
offset (int): Defaults to 0.
@@ -1851,7 +1855,9 @@ def search_entries_for_simple(
18511855
"ret_values": [],
18521856
}
18531857

1854-
query = make_query_for_simple(hint_attr_value, hint_entity_name, offset)
1858+
query = make_query_for_simple(
1859+
hint_attr_value, hint_entity_name, exclude_entity_names, offset
1860+
)
18551861

18561862
resp = execute_query(query, limit)
18571863

entry/tests/test_model.py

+21-3
Original file line numberDiff line numberDiff line change
@@ -636,7 +636,7 @@ def test_get_referred_objects(self):
636636
self.assertEqual(list(referred_entries), [self._entry])
637637

638638
def test_get_referred_objects_with_entity_param(self):
639-
for i in range(3, 5):
639+
for i in range(3, 6):
640640
entity = Entity.objects.create(name="Entity" + str(i), created_user=self._user)
641641
entry = Entry.objects.create(
642642
name="entry" + str(i), created_user=self._user, schema=entity
@@ -661,12 +661,16 @@ def test_get_referred_objects_with_entity_param(self):
661661
# This function checks that this get_referred_objects method only get
662662
# unique reference objects except for the self referred object.
663663
referred_entries = self._entry.get_referred_objects()
664-
self.assertEqual(referred_entries.count(), 2)
664+
self.assertEqual(referred_entries.count(), 3)
665665

666-
referred_entries = self._entry.get_referred_objects(entity_name="Entity3")
666+
referred_entries = self._entry.get_referred_objects(filter_entities=["Entity3"])
667667
self.assertEqual(referred_entries.count(), 1)
668668
self.assertEqual(referred_entries.first().name, "entry3")
669669

670+
referred_entries = self._entry.get_referred_objects(exclude_entities=["Entity3"])
671+
self.assertEqual(referred_entries.count(), 2)
672+
self.assertEqual([x.name for x in referred_entries], ["entry4", "entry5"])
673+
670674
def test_coordinating_attribute_with_dynamically_added_one(self):
671675
newattr = EntityAttr.objects.create(
672676
name="newattr",
@@ -3889,6 +3893,20 @@ def test_search_entries_for_simple_with_hint_entity_name(self):
38893893
self.assertEqual(ret["ret_count"], 1)
38903894
self.assertEqual([x["name"] for x in ret["ret_values"]], ["entry"])
38913895

3896+
def test_search_entries_for_simple_with_exclude_entity_names(self):
3897+
self._entry.register_es()
3898+
entity = Entity.objects.create(name="entity2", created_user=self._user)
3899+
entry = Entry.objects.create(name="entry2", schema=entity, created_user=self._user)
3900+
entry.register_es()
3901+
3902+
ret = Entry.search_entries_for_simple("entry")
3903+
self.assertEqual(ret["ret_count"], 2)
3904+
self.assertEqual([x["name"] for x in ret["ret_values"]], ["entry", "entry2"])
3905+
3906+
ret = Entry.search_entries_for_simple("entry", exclude_entity_names=["entity"])
3907+
self.assertEqual(ret["ret_count"], 1)
3908+
self.assertEqual([x["name"] for x in ret["ret_values"]], ["entry2"])
3909+
38923910
def test_search_entries_for_simple_with_limit_offset(self):
38933911
for i in range(0, 10):
38943912
entry = Entry.objects.create(

0 commit comments

Comments
 (0)