示例#1
0
        /// <summary>
        /// Process mhql query part.
        /// </summary>
        /// <param name="value">Query.</param>
        /// <param name="table">Table.</param>
        /// <param name="from">Use state FROM keyword.</param>
        public static void ProcessPart(ref string value, MochaTableResult table, bool from)
        {
            if (!from)
            {
                int _dex = value.IndexOf('(');
                if (_dex == -1)
                {
                    return;
                }
                string _val = value.Substring(0, _dex).Trim();
                value = _val + value.Substring(_dex);
                return;
            }

            int dex = value.IndexOf('(');

            if (dex == -1)
            {
                return;
            }
            string val = value.Substring(0, dex).Trim();
            IEnumerable <MochaColumn> result = table.Columns.Where(x => x.Name == val);

            if (!result.Any())
            {
                return;
            }
            value = Array.IndexOf(table.Columns, result.First()) + value.Substring(dex);
        }
示例#2
0
        /// <summary>
        /// Returns table as XmlReader.
        /// </summary>
        /// <param name="table">Table to convert.</param>
        public static XmlReader ToXmlTable(MochaTableResult table)
        {
            if (table.Columns.Length == 0)
            {
                var val =
                    $@"<Root>
    <Table></Table>
</Root>";
                return(XmlReader.Create(new StringReader(val)));
            }

            var doc = XDocument.Parse(
                @"<Root>
</Root>");

            for (int dex = 0; dex < table.Rows.Length; dex++)
            {
                XElement row = new XElement("Table");
                for (int columnIndex = 0; columnIndex < table.Columns.Length; columnIndex++)
                {
                    var      column = table.Columns[columnIndex];
                    XElement value  = new XElement(column.Name);
                    value.Value = column.Datas[dex].Data.ToString();
                    row.Add(value);
                }
                doc.Root.Add(row);
            }

            return(doc.CreateReader());
        }
示例#3
0
        /// <summary>
        /// Process condition and returns condition result.
        /// </summary>
        /// <param name="command">Condition.</param>
        /// <param name="table">Table.</param>
        /// <param name="row">Row.</param>
        /// <param name="from">Use state FROM keyword.</param>
        public static bool Process(string command, MochaTableResult table, MochaRow row, bool from)
        {
            ConditionType type;

            if (!IsCondition(command, out type))
            {
                return(false);
            }

            string[]     parts  = GetConditionParts(command, MhqlEng_CONDITION_LEXER.Operators[type.ToString()]);
            Expressional value0 = GetValue(parts[0], table, row, from);
            Expressional value1 = GetValue(parts[1], table, row, from);

            if (value0.Type != value1.Type)
            {
                throw new InvalidCastException("Value types is are not compatible!");
            }

            switch (type)
            {
            case ConditionType.EQUAL: return(value0.Equal(value1));

            case ConditionType.NOTEQUAL: return(value0.NotEqual(value1));

            case ConditionType.BIGGER: return(value0.Bigger(value1));

            case ConditionType.LOWER: return(value0.Lower(value1));

            case ConditionType.BIGGEREQ: return(value0.BiggerEqual(value1));

            case ConditionType.LOWEREQ: return(value0.LowerEqual(value1));

            default: return(false);
            }
        }
示例#4
0
        /// <summary>
        /// Pass command?
        /// </summary>
        /// <param name="command">Command.</param>
        /// <param name="table">Table.</param>
        /// <param name="row">Row.</param>
        /// <param name="from">Use state FROM keyword.</param>
        public static bool Pass(string command, MochaTableResult table, MochaRow row, bool from)
        {
            string[] parts = Mhql_LEXER.SplitFunctionParameters(command);
            if (parts.Length != 3)
            {
                throw new ArgumentOutOfRangeException("The BETWEEN function can only take 3 parameters!");
            }

            int dex = Mhql_GRAMMAR.GetIndexOfColumn(parts[0], table.Columns, from);
            decimal
                range1,
                range2,
                value;

            if (!decimal.TryParse(parts[1].Trim(), out range1) ||
                !decimal.TryParse(parts[2].Trim(), out range2) ||
                !decimal.TryParse(row.Datas[dex].Data.ToString(), out value))
            {
                throw new ArithmeticException("The parameter of the BETWEEN command was not a number!");
            }

            return
                (range1 <= range2 ?
                 range1 <= value && value <= range2 :
                 range2 <= value && value <= range1);
        }
示例#5
0
        /// <summary>
        /// Pass command?
        /// </summary>
        /// <param name="command">Command.</param>
        /// <param name="table">Table.</param>
        /// <param name="row">Row.</param>
        /// <param name="from">Use state FROM keyword.</param>
        public static bool Pass(string command, MochaTableResult table, MochaRow row, bool from)
        {
            string[] parts = Mhql_LEXER.SplitFunctionParameters(command);
            int      dex   = Mhql_GRAMMAR.GetIndexOfColumn(parts[0], table.Columns, from);

            for (int index = 1; index < parts.Length; ++index)
            {
                if (row.Datas[dex].Data.ToString().StartsWith(parts[index]))
                {
                    return(true);
                }
            }
            return(false);
        }
示例#6
0
        /// <summary>
        /// Process in keyword.
        /// </summary>
        /// <param name="tdb">Target database.</param>
        /// <param name="command">Command.</param>
        /// <param name="table">Destination table.</param>
        /// <param name="row">Destination row.</param>
        /// <param name="from">Use state of FROM keyword.</param>
        /// <param name="inmode">Set true if command is execute as in mode, set false if ineq mode.</param>
        /// <returns>True if subquery is success, false if not.</returns>
        public static bool Process(MochaDatabase tdb, string command, MochaTableResult table, MochaRow row,
                                   bool from, bool inmode)
        {
            command = command.Substring(inmode ? 2 : 4).TrimStart();
            int obrace = command.IndexOf(Mhql_LEXER.LBRACE);

            if (obrace == -1)
            {
                throw new Exception($"{Mhql_LEXER.LBRACE} is not found!");
            }
            MochaColumn column = table.Columns[Mhql_GRAMMAR.GetIndexOfColumn(
                                                   command.Substring(0, obrace).Trim(), table.Columns, from)];
            MochaTableResult result = new MochaDbCommand(tdb).ExecuteScalar(Mhql_LEXER.RangeSubqueryBrace(
                                                                                command.Substring(obrace)));

            if (result.Columns.Length != 1)
            {
                throw new Exception("Subqueries should only return one column!");
            }
            else if (MochaData.IsNumericType(column.DataType) != MochaData.IsNumericType(result.Columns[0].DataType) &&
                     column.DataType != result.Columns[0].DataType)
            {
                throw new Exception("Column data type is not same of subquery result!");
            }
            if (inmode)
            {
                for (int index = 0; index < row.Datas.Count; ++index)
                {
                    for (int rindex = 0; rindex < result.Columns[0].Datas.Count; ++rindex)
                    {
                        if (row.Datas[index].Data.ToString() == result.Columns[0].Datas[rindex].Data.ToString())
                        {
                            return(true);
                        }
                    }
                }
                return(false);
            }
            else
            {
                if (result.Rows.Length != 1)
                {
                    return(false);
                }
                return(row.Datas[0].Data.ToString() == result.Columns[0].Datas[0].Data.ToString());
            }
        }
示例#7
0
        /// <summary>
        /// Must by tables.
        /// </summary>
        /// <param name="command">Must command.</param>
        /// <param name="table">Table.</param>
        /// <param name="from">Use state FROM keyword.</param>
        public void MustTable(string command, ref MochaTableResult table, bool from)
        {
            command = command.Trim();
            var parts = Mhql_AND.GetParts(command);

            for (int index = 0; index < parts.Length; index++)
            {
                var partcmd = parts[index];
                MhqlEng_MUST.ProcessPart(ref partcmd, table, from);
                table.Rows = (
                    from value in table.Rows
                    where MhqlEng_MUST.IsPassTable(ref partcmd, value)
                    select value
                    ).ToArray();
            }
            table.SetDatasByRows();
        }
示例#8
0
        /// <summary>
        /// Orderby by command.
        /// </summary>
        /// <param name="command">Orderby command.</param>
        /// <param name="table">Table to ordering.</param>
        /// <param name="from">Use state FROM keyword.</param>
        public void OrderBy(string command, ref MochaTableResult table, bool from)
        {
            MHQLOrderType DecomposeOrder(string cmd, ref MochaTableResult tbl, out int coldex)
            {
                string[] orderparts = cmd.Trim().Split(' ');
                if (orderparts.Length > 2)
                {
                    throw new ArgumentOutOfRangeException("A single ORDERBY parameter can consist of up to 2 parts!");
                }
                coldex = Mhql_GRAMMAR.GetIndexOfColumn(orderparts[0].Trim(), tbl.Columns, from);

                if (orderparts.Length == 1)
                {
                    return(0);
                }

                string order = orderparts[orderparts.Length - 1].Trim();

                return(order == string.Empty ||
                       order.StartsWith("ASC", StringComparison.OrdinalIgnoreCase) ?
                       MHQLOrderType.ASC :
                       order.StartsWith("DESC", StringComparison.OrdinalIgnoreCase) ?
                       MHQLOrderType.DESC :
                       throw new Exception("ORDERBY could not understand this '" + order + "' sort type!"));
            }

            command = command.Trim();
            string[] parts = Mhql_LEXER.SplitParameters(command);
            int      columndex;

            IOrderedEnumerable <MochaRow> rows =
                DecomposeOrder(parts[0], ref table, out columndex) == 0 ?
                table.Rows.OrderBy(x => x.Datas[columndex].ToString(), new ORDERBYComparer()) :
                table.Rows.OrderByDescending(x => x.Datas[columndex].ToString(), new ORDERBYComparer());

            for (int index = 1; index < parts.Length; ++index)
            {
                int coldex;
                rows =
                    DecomposeOrder(parts[index], ref table, out coldex) == 0 ?
                    rows.ThenBy(x => x.Datas[coldex].ToString(), new ORDERBYComparer()) :
                    rows.ThenByDescending(x => x.Datas[coldex].ToString(), new ORDERBYComparer());
            }
            table.Rows = rows.ToArray();
            table.SetDatasByRows();
        }
示例#9
0
        /// <summary>
        /// Process mhql query part.
        /// </summary>
        /// <param name="value">Query.</param>
        /// <param name="table">Table.</param>
        /// <param name="from">Use state FROM keyword.</param>
        public static void ProcessPart(ref string value, MochaTableResult table, bool from)
        {
            if (!from)
            {
                return;
            }

            var dex    = value.IndexOf('(');
            var val    = value.Substring(0, dex);
            var result = table.Columns.Where(x => x.Name == val);

            if (result.Count() == 0)
            {
                return;
            }

            value = table.Columns.IndexOf(result.First()) + value.Substring(dex);
        }
示例#10
0
        /// <summary>
        /// Show table result.
        /// </summary>
        /// <param name="table">Table.</param>
        public void ShowTable(MochaTableResult table)
        {
            var tableGrid = new sgrid();

            tableGrid.Dock            = DockStyle.Fill;
            tableGrid.BackgroundColor = BackColor;
            tableGrid.SelectionMode   = DataGridViewSelectionMode.FullRowSelect;

            for (int columnIndex = 0; columnIndex < table.Columns.Length; columnIndex++)
            {
                tableGrid.Columns.Add(string.Empty, table.Columns[columnIndex].MHQLAsText);
            }
            for (int rowIndex = 0; rowIndex < table.Rows.Length; rowIndex++)
            {
                tableGrid.Rows.Add(table.Rows[rowIndex].Datas.ToArray());
            }

            control = tableGrid;
            Controls.Add(tableGrid);
        }
示例#11
0
        /// <summary>
        /// COrderby by command.
        /// </summary>
        /// <param name="command">COrderby command.</param>
        /// <param name="table">Table to ordering.</param>
        /// <param name="from">Use state FROM keyword.</param>
        public void COrderBy(string command, ref MochaTableResult table)
        {
            if (Mhql_LEXER.SplitParameters(command).Length > 1)
            {
                throw new ArgumentOutOfRangeException("CODERBY keyword are can take only one parameter!");
            }
            command = command.Trim();
            string[] parts = command.Split(new[] { ' ' }, 2, StringSplitOptions.RemoveEmptyEntries);
            if (parts.Length == 1)
            {
                throw new ArgumentException("CORDERBY order type is not defined!");
            }
            IOrderedEnumerable <MochaColumn> columns =
                parts[1].Equals("ASC", StringComparison.OrdinalIgnoreCase) ?
                table.Columns.OrderBy(x => x.Name, new ORDERBYComparer()) :
                parts[1].Equals("DESC", StringComparison.OrdinalIgnoreCase) ?
                table.Columns.OrderByDescending(x => x.Name, new ORDERBYComparer()) :
                throw new Exception("CORDERBY could not understand this sort type!");

            table.Columns = columns.ToArray();
            table.SetRowsByDatas();
        }
示例#12
0
        /// <summary>
        /// Must by tables.
        /// </summary>
        /// <param name="command">Must command.</param>
        /// <param name="table">Table.</param>
        /// <param name="from">Use state FROM keyword.</param>
        public void MustTable(string command, ref MochaTableResult table, bool from)
        {
            command = command.Trim();
            List <string> parts = Mhql_AND.GetParts(command);

            for (int index = 0; index < parts.Count; ++index)
            {
                string partcmd = parts[index];
                MhqlEng_MUST.ProcessPart(ref partcmd, table, from);
                List <MochaRow> rows = new List <MochaRow>();
                for (int dex = 0; dex < table.Rows.Length; ++dex)
                {
                    MochaRow row = table.Rows[dex];
                    if (MhqlEng_MUST.IsPassTable(Tdb, ref partcmd, table, row, @from))
                    {
                        rows.Add(row);
                    }
                }
                table.Rows = rows.ToArray();
            }
            table.SetDatasByRows();
        }
示例#13
0
        /// <summary>
        /// Groupby by command.
        /// </summary>
        /// <param name="command">Orderby command.</param>
        /// <param name="table">Table to ordering.</param>
        /// <param name="final">Command of removed use commands.</param>
        public void GroupBy(string command, ref MochaTableResult table)
        {
            command = command.TrimStart().TrimEnd();
            int dex =
                command.StartsWith("ASC", StringComparison.OrdinalIgnoreCase) ?
                3 :
                command.StartsWith("DESC", StringComparison.OrdinalIgnoreCase) ?
                4 : 0;

            int columndex;

            if (!int.TryParse(command.Substring(dex), out columndex))
            {
                throw new MochaException("Item index is cannot processed!");
            }

            var result =
                from value in table.Columns[columndex].Datas
                group value by value.Data into grouped
                select new { Data = grouped.Key, Count = grouped.Count() };


            table.Columns = new[] { new MochaColumn("Datas"), new MochaColumn("Count") };
            table.Rows    = new MochaRow[result.Count()];
            for (int index = 0; index < table.Rows.Length; index++)
            {
                var item = result.ElementAt(index);
                table.Rows[index] = new MochaRow(
                    new MochaData {
                    dataType = MochaDataType.String,
                    data     = item.Data
                },
                    new MochaData {
                    dataType = MochaDataType.Int32,
                    data     = item.Count
                });
            }
            table.SetDatasByRows();
        }
示例#14
0
        /// <summary>
        /// Orderby by command.
        /// </summary>
        /// <param name="command">Orderby command.</param>
        /// <param name="table">Table to ordering.</param>
        /// <param name="final">Command of removed use commands.</param>
        public void OrderBy(string command, ref MochaTableResult table)
        {
            command = command.TrimStart().TrimEnd();
            int dex =
                command.StartsWith("ASC", StringComparison.OrdinalIgnoreCase) ?
                3 :
                command.StartsWith("DESC", StringComparison.OrdinalIgnoreCase) ?
                4 : 0;

            int columndex;

            if (!int.TryParse(command.Substring(dex), out columndex))
            {
                throw new MochaException("Item index is cannot processed!");
            }

            table.Rows.array = (
                dex == 0 || dex == 3 ?
                table.Rows.OrderBy(x => x.Datas[columndex].ToString()) :
                table.Rows.OrderByDescending(x => x.Datas[columndex].ToString())).ToArray();
            table.SetDatasByRows();
        }
示例#15
0
 /// <summary>
 /// Returns command must result.
 /// </summary>
 /// <param name="tdb">Target database.</param>
 /// <param name="command">Command.</param>
 /// <param name="table">Table.</param>
 /// <param name="row">Row.</param>
 /// <param name="from">Use state FROM keyword.</param>
 public static bool IsPassTable(MochaDatabase tdb, ref string command, MochaTableResult table, MochaRow row, bool from)
 {
     command = command.Trim();
     if (Mhql_INEQ.IsINEQ(command))
     {
         return(Mhql_INEQ.Process(tdb, command, table, row, from, false));
     }
     else if (Mhql_INEQ.IsIN(command))
     {
         return(Mhql_INEQ.Process(tdb, command, table, row, from, true));
     }
     else if (MhqlEng_CONDITION.IsCondition(command, out _))
     {
         return(MhqlEng_CONDITION.Process(command, table, row, from));
     }
     else if (char.IsNumber(command[0]))
     {
         return(new Regex(command.Substring(2).Remove(command.Length - 3, 1))
                .IsMatch(GetDataFromCommand(command, row).ToString()));
     }
     else if (command.StartsWith("BETWEEN(", StringComparison.OrdinalIgnoreCase) && command[command.Length - 1] == ')')
     {
         return(MhqlMustFunc_BETWEEN.Pass(command.Substring(8, command.Length - 9), table, row, from));
     }
     else if (command.StartsWith("BIGGER(", StringComparison.OrdinalIgnoreCase) && command[command.Length - 1] == ')')
     {
         return(MhqlMustFunc_BIGGER.Pass(command.Substring(7, command.Length - 8), table, row, from));
     }
     else if (command.StartsWith("LOWER(", StringComparison.OrdinalIgnoreCase) && command[command.Length - 1] == ')')
     {
         return(MhqlMustFunc_LOWER.Pass(command.Substring(6, command.Length - 7), table, row, from));
     }
     else if (command.StartsWith("EQUAL(", StringComparison.OrdinalIgnoreCase) && command[command.Length - 1] == ')')
     {
         return(MhqlMustFunc_EQUAL.Pass(command.Substring(6, command.Length - 7), table, row, from));
     }
     else if (command.StartsWith("NOTEQUAL(", StringComparison.OrdinalIgnoreCase) && command[command.Length - 1] == ')')
     {
         return(MhqlMustFunc_NOTEQUAL.Pass(command.Substring(9, command.Length - 10), table, row, from));
     }
     else if (command.StartsWith("STARTW(", StringComparison.OrdinalIgnoreCase) && command[command.Length - 1] == ')')
     {
         return(MhqlMustFunc_STARTW.Pass(command.Substring(7, command.Length - 8), table, row, from));
     }
     else if (command.StartsWith("ENDW(", StringComparison.OrdinalIgnoreCase) && command[command.Length - 1] == ')')
     {
         return(MhqlMustFunc_ENDW.Pass(command.Substring(5, command.Length - 6), table, row, from));
     }
     else if (command.StartsWith("CONTAINS(", StringComparison.OrdinalIgnoreCase) && command[command.Length - 1] == ')')
     {
         return(MhqlMustFunc_CONTAINS.Pass(command.Substring(9, command.Length - 10), table, row, from));
     }
     else if (command.StartsWith("NOTCONTAINS(", StringComparison.OrdinalIgnoreCase) && command[command.Length - 1] == ')')
     {
         return(MhqlMustFunc_NOTCONTAINS.Pass(command.Substring(12, command.Length - 13), table, row, from));
     }
     else if (command.StartsWith("NOTSTARTW(", StringComparison.OrdinalIgnoreCase) && command[command.Length - 1] == ')')
     {
         return(MhqlMustFunc_NOTSTARTW.Pass(command.Substring(10, command.Length - 11), table, row, from));
     }
     else if (command.StartsWith("NOTENDW(", StringComparison.OrdinalIgnoreCase) && command[command.Length - 1] == ')')
     {
         return(MhqlMustFunc_NOTENDW.Pass(command.Substring(8, command.Length - 9), table, row, from));
     }
     else
     {
         throw new InvalidOperationException($"'{command}' is cannot processed!");
     }
 }
示例#16
0
        /// <summary>
        /// Returns table by use command.
        /// </summary>
        /// <param name="usecommand">Use command.</param>
        public MochaTableResult GetTable(string usecommand, bool from)
        {
            MochaColumn GetColumn(string cmd, IList <MochaColumn> cols)
            {
                string decomposeBrackets(string value)
                {
                    int dex;

                    if ((dex = value.IndexOf('(')) != -1)
                    {
                        return(value.Substring(dex + 1, value.Length - dex - 2));
                    }
                    return(value);
                }

                string name = Mhql_AS.GetAS(ref cmd);

                if (Mhql_GRAMMAR.UseFunctions.MatchKey(cmd))
                {
                    MochaColumn column = new MochaColumn();
                    column.MHQLAsText = name;
                    column.Tag        =
                        Mhql_GRAMMAR.UseFunctions.GetValueByMatchKey(cmd);
                    if (column.Tag != "COUNT")
                    {
                        column.Description =
                            Mhql_GRAMMAR.GetIndexOfColumn(decomposeBrackets(cmd), cols, from).ToString();
                    }
                    return(column);
                }
                else
                {
                    string colname = cmd.StartsWith("$") ? cmd.Substring(1).Trim() : cmd;
                    IEnumerable <MochaColumn> result = cols.Where(x => x.Name == colname);
                    if (!result.Any())
                    {
                        throw new Exception($"Could not find a column with the name '{cmd}'!");
                    }
                    MochaColumn column = result.First();
                    column.Tag        = colname != cmd ? "$" : null;
                    column.MHQLAsText = name;
                    return(column);
                }
            }

            List <MochaColumn> columns     = new List <MochaColumn>();
            MochaTableResult   resulttable = new MochaTableResult();

            if (from)
            {
                int                dex       = Mhql_FROM.GetIndex(ref usecommand);
                string             tablename = usecommand.Substring(dex + 5).Trim();
                List <string>      parts     = Mhql_LEXER.SplitUseParameters(usecommand.Substring(0, dex));
                List <MochaColumn> _columns  = Tdb.GetColumns(tablename);
                if (parts.Count == 1 && parts[0].Trim() == "*")
                {
                    columns.AddRange(_columns);
                }
                else
                {
                    if (parts[0].TrimStart().StartsWith("$") &&
                        parts[0].TrimStart().Substring(1).TrimStart().StartsWith($"{Mhql_LEXER.LBRACE}"))
                    {
                        throw new InvalidOperationException("Cannot be used with subquery FROM keyword!");
                    }
                    for (int index = 0; index < parts.Count; ++index)
                    {
                        columns.Add(GetColumn(parts[index].Trim(), _columns));
                    }
                }
            }
            else
            {
                List <string> parts = Mhql_LEXER.SplitUseParameters(usecommand);
                for (int index = 0; index < parts.Count; ++index)
                {
                    string callcmd = parts[index].Trim();
                    if (callcmd == "*")
                    {
                        List <MochaTable> tables = Tdb.GetTables();
                        for (int tindex = 0; tindex < tables.Count; ++tindex)
                        {
                            columns.AddRange(tables[tindex].Columns);
                        }
                        continue;
                    }
                    int obrace = callcmd.IndexOf(Mhql_LEXER.LBRACE);
                    if (obrace != -1)
                    {
                        IList <MochaColumn> _cols = (new MochaDbCommand(Tdb).ExecuteScalar(Mhql_LEXER.RangeSubqueryBrace(
                                                                                               callcmd.Substring(obrace).Trim()))).Columns;
                        string mode =
                            callcmd.Substring(0, obrace).TrimStart().StartsWith("$") ?
                            "$" : string.Empty;
                        for (int cindex = 0; cindex < _cols.Count; ++cindex)
                        {
                            columns.Add(GetColumn($"{mode}{_cols[cindex].Name}", _cols));
                        }
                        continue;
                    }
                    if (callcmd.StartsWith("$"))
                    {
                        callcmd = callcmd.Substring(1).Trim();
                        List <MochaColumn> _cols = Tdb.GetColumns(callcmd);
                        for (int cindex = 0; cindex < _cols.Count; ++cindex)
                        {
                            columns.Add(GetColumn($"${_cols[cindex].Name}", _cols));
                        }
                        continue;
                    }

                    string[] callparts = Mhql_LEXER.SplitSubCalls(callcmd);
                    if (callparts.Length > 2)
                    {
                        throw new InvalidOperationException($"'{callcmd}' command is cannot processed!");
                    }
                    for (byte partindex = 0; partindex < callparts.Length; ++partindex)
                    {
                        callparts[partindex] = callparts[partindex].Trim();
                    }
                    List <MochaColumn> _columns = Tdb.GetColumns(callparts[0]);
                    if (callparts.Length == 1)
                    {
                        columns.AddRange(_columns);
                    }
                    else
                    {
                        columns.Add(GetColumn(callparts[1], _columns));
                    }
                }
            }
            resulttable.Columns = columns.ToArray();
            resulttable.SetRowsByDatas();
            return(resulttable);
        }
示例#17
0
        /// <summary>
        /// Returns table by use command.
        /// </summary>
        /// <param name="usecommand">Use command.</param>
        public MochaTableResult GetTable(string usecommand, bool from)
        {
            var columns     = new List <MochaColumn>();
            var resulttable = new MochaTableResult();

            if (from)
            {
                var dex       = usecommand.IndexOf("FROM", StringComparison.OrdinalIgnoreCase);
                var tablename = usecommand.Substring(dex + 4).TrimStart().TrimEnd();
                var parts     = usecommand.Substring(0, dex).Split(',');

                var table = Tdb.GetTable(tablename);

                if (parts.Length == 1 && parts[0].Trim() == "*")
                {
                    columns.AddRange(table.Columns);
                }
                else
                {
                    for (var index = 0; index < parts.Length; index++)
                    {
                        var callcmd = parts[index].Trim();
                        var name    = Mhql_AS.GetAS(ref callcmd);
                        var column  = table.Columns[callcmd];
                        column.Name = name;
                        columns.Add(column);
                    }
                }
            }
            else
            {
                var parts = usecommand.Split(',');
                for (var index = 0; index < parts.Length; index++)
                {
                    var callcmd = parts[index].Trim();
                    if (callcmd == "*")
                    {
                        var tables = Tdb.GetTables();
                        for (int tindex = 0; tindex < tables.Count; tindex++)
                        {
                            columns.AddRange(tables[tindex].Columns);
                        }
                        continue;
                    }

                    var callparts = callcmd.Split('.');
                    if (callparts.Length > 2)
                    {
                        throw new MochaException($"'{callcmd}' command is cannot processed!");
                    }
                    for (byte partindex = 0; partindex < callparts.Length; partindex++)
                    {
                        callparts[partindex] = callparts[partindex].Trim();
                    }
                    var table = Tdb.GetTable(callparts[0]);
                    if (callparts.Length == 1)
                    {
                        columns.AddRange(table.Columns);
                    }
                    else
                    {
                        var callp1 = callparts[1];
                        var name   = Mhql_AS.GetAS(ref callp1);
                        var column = table.Columns[callp1];
                        column.Name = name;
                        columns.Add(column);
                    }
                }
            }

            resulttable.Columns = columns.ToArray();
            resulttable.SetRowsByDatas();

            return(resulttable);
        }
示例#18
0
        /// <summary>
        /// Returns sector table by use command.
        /// </summary>
        /// <param name="usecommand">Use command.</param>
        public MochaTableResult GetSector(string usecommand, bool from)
        {
            if (from)
            {
                throw new MochaException("FROM keyword is cannot used with @SECTORS marked commands!");
            }

            var resulttable = new MochaTableResult {
                Columns = new[] {
                    new MochaColumn("Name"),
                    new MochaColumn("Description"),
                    new MochaColumn("Data")
                }
            };
            var rows = new List <MochaRow>();

            var parts = usecommand.Split(',');

            for (var index = 0; index < parts.Length; index++)
            {
                var callcmd = parts[index].TrimStart().TrimEnd();
                if (callcmd == "*")
                {
                    var sectors = Tdb.GetSectors();
                    for (int sindex = 0; sindex < sectors.Count; sindex++)
                    {
                        var currentsector = sectors.ElementAt(sindex);
                        rows.Add(new MochaRow(
                                     new MochaData {
                            data     = currentsector.Name,
                            dataType = MochaDataType.String
                        },
                                     new MochaData {
                            data     = currentsector.Description,
                            dataType = MochaDataType.String
                        },
                                     new MochaData {
                            data     = currentsector.Data,
                            dataType = MochaDataType.String
                        }
                                     ));
                    }
                }
                else
                {
                    var sector = Tdb.GetSector(callcmd);
                    rows.Add(new MochaRow(
                                 new MochaData {
                        data     = sector.Name,
                        dataType = MochaDataType.String
                    },
                                 new MochaData {
                        data     = sector.Description,
                        dataType = MochaDataType.String
                    },
                                 new MochaData {
                        data     = sector.Data,
                        dataType = MochaDataType.String
                    }
                                 ));
                }
            }
            resulttable.Rows = rows.ToArray();

            return(resulttable);
        }
示例#19
0
        /// <summary>
        /// Returns value.
        /// </summary>
        /// <param name="value">Value.</param>
        /// <param name="table">Table.</param>
        /// <param name="row">Row.</param>
        /// <param name="from">Use state FROM keyword.</param>
        public static Expressional GetValue(string value, MochaTableResult table, MochaRow row, bool from)
        {
            if (value.StartsWith("'"))
            {
                MhqlEngVal_CHAR.Process(ref value);
                return(new Expressional {
                    Type = ExpressionType.Char,
                    Value = value
                });
            }
            else if (value.StartsWith("\""))
            {
                MhqlEngVal_STRING.Process(ref value);
                return(new Expressional {
                    Type = ExpressionType.String,
                    Value = value
                });
            }
            else if (value.StartsWith("#"))
            {
                decimal val;
                if (!decimal.TryParse(value.Substring(1).Replace('.', ','), out val))
                {
                    throw new ArithmeticException("Value is not arithmetic value!");
                }
                return(new Expressional {
                    Type = ExpressionType.Arithmetic,
                    Value = val
                });
            }
            else if (value == "TRUE")
            {
                return new Expressional {
                           Type  = ExpressionType.Boolean,
                           Value = true
                }
            }
            ;
            else if (value == "FALSE")
            {
                return new Expressional {
                           Type  = ExpressionType.Boolean,
                           Value = false
                }
            }
            ;

            if (from)
            {
                IEnumerable <MochaColumn> result = table.Columns.Where(x => x.Name == value);

                if (!result.Any())
                {
                    goto index;
                }

                MochaData data = row.Datas[Array.IndexOf(table.Columns, result.First())];
                return(new Expressional {
                    Type =
                        data.dataType == MochaDataType.Unique ||
                        data.dataType == MochaDataType.String ||
                        data.dataType == MochaDataType.DateTime ?
                        ExpressionType.String :
                        data.dataType == MochaDataType.Char ?
                        ExpressionType.Char :
                        data.dataType == MochaDataType.Boolean ?
                        ExpressionType.Boolean :
                        ExpressionType.Arithmetic,
                    Value = data.data
                });
            }

index:

            if (!char.IsNumber(value[0]))
            {
                throw new ArgumentException("Column is not defined!");
            }
            int dex = int.Parse(value);

            if (dex < 0)
            {
                throw new ArgumentOutOfRangeException("Index is cannot lower than zero!");
            }
            else if (dex > row.Datas.Count - 1)
            {
                throw new ArgumentOutOfRangeException("The specified index is more than the number of columns!");
            }
            MochaData _data = row.Datas[dex];

            return(new Expressional {
                Type =
                    _data.dataType == MochaDataType.Unique ||
                    _data.dataType == MochaDataType.String ||
                    _data.dataType == MochaDataType.DateTime ?
                    ExpressionType.String :
                    _data.dataType == MochaDataType.Char ?
                    ExpressionType.Char :
                    _data.dataType == MochaDataType.Boolean ?
                    ExpressionType.Boolean :
                    ExpressionType.Arithmetic,
                Value = _data.data
            });
        }

        #endregion Members
    }