Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make full name updates on tree changes more efficient #3175

Merged
merged 9 commits into from Oct 3, 2023
Expand Up @@ -214,7 +214,7 @@ function TreeItem({
>
<Button.LikeLink
aria-controls={id('li')}
className="font-bold inline text-left"
className="inline text-left font-bold"
id={id('label')}
onClick={(): void =>
handleFold(
Expand All @@ -226,7 +226,9 @@ function TreeItem({
>
<StringToJsx
components={{
wrap: (count) => <span className="text-neutral-500 pl-2">{count}</span>,
wrap: (count) => (
<span className="pl-2 text-neutral-500">{count}</span>
),
}}
string={commonText.jsxCountLine({
resource: label,
Expand Down
18 changes: 10 additions & 8 deletions specifyweb/specify/tree_extras.py
Expand Up @@ -103,13 +103,13 @@ def save():
}})

if prev_self is None:
reset_fullnames(self.definition, null_only=True)
set_fullnames(self.definition, null_only=True, node_number_range=[self.nodenumber, self.highestchildnodenumber])
elif (
prev_self.name != self.name
or prev_self.definitionitem_id != self.definitionitem_id
or prev_self.parent_id != self.parent_id
):
reset_fullnames(self.definition)
set_fullnames(self.definition, node_number_range=[self.nodenumber, self.highestchildnodenumber])

def accepted_id_attr(self):
return 'accepted{}_id'.format(self._meta.db_table)
Expand Down Expand Up @@ -277,7 +277,8 @@ def merge(node, into, agent):
else:
child.parent = target
child.save()

new_target = model.objects.get(id=into.id)
set_fullnames(new_target.definition, node_number_range=[new_target.nodenumber, new_target.highestchildnodenumber])
realVinayak marked this conversation as resolved.
Show resolved Hide resolved
for retry in range(100):
try:
id = node.id
Expand Down Expand Up @@ -470,13 +471,11 @@ def definition_joins(table, depth):
for j in range(depth)
])

def reset_fullnames(treedef, null_only=False):
def set_fullnames(treedef, null_only=False, node_number_range=None):
table = treedef.treeentries.model._meta.db_table
depth = treedef.treedefitems.count()
reverse = treedef.fullnamedirection == -1
return set_fullnames(table, treedef.id, depth, reverse, null_only)

def set_fullnames(table, treedefid, depth, reverse=False, null_only=False):
treedefid = treedef.id
logger.info('set_fullnames: %s', (table, treedefid, depth, reverse))
if depth < 1:
return
Expand All @@ -490,6 +489,7 @@ def set_fullnames(table, treedefid, depth, reverse=False, null_only=False):
"and t0.{table}treedefid = {treedefid}\n"
"and t0.acceptedid is null\n"
"{null_only}\n"
"{node_number_range}\n"
).format(
root=depth-1,
table=table,
Expand All @@ -498,8 +498,10 @@ def set_fullnames(table, treedefid, depth, reverse=False, null_only=False):
parent_joins=parent_joins(table, depth),
definition_joins=definition_joins(table, depth),
null_only="and t0.fullname is null" if null_only else "",
node_number_range="and t0.nodenumber between {} and {}".format(node_number_range[0], node_number_range[1]) if not (node_number_range is None) else ''
)
logger.debug('fullname update sql:\n%s', sql)

logger.warning('fullname update sql:\n%s', sql)
realVinayak marked this conversation as resolved.
Show resolved Hide resolved
return cursor.execute(sql)

def predict_fullname(table, depth, parentid, defitemid, name, reverse=False):
Expand Down
4 changes: 2 additions & 2 deletions specifyweb/workbench/upload/upload.py
Expand Up @@ -13,7 +13,7 @@
from specifyweb.specify import models
from specifyweb.specify.auditlog import auditlog
from specifyweb.specify.datamodel import Table
from specifyweb.specify.tree_extras import renumber_tree, reset_fullnames
from specifyweb.specify.tree_extras import renumber_tree, set_fullnames
from . import disambiguation
from .upload_plan_schema import schema, parse_plan_with_basetable
from .upload_result import Uploaded, UploadResult, ParseFailures, \
Expand Down Expand Up @@ -266,7 +266,7 @@ def fixup_trees(upload_plan: ScopedUploadable, results: List[UploadResult]) -> N
for treedef in treedefs:
if treedef.specify_model.name.lower().startswith(tree):
tic = time.perf_counter()
reset_fullnames(treedef, null_only=True)
set_fullnames(treedef, null_only=True)
toc = time.perf_counter()
logger.info(f"finished reset fullnames of {tree} tree in {toc-tic}s")

Expand Down