M: Improve restore ordering

This commit is contained in:
Ivan 2025-11-07 13:54:59 +03:00
parent 81e61a945c
commit 8144db6249
3 changed files with 49 additions and 16 deletions

View File

@ -22,14 +22,11 @@ class OrderManager:
self._fix_semantic_children() self._fix_semantic_children()
self._override_order() self._override_order()
def _fix_topological(self) -> None:
sorted_ids = self._semantic.graph.sort_stable([cst.pk for cst in self._items])
sorted_items = [next(cst for cst in self._items if cst.pk == id) for id in sorted_ids]
self._items = sorted_items
def _fix_kernel(self) -> None: def _fix_kernel(self) -> None:
result = [cst for cst in self._items if cst.cst_type == CstType.BASE] result = [cst for cst in self._items if cst.cst_type == CstType.BASE]
result = result + [cst for cst in self._items if cst.cst_type == CstType.CONSTANT] result = result + [cst for cst in self._items if cst.cst_type == CstType.CONSTANT]
result = result + \
[cst for cst in self._items if result.count(cst) == 0 and len(self._semantic.graph.inputs[cst.pk]) == 0]
kernel = [ kernel = [
cst.pk for cst in self._items if cst.pk for cst in self._items if
cst.cst_type in [CstType.STRUCTURED, CstType.AXIOM] or cst.cst_type in [CstType.STRUCTURED, CstType.AXIOM] or
@ -40,6 +37,11 @@ class OrderManager:
result = result + [cst for cst in self._items if result.count(cst) == 0] result = result + [cst for cst in self._items if result.count(cst) == 0]
self._items = result self._items = result
def _fix_topological(self) -> None:
sorted_ids = self._semantic.graph.sort_stable([cst.pk for cst in self._items])
sorted_items = [next(cst for cst in self._items if cst.pk == id) for id in sorted_ids]
self._items = sorted_items
def _fix_semantic_children(self) -> None: def _fix_semantic_children(self) -> None:
result: list[Constituenta] = [] result: list[Constituenta] = []
marked: set[Constituenta] = set() marked: set[Constituenta] = set()

View File

@ -1,4 +1,4 @@
''' Testing models: api_RSForm. ''' ''' Testing models: RSForm. '''
from django.forms import ValidationError from django.forms import ValidationError
from apps.rsform.models import Constituenta, CstType, RSForm from apps.rsform.models import Constituenta, CstType, RSForm

View File

@ -1,4 +1,4 @@
''' Testing models: api_RSForm. ''' ''' Testing models: RSFormCached. '''
from apps.rsform.models import Attribution, Constituenta, CstType, OrderManager, RSFormCached from apps.rsform.models import Attribution, Constituenta, CstType, OrderManager, RSFormCached
from apps.users.models import User from apps.users.models import User
from shared.DBTester import DBTester from shared.DBTester import DBTester
@ -106,6 +106,25 @@ class TestRSFormCached(DBTester):
self.assertEqual(s2.definition_raw, '@{X11|plur}') self.assertEqual(s2.definition_raw, '@{X11|plur}')
def test_insert_from(self):
self.schema.insert_last('X2')
self.schema.insert_last('D2')
self.schema.insert_last('X3')
self.schema.insert_last(
alias='D1',
definition_formal='X2 = X3'
)
test_ks = RSFormCached.create(title='Test')
test_ks.insert_from(self.schema.model.pk)
items = Constituenta.objects.filter(schema=test_ks.model).order_by('order')
self.assertEqual(len(items), 4)
self.assertEqual(items[0].alias, 'X2')
self.assertEqual(items[1].alias, 'D2')
self.assertEqual(items[2].alias, 'X3')
self.assertEqual(items[3].alias, 'D1')
self.assertEqual(items[3].definition_formal, 'X2 = X3')
def test_delete_cst(self): def test_delete_cst(self):
x1 = self.schema.insert_last('X1') x1 = self.schema.insert_last('X1')
x2 = self.schema.insert_last('X2') x2 = self.schema.insert_last('X2')
@ -210,6 +229,10 @@ class TestRSFormCached(DBTester):
alias='A1', alias='A1',
definition_formal=r'D3=∅', definition_formal=r'D3=∅',
) )
a2 = self.schema.insert_last(
alias='A2',
definition_formal=r'P1[S1]',
)
d3 = self.schema.insert_last( d3 = self.schema.insert_last(
alias='D3', alias='D3',
definition_formal=r'Pr2(S2)', definition_formal=r'Pr2(S2)',
@ -226,6 +249,10 @@ class TestRSFormCached(DBTester):
alias='F2', alias='F2',
definition_formal=r'[α∈ℬ(X1)] X1\α', definition_formal=r'[α∈ℬ(X1)] X1\α',
) )
p1 = self.schema.insert_last(
alias='P1',
definition_formal=r'[α∈ℬ(R1)] card(α)=0',
)
OrderManager(self.schema).restore_order() OrderManager(self.schema).restore_order()
x1.refresh_from_db() x1.refresh_from_db()
@ -240,19 +267,23 @@ class TestRSFormCached(DBTester):
f1.refresh_from_db() f1.refresh_from_db()
f2.refresh_from_db() f2.refresh_from_db()
a1.refresh_from_db() a1.refresh_from_db()
a2.refresh_from_db()
p1.refresh_from_db()
self.assertEqual(x1.order, 0) self.assertEqual(x1.order, 0)
self.assertEqual(x2.order, 1) self.assertEqual(x2.order, 1)
self.assertEqual(c1.order, 2) self.assertEqual(c1.order, 2)
self.assertEqual(s1.order, 3) self.assertEqual(p1.order, 3)
self.assertEqual(d1.order, 4) self.assertEqual(s1.order, 4)
self.assertEqual(s2.order, 5) self.assertEqual(a2.order, 5)
self.assertEqual(d3.order, 6) self.assertEqual(d1.order, 6)
self.assertEqual(a1.order, 7) self.assertEqual(s2.order, 7)
self.assertEqual(d4.order, 8) self.assertEqual(d3.order, 8)
self.assertEqual(d2.order, 9) self.assertEqual(a1.order, 9)
self.assertEqual(f1.order, 10) self.assertEqual(d4.order, 10)
self.assertEqual(f2.order, 11) self.assertEqual(d2.order, 11)
self.assertEqual(f1.order, 12)
self.assertEqual(f2.order, 13)
def test_reset_aliases(self): def test_reset_aliases(self):