[BACKEND] Optimize script resolution (#1400)

Speeds up scripting in the backend.
This commit is contained in:
Jesse Bannon 2025-12-29 17:38:34 -08:00 committed by GitHub
parent 0f96d8e24e
commit 344753cc63
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -307,10 +307,9 @@ class Script:
def _get_unresolved_output_filter( def _get_unresolved_output_filter(
self, self,
unresolved: Dict[Variable, SyntaxTree],
output_filter: Set[str], output_filter: Set[str],
unresolvable: Set[Variable], unresolvable: Set[Variable],
) -> Dict[Variable, SyntaxTree]: ) -> Set[str]:
""" """
When an output filter is applied, only a subset of variables that the filter When an output filter is applied, only a subset of variables that the filter
depends on need to be resolved. depends on need to be resolved.
@ -331,7 +330,7 @@ class Script:
unresolvable=unresolvable, unresolvable=unresolvable,
) )
return {var: syntax for var, syntax in unresolved.items() if var.name in subset_to_resolve} return subset_to_resolve
def _resolve( def _resolve(
self, self,
@ -367,18 +366,21 @@ class Script:
unresolvable: Set[Variable] = {Variable(name) for name in (unresolvable or {})} unresolvable: Set[Variable] = {Variable(name) for name in (unresolvable or {})}
unresolved_filter = set(resolved.keys()).union(unresolvable) unresolved_filter = set(resolved.keys()).union(unresolvable)
unresolved: Dict[Variable, SyntaxTree] = {
Variable(name): ast
for name, ast in self._variables.items()
if Variable(name) not in unresolved_filter
}
if output_filter: if output_filter:
unresolved = self._get_unresolved_output_filter( unresolved = {
unresolved=unresolved, Variable(name): self._variables[name]
output_filter=output_filter, for name in self._get_unresolved_output_filter(
unresolvable=unresolvable, output_filter=output_filter,
) unresolvable=unresolvable,
)
}
else:
unresolved = {
Variable(name): ast
for name, ast in self._variables.items()
if Variable(name) not in unresolved_filter
}
while unresolved: while unresolved:
unresolved_count: int = len(unresolved) unresolved_count: int = len(unresolved)
@ -556,8 +558,7 @@ class Script:
).output ).output
finally: finally:
for name in variable_definitions.keys(): for name in variable_definitions.keys():
if name in self._variables: self._variables.pop(name, None)
del self._variables[name]
def get(self, variable_name: str) -> Resolvable: def get(self, variable_name: str) -> Resolvable:
""" """