MCPcopy Create free account
hub / github.com/AmrDeveloper/GQL / parse_expression

Function parse_expression

crates/gitql-parser/src/parser.rs:1301–1360  ·  view source on GitHub ↗
(
    context: &mut ParserContext,
    env: &mut Environment,
    tokens: &[Token],
    position: &mut usize,
)

Source from the content-addressed store, hash-verified

1299}
1300
1301pub(crate) fn parse_expression(
1302 context: &mut ParserContext,
1303 env: &mut Environment,
1304 tokens: &[Token],
1305 position: &mut usize,
1306) -> Result<Box<dyn Expr>, Box<Diagnostic>> {
1307 let aggregation_count_before = context.aggregations.len();
1308 let window_count_before = context.window_functions.len();
1309 let expression = parse_assignment_expression(context, env, tokens, position)?;
1310
1311 if expression.kind() != ExprKind::Symbol {
1312 // This Expression contains aggregate function call or aggregate value
1313 if aggregation_count_before != context.aggregations.len() {
1314 let column_name = context.name_generator.generate_column_name();
1315 let expr_type = expression.expr_type();
1316 env.define(column_name.to_string(), expr_type.clone());
1317
1318 // Register the new aggregation generated field if the this expression is after group by
1319 if context.has_group_by_statement && !context.hidden_selections.contains(&column_name) {
1320 context.hidden_selections.push(column_name.to_string());
1321 }
1322
1323 context
1324 .aggregations
1325 .insert(column_name.clone(), AggregateValue::Expression(expression));
1326
1327 return Ok(Box::new(SymbolExpr {
1328 value: column_name,
1329 expr_type,
1330 flag: SymbolFlag::None,
1331 }));
1332 }
1333
1334 // This Expression contains window function call or window value
1335 if window_count_before != context.window_functions.len() {
1336 let column_name = context.name_generator.generate_column_name();
1337 let expr_type = expression.expr_type();
1338 env.define(column_name.to_string(), expr_type.clone());
1339
1340 // Register the new window generated field if the this expression is after group by
1341 if context.has_group_by_statement && !context.hidden_selections.contains(&column_name) {
1342 context.hidden_selections.push(column_name.to_string());
1343 }
1344
1345 context
1346 .window_functions
1347 .insert(column_name.clone(), WindowValue::Expression(expression));
1348
1349 return Ok(Box::new(SymbolExpr {
1350 value: column_name,
1351 expr_type,
1352 flag: SymbolFlag::None,
1353 }));
1354 }
1355
1356 return Ok(expression);
1357 }
1358

Callers 15

parse_do_queryFunction · 0.85
parse_set_queryFunction · 0.85
parse_from_optionFunction · 0.85
parse_where_statementFunction · 0.85
parse_group_by_statementFunction · 0.85
parse_having_statementFunction · 0.85
parse_qualify_statementFunction · 0.85
parse_offset_statementFunction · 0.85
parse_case_expressionFunction · 0.85

Calls 7

kindMethod · 0.80
generate_column_nameMethod · 0.80
expr_typeMethod · 0.80
defineMethod · 0.80
containsMethod · 0.80
lenMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…