// private SqlExpression EmitSearchFunction(SearchFunction searchFunction) // { // SqlSearchCondition search ; // // if (noNext) // search = conditionChainOwner as SqlSearchCondition ; // else // search = conditionChainOwner.GetNextSqlSearchCondition() ; // noNext = false; // // SqlExpression leftExpression = EvalExpression(searchFunction.PropertyPath); // // SqlPredicate predicate; // // string lowFuncName = searchFunction.FunctionName.ToLower(CultureInfo.InvariantCulture); // if (lowFuncName == "contains") // predicate = search.GetSqlContainsPredicate(leftExpression, new SqlStringLiteral(searchFunction.SearchString.Value)); // else if (lowFuncName == "freetext") // do not localize // predicate = search.GetSqlFreeTextPredicate(leftExpression, new SqlStringLiteral(searchFunction.SearchString.Value)); // else // throw new NPathException("Unknown search function: " + searchFunction.FunctionName); // do not localize // // return predicate; // } // private void EmitMathExpression(MathExpression mathExpression) // { // EmitExpression(mathExpression.LeftOperand); // switch (mathExpression.Operator) // { // case "add": // currentClause.Append(" + ") ; // break; // case "minus": // currentClause.Append(" - ") ; // break; // case "mul": // currentClause.Append(" * ") ; // break; // case "div": // currentClause.Append(" / ") ; // break; // case "xor": // do not localize // currentClause.Append(" xor ") ; // do not localize // break; // case "mod": // do not localize // currentClause.Append(" mod ") ; // do not localize // break; // default: // currentClause.Append(" " + mathExpression.Operator + " ") ; // break; // } // EmitExpression(mathExpression.RightOperand); // } // // // private void EmitPropertyFilter(PropertyFilter propertyFilter) // { // currentClause.Append(propertyPathTraverser.TraversePropertyPath(propertyFilter.Path)) ; // //Note: We have to get some kind of value back // //from the evaluation of the property path // //to keep track of where we are, I think.... // //Or perhaps the path will do? // currentClause.Append("[") ; // EmitExpression(propertyFilter.Filter.Expression); // currentClause.Append("]") ; // } private SqlFunction EvalFunction(NPathFunction function) { if (function is NPathSoundexStatement) return new SqlSoundexFunction(EvalExpression(function.Expression)); if (function is NPathSumStatement) return new SqlSumFunction(EvalExpression(function.Expression), function.Distinct ); if (function is NPathCountStatement) return new SqlCountFunction(EvalExpression(function.Expression), function.Distinct ); if (function is NPathAvgStatement) return new SqlAvgFunction(EvalExpression(function.Expression), function.Distinct ); if (function is NPathMinStatement) return new SqlMinFunction(EvalExpression(function.Expression), function.Distinct ); if (function is NPathMaxStatement) return new SqlMaxFunction(EvalExpression(function.Expression), function.Distinct ); if (function is NPathIsNullStatement) throw new IAmOpenSourcePleaseImplementMeException("IsNullStatement not commpatible with SqlDom structure") ; throw new IAmOpenSourcePleaseImplementMeException("Unknown function type: " + function.GetType().ToString() ) ; }
protected virtual void EmitFunction(NPathFunction function) { if (function is NPathSumStatement) Write("sum"); if (function is NPathCountStatement) Write("count"); if (function is NPathAvgStatement) Write("avg"); if (function is NPathMinStatement) Write("min"); if (function is NPathMaxStatement) Write("max"); if (function is NPathIsNullStatement) Write("isnull"); Write("("); EmitExpression(function.Expression); Write(")"); }
private IValue ParseValue() { IValue operand = null; bool isNegative = false; if (tokenizer.GetCurrentToken().IsType("sign")) { if (tokenizer.GetCurrentToken().IsType("minus")) isNegative = true; tokenizer.MoveNext(); } Token currentToken = tokenizer.GetCurrentToken(); #region parse value if (currentToken.IsType("null")) { NPathNullValue nullOperand = new NPathNullValue(); operand = nullOperand; tokenizer.MoveNext(); } else if (currentToken.IsType("parameter")) { NPathParameter parameterOperand = new NPathParameter(); parameterOperand.Value = parameterQueue[0]; parameterQueue.RemoveAt(0); operand = parameterOperand; tokenizer.MoveNext(); } else if (tokenizer.GetCurrentToken().IsType("textsearch")) { return ParseSearchFunctionExpression(); } else if (currentToken.IsType("function") && IsInSelectClause() || currentToken.IsType("isnull") || currentToken.IsType("soundex")) { NPathFunction functionOperand = new NPathFunction(); if (currentToken.IsType("soundex")) functionOperand = new NPathSoundexStatement(); if (currentToken.IsType("sum")) functionOperand = new NPathSumStatement(); if (currentToken.IsType("isnull")) functionOperand = new NPathIsNullStatement(); if (currentToken.IsType("count")) functionOperand = new NPathCountStatement(); if (currentToken.IsType("avg")) functionOperand = new NPathAvgStatement(); if (currentToken.IsType("min")) functionOperand = new NPathMinStatement(); if (currentToken.IsType("max")) functionOperand = new NPathMaxStatement(); tokenizer.MoveNext(); tokenizer.GetCurrentToken("(", "("); tokenizer.MoveNext(); if (tokenizer.GetCurrentToken().IsType("distinct")) { functionOperand.Distinct = true; tokenizer.MoveNext(); } functionOperand.Expression = ParseBooleanExpression(); tokenizer.GetCurrentToken(")", ")"); tokenizer.MoveNext(); operand = functionOperand; } else if (currentToken.IsType("date")) { NPathDateTimeValue dateOperand = new NPathDateTimeValue(); dateOperand.Value = DateTime.Parse(currentToken.Text); operand = dateOperand; tokenizer.MoveNext(); } else if (currentToken.IsType("decimal")) { NPathDecimalValue decimalOperand = new NPathDecimalValue(); decimalOperand.Value = double.Parse(currentToken.Text, NumberFormatInfo.InvariantInfo); decimalOperand.IsNegative = isNegative; operand = decimalOperand; tokenizer.MoveNext(); } else if (currentToken.IsType("string")) { NPathStringValue stringOperand = new NPathStringValue(); string text = currentToken.Text; text = text.Substring(1, text.Length - 2); if (currentToken.IsType("string '")) // do not localize text = text.Replace("''", "'"); else if (currentToken.IsType("string \"")) text = text.Replace("\"\"", "\""); // do not localize stringOperand.Value = text; operand = stringOperand; tokenizer.MoveNext(); } else if (currentToken.IsType("boolean")) { NPathBooleanValue booleanOperand = new NPathBooleanValue(); booleanOperand.Value = bool.Parse(currentToken.Text); operand = booleanOperand; tokenizer.MoveNext(); } else if (currentToken.IsType("guid")) { NPathGuidValue guidOperand = new NPathGuidValue(); guidOperand.Value = currentToken.Text; operand = guidOperand; tokenizer.MoveNext(); } else if (currentToken.IsType("property path")) // do not localize { if (tokenizer.GetNextToken().IsType("(")) { string fullPath = currentToken.Text; string propertyPath = ""; string methodName = ""; int lastIndexOfDot = fullPath.LastIndexOf("."); if (lastIndexOfDot > 0) { propertyPath = fullPath.Substring(0, lastIndexOfDot); methodName = fullPath.Substring(lastIndexOfDot + 1); } else { methodName = fullPath; } NPathMethodCall call = new NPathMethodCall(); call.MethodName = methodName; call.PropertyPath = new NPathIdentifier(); call.PropertyPath.Path = propertyPath; call.PropertyPath.IsNegative = isNegative; //TODO:add method support here tokenizer.MoveNext(); //move past "(" tokenizer.MoveNext(); while (!tokenizer.GetCurrentToken().IsType(")")) { IValue param = ParseExpression(); call.Parameters.Add(param); if (tokenizer.GetCurrentToken().IsType("comma")) { tokenizer.MoveNext(); } else { tokenizer.GetCurrentToken(")", ")"); } } tokenizer.MoveNext(); operand = call; } else if (tokenizer.GetNextToken().IsType("[")) { CurrentPropertyPrefix = currentToken.Text + "."; NPathBracketGroup bracketGroup = new NPathBracketGroup(); tokenizer.MoveNext(); ParseBracketGroup(bracketGroup); CurrentPropertyPrefix = ""; NPathParenthesisGroup parens = new NPathParenthesisGroup(); parens.Expression = bracketGroup.Expression; operand = parens; } else { NPathIdentifier propertyOperand = new NPathIdentifier(); propertyOperand.Path = CurrentPropertyPrefix + currentToken.Text; propertyOperand.ReferenceLocation = IsInSelectClause() ? NPathPropertyPathReferenceLocation.SelectClause : NPathPropertyPathReferenceLocation.WhereClause; //CurrentQuery.AddPropertyPathReference(propertyOperand.Path) ; propertyOperand.IsNegative = isNegative; operand = propertyOperand; tokenizer.MoveNext(); } } else if (currentToken.IsType("(")) { NPathParenthesisGroup parenthesisOperand = new NPathParenthesisGroup(); ParseParenthesisGroup(parenthesisOperand); parenthesisOperand.IsNegative = isNegative; operand = parenthesisOperand; } else { //unknown value? throw GetUnknownTokenException(); } #endregion return operand; }