Skip to content

Commit d8fafcc

Browse files
committed
fix: entry removal fix
1 parent f0b4c43 commit d8fafcc

File tree

5 files changed

+65
-9
lines changed

5 files changed

+65
-9
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ config_quality: ## Run quality checks on configuration files
182182

183183
tests: backend_tests ## Run all tests
184184

185-
backend_tests: ## Run python tests, you might provide additional arguments witr args="…"
185+
backend_tests: ## Run python tests, you might provide additional arguments with args="…"
186186
@echo "🍜 Running python tests"
187187
${DOCKER_COMPOSE_TEST} up -d neo4j
188188
${DOCKER_COMPOSE_TEST} run --rm taxonomy_api pytest /parser ${args}

backend/editor/entries.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -418,26 +418,36 @@ async def delete_node(self, label: NodeType, entry):
418418
// Find node to be deleted using node ID
419419
MATCH (deleted_node:{self.project_name}:{label.value})-[:is_before]->(next_node)
420420
WHERE deleted_node.id = $id
421-
MATCH (previous_node)-[:is_before]->(deleted_node)
421+
MATCH (previous_node)-[r:is_before]->(deleted_node)
422422
// Remove node
423-
DETACH (deleted_node)
423+
DELETE r
424424
// Rebuild relationships after deletion
425425
CREATE (previous_node)-[:is_before]->(next_node)
426426
"""
427427
await get_current_transaction().run(query, {"id": entry})
428428
# transfert child parent relations, and mark child nodes as modified
429429
query = f"""
430430
// Find relations to be removed using node ID
431-
MATCH (child_node)-[:is_child_of]->(deleted_node:{self.project_name}:{label.value})
431+
MATCH (child_node)-[r:is_child_of]->(deleted_node:{self.project_name}:{label.value})
432432
WHERE deleted_node.id = $id
433433
MATCH (deleted_node)-[:is_child_of]->(parent_node)
434-
DETACH (deleted_node)
434+
DELETE r
435435
// transfer child
436436
CREATE (child_node) -[:is_child_of]->(parent_node)
437437
// mark modified
438438
SET child_node.modified = $modified
439439
"""
440440
await get_current_transaction().run(query, {"id": entry, "modified": modified})
441+
# or if no transfer is needed, just mark modified
442+
query = f"""
443+
// Find relations to be removed using node ID
444+
MATCH (child_node)-[r:is_child_of]->(deleted_node:{self.project_name}:{label.value})
445+
WHERE deleted_node.id = $id
446+
DELETE r
447+
// mark children as modified
448+
SET child_node.modified = $modified
449+
"""
450+
await get_current_transaction().run(query, {"id": entry, "modified": modified})
441451
# change label of node to be deleted
442452
query = f"""
443453
MATCH (deleted_node:{self.project_name}:{label.value})
@@ -447,7 +457,7 @@ async def delete_node(self, label: NodeType, entry):
447457
// and mark modification date also
448458
SET deleted_node.modified = $modified
449459
"""
450-
result = await get_current_transaction().run(query, {"id": entry})
460+
result = await get_current_transaction().run(query, {"id": entry, "modified": modified})
451461
return await async_list(result)
452462

453463
async def get_all_nodes(self, label: Optional[NodeType] = None, removed: bool = False):

backend/tests/data/test.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,9 @@ en: roast-beef
7373

7474
<en: meat
7575
en: fake-meat
76-
vegan:en: yes
7776
# undef will stop parents from transmitting a value
7877
carbon_footprint_fr_foodges_value:fr: undef
78+
vegan:en: yes
7979

8080
en: fake-stuff
8181

backend/tests/test_export.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,3 +322,41 @@ async def test_change_entry_id(taxonomy_test):
322322
assert result == expected
323323
# clean files
324324
await background_tasks.run()
325+
326+
327+
@pytest.mark.anyio
328+
async def test_remove_entry(taxonomy_test):
329+
async with graph_db.TransactionCtx():
330+
# remove "yaourts allégés"
331+
await taxonomy_test.delete_node(NodeType.ENTRY, "fr:yaourts-alleges")
332+
# remove meat
333+
await taxonomy_test.delete_node(NodeType.ENTRY, "en:meat")
334+
background_tasks = FakeBackgroundTask()
335+
file_path = taxonomy_test.dump_taxonomy(background_tasks)
336+
result = list(open(file_path))
337+
# expected output
338+
expected = list(open("tests/data/test.txt"))
339+
# entry removed
340+
to_remove = [
341+
32,
342+
33,
343+
34, # yahourts alleges
344+
62,
345+
63,
346+
64,
347+
65, # meat
348+
66,
349+
73, # < en:meat
350+
]
351+
# parent changed to "en:yogurts" for "yahourts alleges"
352+
expected[45] = expected[51] = "< en:yogurts\n"
353+
# parent normalized
354+
expected[44] = "< en:Passion fruit yogurts\n"
355+
expected[50] = "< en:lemon yogurts\n"
356+
# properties reordered
357+
# expected.insert(39, expected.pop(41))
358+
for i in sorted(to_remove, reverse=True):
359+
del expected[i]
360+
assert result == expected
361+
# clean files
362+
await background_tasks.run()

parser/openfoodfacts_taxonomy_parser/patcher.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,21 @@ def is_removed(self, node):
2020
def get_all_nodes(self, project_label):
2121
"""Get modified and removed nodes, in the start line order"""
2222
query = f"""
23-
MATCH (n:({project_label}|REMOVED_{project_label}))
23+
MATCH (n:{project_label})
2424
WHERE
2525
// no external node
2626
(n.is_external = false OR n.is_external IS NULL)
2727
AND (
2828
// modified nodes
29-
((n:TEXT OR n:SYNONYMS OR n:STOPWORDS OR n:ENTRY) AND n.modified IS NOT NULL)
29+
(
30+
(
31+
n:TEXT OR n:SYNONYMS OR n:STOPWORDS OR n:ENTRY OR
32+
n:REMOVED_TEXT OR n:REMOVED_SYNONYMS OR
33+
n:REMOVED_STOPWORDS OR n:REMOVED_ENTRY
34+
)
35+
AND
36+
n.modified IS NOT NULL
37+
)
3038
)
3139
// optional match for node might not have parents
3240
OPTIONAL

0 commit comments

Comments
 (0)