[BACKEND] Optimize script resolution (#1400)
Speeds up scripting in the backend.
This commit is contained in:
parent
0f96d8e24e
commit
344753cc63
1 changed files with 16 additions and 15 deletions
|
|
@ -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:
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue