Skip to content

Commit 85753aa

Browse files
authored
feat: Implement efficient node lookup table using node indices (microsoft#463)
Major Changes: - Add generic Lookup<T> structure for efficient O(1) module-level data access - Combine separate scope and order lookups into unified QuerySchedule structure - Add query_schedule field to Interpreter for dedicated user query scheduling - Refactor loop hoising to separate module - Use efficient lookup for loop vars - Also added more tests for loops Key Concept: - Ensure module context and indexing stay synchronized during function calls Testing: - All scheduler and interpreter tests passing Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
1 parent c43c945 commit 85753aa

8 files changed

Lines changed: 599 additions & 322 deletions

File tree

src/engine.rs

Lines changed: 28 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -737,28 +737,13 @@ impl Engine {
737737
self.interpreter.clean_internal_evaluation_state();
738738

739739
self.interpreter.create_rule_prefixes()?;
740-
let query_module = {
741-
let source = Source::from_contents(
742-
"<query_module.rego>".to_owned(),
743-
"package __internal_query_module".to_owned(),
744-
)?;
745-
Ref::new(Parser::new(&source)?.parse()?)
746-
};
747-
748-
// Parse the query.
749-
let query_source = Source::from_contents("<query.rego>".to_string(), query)?;
750-
let mut parser = self.make_parser(&query_source)?;
751-
let query_node = parser.parse_user_query()?;
740+
let (query_module, query_node, query_schedule) = self.make_query(query)?;
752741
if query_node.span.text() == "data" {
753742
self.eval_modules(enable_tracing)?;
754743
}
755-
let query_schedule = Analyzer::new().analyze_query_snippet(&self.modules, &query_node)?;
756-
self.interpreter.eval_user_query(
757-
&query_module,
758-
&query_node,
759-
&query_schedule,
760-
enable_tracing,
761-
)
744+
745+
self.interpreter
746+
.eval_user_query(&query_module, &query_node, query_schedule, enable_tracing)
762747
}
763748

764749
/// Evaluate a Rego query that produces a boolean value.
@@ -843,36 +828,41 @@ impl Engine {
843828
!matches!(self.eval_bool_query(query, enable_tracing), Ok(false))
844829
}
845830

846-
#[doc(hidden)]
847-
/// Evaluate the given query and all the rules in the supplied policies.
848-
///
849-
/// This is mainly used for testing Regorus itself.
850-
pub fn eval_query_and_all_rules(
851-
&mut self,
852-
query: String,
853-
enable_tracing: bool,
854-
) -> Result<QueryResults> {
855-
self.eval_modules(enable_tracing)?;
856-
857-
let query_module = {
831+
fn make_query(&mut self, query: String) -> Result<(NodeRef<Module>, NodeRef<Query>, Schedule)> {
832+
let mut query_module = {
858833
let source = Source::from_contents(
859834
"<query_module.rego>".to_owned(),
860835
"package __internal_query_module".to_owned(),
861836
)?;
862-
Ref::new(Parser::new(&source)?.parse()?)
837+
Parser::new(&source)?.parse()?
863838
};
864839

865840
// Parse the query.
866841
let query_source = Source::from_contents("<query.rego>".to_string(), query)?;
867842
let mut parser = self.make_parser(&query_source)?;
868843
let query_node = parser.parse_user_query()?;
844+
query_module.num_expressions = parser.num_expressions();
845+
query_module.num_queries = parser.num_queries();
846+
query_module.num_statements = parser.num_statements();
869847
let query_schedule = Analyzer::new().analyze_query_snippet(&self.modules, &query_node)?;
870-
self.interpreter.eval_user_query(
871-
&query_module,
872-
&query_node,
873-
&query_schedule,
874-
enable_tracing,
875-
)
848+
849+
Ok((Ref::new(query_module), query_node, query_schedule))
850+
}
851+
852+
#[doc(hidden)]
853+
/// Evaluate the given query and all the rules in the supplied policies.
854+
///
855+
/// This is mainly used for testing Regorus itself.
856+
pub fn eval_query_and_all_rules(
857+
&mut self,
858+
query: String,
859+
enable_tracing: bool,
860+
) -> Result<QueryResults> {
861+
self.eval_modules(enable_tracing)?;
862+
863+
let (query_module, query_node, query_schedule) = self.make_query(query)?;
864+
self.interpreter
865+
.eval_user_query(&query_module, &query_node, query_schedule, enable_tracing)
876866
}
877867

878868
#[doc(hidden)]

0 commit comments

Comments
 (0)