/// <summary> /// Extracts the filter definition once a leaf is found. /// </summary> /// <param name="info">QueryInformation being filled.</param> /// <param name="binaryNode">BinaryOperatorNode the leaf belongs to.</param> /// <param name="constantNode">ConstantNode with the parameter definition.</param> private void ProcessLeafNode(QueryInformation info, BinaryOperatorNode binaryNode, ConstantNode constantNode) { try { // Necesary variables SingleValuePropertyAccessNode propertyAccessNode = binaryNode.Left as SingleValuePropertyAccessNode; SingleValueFunctionCallNode functioncall = binaryNode.Left as SingleValueFunctionCallNode; // The filter definition that is going to be added. FilterParameterDefinition filterdefinition = new FilterParameterDefinition(); // Populating common values. filterdefinition.FilteringOperator = (FilteringOperator)binaryNode.OperatorKind; filterdefinition.StringValue = constantNode.Value.ToString(); if (functioncall != null) { // it contains a function call propertyAccessNode = ParseFunctionCall(propertyAccessNode, functioncall, filterdefinition); } if (propertyAccessNode != null) { //it is a simple equals ParsePropertyAccessNode(info, propertyAccessNode, filterdefinition); } } catch (Exception ex) { LogException(ex); } }
/// <summary> /// Gets the SingleValuePropertyAccessNode from a function call. /// </summary> /// <param name="propertyAccessNode">Property access node the function call belongs to.</param> /// <param name="functioncall">Function call being parsed.</param> /// <param name="filterdefinition">Filter definition being filled.</param> /// <returns>A SingleValuePropertyAccessNode to be parsed.</returns> private static SingleValuePropertyAccessNode ParseFunctionCall(SingleValuePropertyAccessNode propertyAccessNode, SingleValueFunctionCallNode functioncall, FilterParameterDefinition filterdefinition) { StringBuilder builder = new StringBuilder(); var argumentEnumerator = functioncall.Arguments.GetEnumerator(); filterdefinition.Modifiers = functioncall.Name; argumentEnumerator.MoveNext(); propertyAccessNode = argumentEnumerator.Current as SingleValuePropertyAccessNode; return(propertyAccessNode); }
/// <summary> /// Parses a Property access node. /// </summary> /// <param name="info">QueryInformation being filled.</param> /// <param name="propertyAccessNode">Property access node to be parsed.</param> /// <param name="filterdefinition">Filter definition being filled.</param> private static void ParsePropertyAccessNode(QueryInformation info, SingleValuePropertyAccessNode propertyAccessNode, FilterParameterDefinition filterdefinition) { filterdefinition.FieldName = propertyAccessNode.Property.Name; info.FilterParameters.Add(filterdefinition); }