核心操作文件在这里!

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], ">''");
        }
    }
}

posted @ 2012-02-25 10:34  szjdw  阅读(216)  评论(0编辑  收藏  举报