核心操作文件在这里!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Person.Core.StructModel;
namespace Person.Core.Expressions.MSSQLQuery
{
public class EqualsOperator : OperatorBase
{
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
return string.Concat(parameters[0], " = ", parameters[1]);
}
}
public class NotEqualsOperator : OperatorBase
{
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
return string.Concat(parameters[0], " != ", parameters[1]);
}
}
public class GreaterOperator : OperatorBase
{
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
return string.Concat(parameters[0], " > ", parameters[1]);
}
}
public class LessOperator : OperatorBase
{
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
return string.Concat(parameters[0], " < ", parameters[1]);
}
}
public class GreaterOrEqualsOperator : OperatorBase
{
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
return string.Concat(parameters[0], ">=", parameters[1]);
}
}
public class LessOrEqualsOperator : OperatorBase
{
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
return string.Concat(parameters[0], " <= ", parameters[1]);
}
}
public class MatchOperator : OperatorBase
{
public override object As(string value)
{
return value;
}
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
return string.Concat(parameters[0], " LIKE \'", string.Concat('%', parameters[1], '%'), '\'');
}
}
public class ContainsOperator : OperatorBase
{
public override object As(string value)
{
return value;
}
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
return string.Concat(parameters[0], " LIKE \'", string.Concat("%,", parameters[1], ",%"), '\'');
//return string.Concat(" CONTAINS(" + parameters[0] + ",'" + parameters[1] + "')");
}
}
public class SearchOperator : OperatorBase
{
public override object As(string value)
{
return value;
}
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
// return string.Concat(parameters[0], " LIKE (", string.Concat('%', parameters[1], '%'), '\'');
return string.Concat(" CONTAINS(" + parameters[0] + ",'" + parameters[1] + "')");
}
}
public class InOperator : OperatorBase
{
private string _keyword;
public InOperator()
: this("IN")
{
}
public InOperator(string keyword)
{
this._keyword = keyword;
}
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
int length = parameters.Length;
string[] strs;
if (length == 2 && parameters[1] is Array)
{
Array items = (Array)parameters[1];
int itemsLength = items.Length;
strs = new string[itemsLength];
for (int i = 0; i < itemsLength; i++)
{
object v = items.GetValue(i);
if (v != null)
{
strs[i] = items.GetValue(i).ToString();
}
else
{
strs[i] = string.Empty;
}
}
}
else
{
strs = new string[length - 1];
for (int i = 1; i < length; i++)
{
strs[i - 1] = parameters[i].ToString();
}
}
return string.Concat(parameters[0], " ", this._keyword, " (", string.Join(",", strs), ")");
}
}
public class NotInOperator : InOperator
{
public NotInOperator()
: base("NOT IN")
{
}
//public override object FinalExecute(IOperator parentOperator, object[] parameters)
//{
// int length = parameters.Length;
// string[] strs = new string[length - 1];
// for (int i = 1; i < length; i++)
// {
// strs[i - 1] = parameters[i].ToString();
// }
// return string.Concat(parameters[0], " NOT IN (", string.Join(",", strs), ")");
//}
}
public class BetweenOperator : OperatorBase
{
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
return string.Concat(parameters[0], " BETWEEN ", parameters[1], " AND ", parameters[2]);
}
}
public abstract class LogicalOperator : OperatorBase
{
public override object As(string value)
{
return value;
}
public override object As(char value)
{
return value.ToString();
}
}
public class AndOperator : LogicalOperator
{
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
int length = parameters.Length;
string[] strs = new string[length];
StringBuilder sb = new StringBuilder("(");
bool notFirst = false;
for (int i = 0; i < length; i++)
{
//strs[i] = (string)this.As(parameters[i]);
object p = parameters[i];
if (p != null && p.ToString() != string.Empty)
{
if (notFirst)
{
sb.Append(" AND ");
}
else
{
notFirst = true;
}
sb.Append(this.As(p));
}
}
sb.Append(")");
//WebContext.EndWrite(sb.ToString());
return sb.ToString();
//return string.Concat("(", string.Join(" AND ", strs), ")");
//return string.Concat("(", string.Join<object>(" AND ", parameters), ")");
}
}
public class OrOperator : LogicalOperator
{
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
//int length = parameters.Length;
//string[] strs = new string[length];
//for (int i = 0; i < length; i++)
//{
// strs[i] = (string)this.As(parameters[i]);
//}
return string.Concat("(", string.Join<object>(" OR ", parameters), ")");
}
}
public class BitInOperator : OperatorBase
{
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
string target = (string)parameters[0];
int length = parameters.Length;
object[] items = new object[length - 1];
for (int i = 1; i < length; i++)
{
items[i - 1] = parameters[i];
}
return string.Concat(target, " = (", target, "|", string.Join<object>("|", items), ")");
}
}
public class BitNotInOperator : OperatorBase
{
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
string target = (string)parameters[0];
int length = parameters.Length;
object[] items = new object[length - 1];
for (int i = 1; i < length; i++)
{
items[i - 1] = parameters[i];
}
return string.Concat(0, " < (", target, "|", string.Join<object>("|", items), ")");
}
}
public class BitAnyInOperator : OperatorBase
{
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
string target = (string)parameters[0];
int length = parameters.Length;
object[] items = new object[length - 1];
for (int i = 1; i < length; i++)
{
items[i - 1] = parameters[i];
}
return string.Concat(target, " <> (", target, "|", string.Join<object>("|", items), ")");
}
}
public class SelectOperator : OperatorBase
{
public class StructToObject : IConverter<StructInfo, object>
{
public static readonly StructToObject Instance = new StructToObject();
#region IConverter<StructInfo,object> 成员
public object To(StructInfo from)
{
string outerName = from.GetOuterName();
if (!string.IsNullOrEmpty(outerName) && outerName != from.GetName())
{
return string.Concat(from.GetFullName(), " AS ", outerName);
}
else
{
return from.GetFullName();
}
}
#endregion
}
public override object AsValue(IExpressionObject value)
{
if (value is IConvertable<StructInfo>)
{
(value as IConvertable<StructInfo>).SetConverter(StructToObject.Instance);
}
return base.AsValue(value);
}
private string paramsToString(Array paramItems, string seperator)
{
int paramsLength = paramItems.Length;
if (paramsLength > 0)
{
if (paramsLength == 1)
{
return this.paramToString(paramItems.GetValue(0));
}
StringBuilder sb = new StringBuilder();
bool flag1 = true;
for (int i = 0; i < paramsLength; i++)
{
if (flag1)
{
flag1 = false;
}
else
{
sb.Append(seperator);
}
sb.Append(this.paramToString(paramItems.GetValue(i)));
}
return sb.ToString();
}
return string.Empty;
}
private string paramToString(object param, string seperator = null)
{
if (param == null)
{
return string.Empty;
}
else if (param is IExpressionObject)
{
return this.AsValue((IExpressionObject)param).ToString();
}
else if (seperator != null && param is Array)
{
return this.paramsToString((Array)param, seperator);
}
else
{
return param.ToString();
}
}
public override object Execute(IOperator parentOperator, object[] parameters)
{
int paramsLength = parameters.Length;
object fieldsParam = paramsLength > 0 ? parameters[0] : null;
object fromsParam = paramsLength > 1 ? parameters[1] : null;
object termsParam = paramsLength > 2 ? parameters[2] : null;
object sortsParam = paramsLength > 3 ? parameters[3] : null;
object topParam = paramsLength > 4 ? parameters[4] : null;
const string SEPERATOR = ",";
StringBuilder sb = new StringBuilder();
if (parentOperator != null)
{
sb.Append('(');
}
string fieldsStr = this.paramToString(fieldsParam, SEPERATOR);
string fromsStr = this.paramToString(fromsParam, SEPERATOR);
string termsStr = this.paramToString(termsParam);
string sortsStr = this.paramToString(sortsParam, SEPERATOR);
string topStr = this.paramToString(topParam);
if (!string.IsNullOrEmpty(fieldsStr))
{
sb.Append("SELECT ");
if (!string.IsNullOrEmpty(topStr))
{
sb.Append("TOP ");
sb.Append(topStr);
sb.Append(' ');
}
sb.Append(fieldsStr);
}
if (!string.IsNullOrEmpty(fromsStr))
{
sb.Append(" FROM ");
sb.Append(fromsStr);
}
if (!string.IsNullOrEmpty(termsStr))
{
sb.Append(" WHERE ");
sb.Append(termsStr);
}
if (!string.IsNullOrEmpty(sortsStr))
{
sb.Append(" ORDER BY ");
sb.Append(sortsStr);
}
if (parentOperator != null)
{
sb.Append(')');
}
return sb.ToString();
}
}
public class JoinOperator : OperatorBase
{
//private EqualsOperator equals = null;
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
Array paramsMaster = (Array)parameters[0];
StringBuilder sb = new StringBuilder();
bool flag1 = true;
foreach (var item in paramsMaster)
{
if (flag1)
{
flag1 = false;
}
else
{
sb.Append(" LEFT JOIN ");
}
sb.Append(this.As(item));
}
object param2 = parameters[1];
if (param2 != null)
{
if (param2 is Array)
{
Array paramsCompare = (Array)param2;
bool flag2 = true;
foreach (var item in paramsCompare)
{
if (!(item is IExpressionObject))
{
continue;
}
if (flag2)
{
flag2 = false;
sb.Append(" ON ");
}
else
{
sb.Append(" AND ");
}
sb.Append(this.AsValue((IExpressionObject)item));
}
}
else
{
sb.Append(" ON ");
sb.Append(param2);
}
}
return sb.ToString(); ;
}
}
public class DescOperator : OperatorBase
{
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
bool flag1 = true;
StringBuilder sb = new StringBuilder();
foreach (var item in parameters)
{
if (flag1)
{
flag1 = false;
}
else
{
sb.Append(',');
}
sb.Append(item);
sb.Append(" DESC");
}
return sb.ToString();
}
}
public class AscOperator : OperatorBase
{
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
bool flag1 = true;
StringBuilder sb = new StringBuilder();
foreach (var item in parameters)
{
if (flag1)
{
flag1 = false;
}
else
{
sb.Append(',');
}
sb.Append(item);
sb.Append(" ASC");
}
return sb.ToString();
}
}
public class IsNullOperator : OperatorBase
{
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
return string.Concat(parameters[0], " is null");
}
}
public class IsNotNullOperator : OperatorBase
{
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
return string.Concat(parameters[0], " is not null");
}
}
public class IsEmptyOperator : OperatorBase
{
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
return string.Concat(parameters[0], "=''");
}
}
public class IsNotEmptyOperator : OperatorBase
{
public override object FinalExecute(IOperator parentOperator, object[] parameters)
{
return string.Concat(parameters[0], ">''");
}
}
}