コード例 #1
0
ファイル: AtomicIncrement.cs プロジェクト: ren85/linqdb
        ulong GetWhereHash(string table_name, QueryTree tree)
        {
            if (tree.WhereInfo == null || tree.WhereInfo.Count() != 1)
            {
                throw new LinqDbException("Linqdb: one (and only) .Where statement should precede AtomicIncrement");
            }

            StringBuilder res = new StringBuilder();

            res.Append(table_name + "|");
            var whereInfo = tree.WhereInfo[0];

            foreach (var op in whereInfo.Opers)
            {
                res.Append(op.IsOperator + "|" + op.Type + "|" + op.ColumnName + "|" + op.NonDbValue + "|" + op.IsDb + "|" + op.TableNumber + "|" + op.ColumnNumber + "|" + op.ColumnType + "|" + op.IsResult + "|");
            }

            return(CalculateHash(res.ToString()));
        }
コード例 #2
0
        public List <OperResult> FindBetween(QueryTree tree, List <OperResult> oper_list, ReadOptions ro)
        {
            if (tree.BetweenInfo == null)
            {
                return(oper_list);
            }

            foreach (var bet in tree.BetweenInfo)
            {
                var res      = FindOneBetween(bet, tree.QueryCache, ro);
                var oper_res = new OperResult()
                {
                    All    = false,
                    ResIds = res
                };
                oper_res.Id     = bet.Id;
                oper_res.OrWith = bet.OrWith;
                oper_list.Add(oper_res);
            }

            return(oper_list);
        }
コード例 #3
0
ファイル: Intersect.cs プロジェクト: ren85/linqdb
        public List <OperResult> Intersect(QueryTree tree, List <OperResult> oper_list, TableInfo table_info, Dictionary <long, byte[]> cache, ReadOptions ro)
        {
            if (tree.IntersectInfo == null)
            {
                return(oper_list);
            }

            foreach (var inter in tree.IntersectInfo)
            {
                var res      = IntersectOne(inter, table_info, cache, ro);
                var oper_res = new OperResult()
                {
                    All    = false,
                    ResIds = res
                };
                oper_res.Id     = inter.Id;
                oper_res.OrWith = inter.OrWith;
                oper_list.Add(oper_res);
            }

            return(oper_list);
        }
コード例 #4
0
        public Tuple <List <int>, bool> GetIds <T>(QueryTree tree)
        {
            if ((tree.BetweenInfo == null || !tree.BetweenInfo.Any()) &&
                (tree.IntersectInfo == null || !tree.IntersectInfo.Any()) &&
                (tree.SearchInfo == null || !tree.SearchInfo.Any()) &&
                (tree.WhereInfo == null || !tree.WhereInfo.Any()))
            {
                //.Where(f => f.Id > 0)
                CheckTableInfo <T>();
                var table_info = GetTableInfo(typeof(T).Name);
                var op1        = new Oper()
                {
                    ColumnName   = null,
                    ColumnNumber = 0,
                    ColumnType   = LinqDbTypes.int_,
                    IsDb         = false,
                    IsOperator   = true,
                    IsResult     = false,
                    NonDbValue   = null,
                    Result       = null,
                    TableName    = table_info.Name,
                    TableNumber  = table_info.TableNumber,
                    Type         = System.Linq.Expressions.ExpressionType.GreaterThan
                };
                var op2 = new Oper()
                {
                    ColumnName   = "Id",
                    ColumnNumber = table_info.ColumnNumbers["Id"],
                    ColumnType   = LinqDbTypes.int_,
                    IsDb         = true,
                    IsOperator   = false,
                    IsResult     = false,
                    NonDbValue   = null,
                    Result       = null,
                    TableName    = table_info.Name,
                    TableNumber  = table_info.TableNumber,
                    Type         = System.Linq.Expressions.ExpressionType.MemberAccess
                };
                var op3 = new Oper()
                {
                    ColumnName   = null,
                    ColumnNumber = 0,
                    ColumnType   = LinqDbTypes.int_,
                    IsDb         = false,
                    IsOperator   = false,
                    IsResult     = false,
                    NonDbValue   = 0,
                    Result       = null
                };
                tree.WhereInfo = new List <WhereInfo>();
                tree.WhereInfo.Add(new WhereInfo()
                {
                    Id    = 1,
                    Opers = new Stack <Oper>()
                });
                tree.WhereInfo[0].Opers.Push(op1);
                tree.WhereInfo[0].Opers.Push(op2);
                tree.WhereInfo[0].Opers.Push(op3);
            }

            CheckTableInfo <T>();
            using (var snapshot = leveld_db.CreateSnapshot())
            {
                var ro         = new ReadOptions().SetSnapshot(snapshot);
                var table_info = GetTableInfo(typeof(T).Name);
                var where_res  = CalculateWhereResult <T>(tree, table_info, ro);
                where_res = FindBetween(tree, where_res, ro);
                where_res = Intersect(tree, where_res, table_info, tree.QueryCache, ro);
                double?searchPercentile = null;
                where_res = Search(tree, where_res, ro, out searchPercentile);
                var fres = CombineData(where_res);

                var total = GetTableRowCount(table_info, ro);
                var all   = total == fres.ResIds.Count();
                return(new Tuple <List <int>, bool>(fres.ResIds.ToList(), all));
            }
        }