private LogicalTerm getLogicalTerm(QueryBuilderQueriesParser.LogicalTermContext context) { if (context.relationalOperator() != null) { var ret = new RelationalLogicalTerm(); var Element = metadata.EntityRelationshipModel.FindByName(context.simpleAttribute().elementName.Text); var Attribute = Element.GetAttribute(context.simpleAttribute().attribute.Text); Map.MapRule ElementRule = metadata.ERMongoMapping.Rules.First(R => R.Source.Name == Element.Name); string AttributeMap = ElementRule.Rules.First(R => R.Key == Attribute.Name).Value; ret.SimpleAttribute = new SimpleAttribute($"${AttributeMap}"); ret.Value = context.value().GetText(); switch (context.relationalOperator().GetText()) { case "=": ret.RelationalOperator = RelationalOperator.EQUAL; break; case "<>": ret.RelationalOperator = RelationalOperator.NOT_EQUAL; break; case ">=": ret.RelationalOperator = RelationalOperator.GREATER_EQUAL; break; case "<=": ret.RelationalOperator = RelationalOperator.LESS_EQUAL; break; case ">": ret.RelationalOperator = RelationalOperator.GREATER; break; case "<": ret.RelationalOperator = RelationalOperator.LESS; break; case "like": ret.RelationalOperator = RelationalOperator.LIKE; break; case "is": ret.RelationalOperator = RelationalOperator.IS; break; } return(ret); } else if (context.rangeOperator() != null) { var ret = new RangeLogicalTerm(); var Element = metadata.EntityRelationshipModel.FindByName(context.simpleAttribute().elementName.Text); var Attribute = Element.GetAttribute(context.simpleAttribute().attribute.Text); Map.MapRule ElementRule = metadata.ERMongoMapping.Rules.First(R => R.Source.Name == Element.Name); string AttributeMap = ElementRule.Rules.First(R => R.Key == Attribute.Name).Value; ret.SimpleAttribute = new SimpleAttribute($"${AttributeMap}"); switch (context.rangeOperator().type) { case "BETWEEN": ret.RangeOperator = RangeOperator.BETWEEN; context.rangeOperator().value().ToList().ForEach(v => ret.Values.Add(v.GetText())); break; case "NOT_IN_QUERY": ret.RangeOperator = RangeOperator.NOT_IN_QUERY; break; case "NOT_IN_VALUES": ret.RangeOperator = RangeOperator.NOT_IN_VALUES; context.rangeOperator().value().ToList().ForEach(v => ret.Values.Add(v.GetText())); break; case "IN_QUERY": ret.RangeOperator = RangeOperator.IN_QUERY; break; case "IN_VALUES": ret.RangeOperator = RangeOperator.IN_VALUES; context.rangeOperator().value().ToList().ForEach(v => ret.Values.Add(v.GetText())); break; case "NOT_EXISTS_QUERY": ret.RangeOperator = RangeOperator.NOT_EXISTS_QUERY; break; case "EXISTS_QUERY": ret.RangeOperator = RangeOperator.EXISTS_QUERY; break; } return(ret); } else { var ret = new ParenthesisLogicalTerm(); ret.LogicalExpression = getLogicalExpression(context.logicalExpression()); return(ret); } }
/// <summary> /// Exit a parse tree produced by <see cref="QueryBuilderQueriesParser.logicalTerm"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitLogicalTerm([NotNull] QueryBuilderQueriesParser.LogicalTermContext context) { }
/// <summary> /// Visit a parse tree produced by <see cref="QueryBuilderQueriesParser.logicalTerm"/>. /// <para> /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/> /// on <paramref name="context"/>. /// </para> /// </summary> /// <param name="context">The parse tree.</param> /// <return>The visitor result.</return> public virtual Result VisitLogicalTerm([NotNull] QueryBuilderQueriesParser.LogicalTermContext context) { return(VisitChildren(context)); }