pub struct QueryResults {
pub result: Vec<QueryResult>,
}
Expand description
Results of evaluating a Rego query.
Generates the same json
representation as opa eval
.
Queries typically produce a single result.
// Create engine and evaluate "1 + 1".
let results = Engine::new().eval_query("1 + 1".to_string(), false)?;
assert_eq!(results.result.len(), 1);
assert_eq!(results.result[0].expressions[0].value, Value::from(2u64));
assert_eq!(results.result[0].expressions[0].text.as_ref(), "1 + 1");
If a query contains only one expression, and even if the expression evaluates to false, the value will be returned.
// Create engine and evaluate "1 > 2" which is false.
let results = Engine::new().eval_query("1 > 2".to_string(), false)?;
assert_eq!(results.result.len(), 1);
assert_eq!(results.result[0].expressions[0].value, Value::from(false));
assert_eq!(results.result[0].expressions[0].text.as_ref(), "1 > 2");
In a query containing multiple expressions, if any expression evaluates to false, then no results are produced.
// Create engine and evaluate "true; true; false".
let results = Engine::new().eval_query("true; true; false".to_string(), false)?;
assert!(results.result.is_empty());
Note that =
is different from ==
. The former evaluates to undefined if the LHS and RHS
are not equal. The latter evaluates to either true or false.
// Create engine and evaluate "1 = 2" which is undefined and produces no resutl.
let results = Engine::new().eval_query("1 = 2".to_string(), false)?;
assert_eq!(results.result.len(), 0);
// Create engine and evaluate "1 == 2" which evaluates to false.
let results = Engine::new().eval_query("1 == 2".to_string(), false)?;
assert_eq!(results.result.len(), 1);
assert_eq!(results.result[0].expressions[0].value, Value::from(false));
assert_eq!(results.result[0].expressions[0].text.as_ref(), "1 == 2");
Queries containing loops produce multiple results.
let results = Engine::new().eval_query("x = [1, 2, 3][_]".to_string(), false)?;
// Three results are produced, one of each value of x.
assert_eq!(results.result.len(), 3);
// Assert expressions and bindings of results.
assert_eq!(results.result[0].expressions[0].value, Value::Bool(true));
assert_eq!(results.result[0].expressions[0].text.as_ref(), "x = [1, 2, 3][_]");
assert_eq!(results.result[0].bindings[&Value::from("x")], Value::from(1u64));
assert_eq!(results.result[1].expressions[0].value, Value::Bool(true));
assert_eq!(results.result[1].expressions[0].text.as_ref(), "x = [1, 2, 3][_]");
assert_eq!(results.result[1].bindings[&Value::from("x")], Value::from(2u64));
assert_eq!(results.result[2].expressions[0].value, Value::Bool(true));
assert_eq!(results.result[2].expressions[0].text.as_ref(), "x = [1, 2, 3][_]");
assert_eq!(results.result[2].bindings[&Value::from("x")], Value::from(3u64));
Loop iterations that evaluate to false or undefined don’t produce results.
let results = Engine::new().eval_query("x = [1, 2, 3][_]; x >= 2".to_string(), false)?;
// Two results are produced, one for x = 2 and another for x = 3.
assert_eq!(results.result.len(), 2);
// Assert expressions and bindings of results.
assert_eq!(results.result[0].expressions[0].value, Value::Bool(true));
assert_eq!(results.result[0].expressions[0].text.as_ref(), "x = [1, 2, 3][_]");
assert_eq!(results.result[0].expressions[0].value, Value::Bool(true));
assert_eq!(results.result[0].expressions[1].text.as_ref(), "x >= 2");
assert_eq!(results.result[0].bindings[&Value::from("x")], Value::from(2u64));
assert_eq!(results.result[1].expressions[0].value, Value::Bool(true));
assert_eq!(results.result[1].expressions[0].text.as_ref(), "x = [1, 2, 3][_]");
assert_eq!(results.result[1].expressions[0].value, Value::Bool(true));
assert_eq!(results.result[1].expressions[1].text.as_ref(), "x >= 2");
assert_eq!(results.result[1].bindings[&Value::from("x")], Value::from(3u64));
See QueryResult for examples of different kinds of results.
Fields§
§result: Vec<QueryResult>
Collection of results of evaluting a query.
Trait Implementations§
Source§impl Clone for QueryResults
impl Clone for QueryResults
Source§fn clone(&self) -> QueryResults
fn clone(&self) -> QueryResults
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source
. Read moreSource§impl Debug for QueryResults
impl Debug for QueryResults
Source§impl Default for QueryResults
impl Default for QueryResults
Source§fn default() -> QueryResults
fn default() -> QueryResults
Returns the “default value” for a type. Read more
Source§impl PartialEq for QueryResults
impl PartialEq for QueryResults
Source§impl Serialize for QueryResults
impl Serialize for QueryResults
impl Eq for QueryResults
impl StructuralPartialEq for QueryResults
Auto Trait Implementations§
impl Freeze for QueryResults
impl RefUnwindSafe for QueryResults
impl Send for QueryResults
impl Sync for QueryResults
impl Unpin for QueryResults
impl UnwindSafe for QueryResults
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more