Statement Scheduler Implementation

Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
This commit is contained in:
Anand Krishnamoorthi
2023-03-08 08:58:21 -08:00
committed by Anand Krishnamoorthi
parent 6738eeed3c
commit 7789de41b6
11 changed files with 1044 additions and 27 deletions
@@ -349,6 +349,7 @@ cases:
- |
package t
import future.keywords
x = true
default a = [5 | not x]
query: data.t.a
want_result: []
+11 -8
View File
@@ -26,10 +26,10 @@ cases:
every key, x in [1, 2, 3] {
x == key + 1
}
y = x + key
}
# Set
x2 = y {
# Only value
@@ -48,7 +48,7 @@ cases:
every key, x in {1, 2, 3} {
x == key
}
y = x + key
}
@@ -71,7 +71,7 @@ cases:
every key, x in {1:2, 3:4} {
x == key + 1
}
y = x + key
}
@@ -91,9 +91,11 @@ cases:
}
every _ in `abc` {
undefined_var
}
}
y = 100
}
undefined_var { false }
query: data.test
want_result:
x1: 100
@@ -114,10 +116,13 @@ cases:
false
}
}
p { false }
x2 = y {
y = 100
every _ in [1] {
# TODO: if p is an undefined var, raise error.
p
}
}
@@ -126,5 +131,3 @@ cases:
#TODO:
# every vars must be used
@@ -0,0 +1,23 @@
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
cases:
- note: basic
data: {}
modules:
- |
package test
import future.keywords
r1 = value {
value = p + a[0] # p and a are defined later
q = p # q depends on p; p depends on q
q = t[0] # t is defined at end
a = [ t[i] | # a uses a compr which depends on t
i := 1
]
t = [8, 4]
}
query: data.test
want_result:
r1: 12
+16 -4
View File
@@ -198,9 +198,12 @@ pub fn eval_file(
modules_ref.push(m);
}
let analyzer = Analyzer::new();
let schedule = analyzer.analyze(&modules)?;
// First eval the modules.
let mut interpreter = interpreter::Interpreter::new(modules_ref)?;
interpreter.eval(&data, &input, enable_tracing)?;
interpreter.eval(&data, &input, enable_tracing, Some(&schedule))?;
// Now eval the query.
let source = Source {
@@ -242,9 +245,18 @@ fn one_file() -> Result<()> {
lines: contents.split('\n').collect(),
};
let mut parser = Parser::new(&source)?;
let tree = parser.parse()?;
let mut interpreter = interpreter::Interpreter::new(vec![&tree])?;
let results = interpreter.eval(&None, &input, true)?;
let modules = vec![parser.parse()?];
let analyzer = Analyzer::new();
let schedule = analyzer.analyze(&modules)?;
let mut modules_ref = vec![];
for m in &modules {
modules_ref.push(m);
}
let mut interpreter = interpreter::Interpreter::new(modules_ref)?;
let results = interpreter.eval(&None, &input, true, Some(&schedule))?;
println!("eval results:\n{}", serde_json::to_string_pretty(&results)?);
Ok(())
}