Skip to content
Snippets Groups Projects
Commit 88abf106 authored by Himanshu Kapoor's avatar Himanshu Kapoor
Browse files

Merge branch 'feature/ast-to-glql' into 'main'

Feature: AST to GLQL query string serializer

See merge request !98
parents a138a2a3 d4f1f1cb
No related branches found
No related tags found
1 merge request!98Feature: AST to GLQL query string serializer
Pipeline #1641796843 passed
...@@ -3,6 +3,7 @@ pub mod codegen; ...@@ -3,6 +3,7 @@ pub mod codegen;
pub mod errors; pub mod errors;
pub mod helpers; pub mod helpers;
pub mod parser; pub mod parser;
pub mod serialize_ast;
pub mod transformer; pub mod transformer;
pub mod types; pub mod types;
pub mod utils; pub mod utils;
......
use crate::types::Operator;
use crate::types::Query;
use crate::types::Value;
fn get_op_str(opr: Operator) -> &'static str {
match opr {
Operator::Equal => "=",
Operator::GreaterThan => ">",
Operator::In => "in",
Operator::LessThan => "<",
Operator::NotEqual => "!=",
}
}
pub fn get_val_str(val: Value) -> String {
match val {
Value::Bool(a) => a.to_string(),
Value::Date(a) => a.to_string(),
Value::Function(a, b) => {
let mut func = String::new();
func += &a;
func += "(";
if !b.is_empty() {
func += b.join(", ").as_str();
}
func += ")";
func
}
Value::List(a) => {
let mut list_string = String::new();
if !a.is_empty() {
list_string += "(";
let mut params: Vec<String> = Vec::new();
for val in a.iter() {
params.push(get_val_str(val.clone()));
}
list_string += params.join(",").as_str();
list_string += ")";
}
list_string
}
Value::Null => "null".to_string(),
Value::Number(a) => a.to_string(),
Value::Quoted(a) => "\"".to_string() + &a + "\"",
Value::Reference(a, b) => a.symbol().to_string() + b.as_str(),
Value::RelativeDate(a, b) => a.to_string() + b.to_string().as_str(),
Value::Token(a) => a.to_string(),
}
}
pub fn serailize(query_tree: Query) -> Result<String, String> {
let exprs = query_tree.expressions;
let mut queries_vector: Vec<String> = Vec::new();
for exp in exprs {
let feild = exp.field;
let operator = get_op_str(exp.operator);
let val = get_val_str(exp.value);
let query = format!("{} {} {}", feild, operator, val);
queries_vector.push(query);
}
let final_query = queries_vector.join(" AND ");
Ok(final_query)
}
use glql::parser::parse_query;
use glql::serialize_ast;
#[test]
fn test_asttoquery() {
let query: String = String::from(
"project = \"gitlab-org/gitlab\" AND assignee in (currentUser(),\"foobar\",\"baz\") AND opened = true AND created < -7d",
);
let tree = parse_query(&query).unwrap();
let res_query = serialize_ast::serailize(tree.clone()).unwrap();
assert_eq!(res_query, query);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment