示例#1
0
        List <int> GreaterThanNegativeOperator(Oper odb, EncodedValue val, bool is_equal, Dictionary <long, byte[]> cache, ReadOptions ro, string snapshot_id, string id_snapshot_id)
        {
            if (!string.IsNullOrEmpty(snapshot_id))
            {
                if (indexes.ContainsKey(odb.TableName + "|" + odb.ColumnName + "|" + snapshot_id))
                {
                    return(new List <int>());
                }
            }

            var result_set = new List <int>();

            if (val.Type == LinqDbTypes.double_ && val.DoubleVal >= 0 || val.Type == LinqDbTypes.DateTime_ && val.DoubleVal >= 0 || val.Type == LinqDbTypes.int_ && val.IntVal >= 0)
            {
                return(result_set);
            }
            else
            {
                if (val.Type == LinqDbTypes.double_)
                {
                    val.DoubleVal *= -1;
                }
                if (val.Type == LinqDbTypes.int_)
                {
                    val.IntVal *= -1;
                }
                return(LessThanOperator(odb, val, is_equal, cache, ro, snapshot_id, id_snapshot_id));
            }
        }
示例#2
0
        List <int> OperatorGetAll(Oper odb, Dictionary <long, byte[]> cache, ReadOptions ro)
        {
            var result_set = new List <int>();

            using (var it = leveld_db.NewIterator(null, ro))
            {
                var key = MakeIndexSearchKey(new IndexKeyInfo()
                {
                    ColumnNumber = odb.ColumnNumber,
                    TableNumber  = odb.TableNumber,
                    Val          = PostNullConstantPreEverythingElse,
                    ColumnType   = odb.ColumnType
                });

                it.Seek(key);

                if (!it.Valid())
                {
                    return(result_set);
                }
                var v = it.Key();
                if (v == null)
                {
                    return(result_set);
                }
                var kinfo = GetIndexKey(v);
                if (kinfo.NotKey || kinfo.TableNumber != odb.TableNumber || kinfo.ColumnNumber != odb.ColumnNumber)
                {
                    return(result_set);
                }

                result_set.Add(kinfo.Id);
                //PutToCache(kinfo, cache);
                while (true)
                {
                    it.Next();
                    if (!it.Valid())
                    {
                        return(result_set);
                    }
                    var ckey = it.Key();
                    if (ckey == null)
                    {
                        return(result_set);
                    }
                    kinfo = GetIndexKey(ckey);
                    if (kinfo.NotKey || kinfo.TableNumber != odb.TableNumber || kinfo.ColumnNumber != odb.ColumnNumber)
                    {
                        return(result_set);
                    }
                    result_set.Add(kinfo.Id);
                    //PutToCache(kinfo, cache);
                }
            }
        }
示例#3
0
        List <int> NotEqualOperator(Oper odb, EncodedValue val, Dictionary <long, byte[]> cache, ReadOptions ro, string snapshot_id, string id_snapshot_id)
        {
            var index_res = NotEqualOperatorWithIndex(odb, val, ro, snapshot_id, id_snapshot_id);

            if (index_res != null)
            {
                return(index_res);
            }

            var r = NotEqualGeneric(odb, val, cache, ro);

            if (val.IsNull)
            {
                return(r);
            }

            //negative
            if (val.IsNull)
            {
                odb.ColumnNumber *= -1;
                var rn = OperatorGetAll(odb, cache, ro);
                r = r.MyUnion(rn);
            }
            else if (odb.ColumnType == LinqDbTypes.double_ || odb.ColumnType == LinqDbTypes.DateTime_)
            {
                if (val.DoubleVal < 0)
                {
                    odb.ColumnNumber *= -1;
                    val.DoubleVal     = -1 * val.DoubleVal;
                }
                var rn = NotEqualGeneric(odb, val, cache, ro);
                r = r.MyUnion(rn);
            }
            else if (odb.ColumnType == LinqDbTypes.int_)
            {
                if (val.IntVal < 0)
                {
                    odb.ColumnNumber *= -1;
                    val.IntVal        = -1 * val.IntVal;
                }
                var rn = NotEqualGeneric(odb, val, cache, ro);
                r = r.MyUnion(rn);
            }
            else if (odb.ColumnType == LinqDbTypes.string_)
            {
                var rn = NotEqualGeneric(odb, val, cache, ro);
                r = r.MyUnion(rn);
            }

            return(r);
        }
示例#4
0
        Oper FillOpData(Expression expr, List <ParameterExpression> pars, Type table_type)
        {
            var table_info = GetTableInfo(table_type.Name);
            var pname      = pars.First().Name;

            if (expr.NodeType == ExpressionType.Convert && !expr.ToString().StartsWith(pname))
            {
                throw new LinqDbException("Linqdb: Error in Where statement, probably type mismatch, for example int and int? are different types and both side of an expression must be of same type. Cast the right hand side's value.");
            }
            var column_name = SharedUtils.GetPropertyName(expr.ToString());
            var op          = new Oper()
            {
                Type         = expr.NodeType,
                ColumnName   = column_name,
                TableName    = table_info.Name,
                IsOperator   = false,
                IsDb         = true,
                TableNumber  = table_info.TableNumber,
                ColumnNumber = table_info.ColumnNumbers[column_name],
                ColumnType   = table_info.Columns[column_name]
            };

            return(op);
        }
示例#5
0
        public List <int> FindOneBetween(BetweenInfo bet, Dictionary <long, byte[]> cache, ReadOptions ro)
        {
            var result = new List <int>();

            var    skey           = MakeSnapshotKey(bet.TableNumber, bet.ColumnNumber);
            var    snapid         = leveld_db.Get(skey, null, ro);
            string snapshot_id    = null;
            string id_snapshot_id = null;

            if (snapid != null)
            {
                snapshot_id    = Encoding.UTF8.GetString(snapid);
                skey           = MakeSnapshotKey(bet.TableNumber, bet.IdNumber);
                snapid         = leveld_db.Get(skey, null, ro);
                id_snapshot_id = Encoding.UTF8.GetString(snapid);
                if (indexes.ContainsKey(bet.TableName + "|" + bet.ColumnName + "|" + snapshot_id))
                {
                    var op = new Oper()
                    {
                        ColumnNumber = bet.ColumnNumber,
                        ColumnType   = bet.ColumnType,
                        TableNumber  = bet.TableNumber,
                        ColumnName   = bet.ColumnName,
                        TableName    = bet.TableName
                    };

                    var val       = EncodeValue(op.ColumnType, bet.From);
                    var index_res = GreaterThanOperatorWithIndex(op, val, bet.BetweenBoundaries == BetweenBoundariesInternal.BothInclusive || bet.BetweenBoundaries == BetweenBoundariesInternal.FromInclusiveToExclusive, ro, snapshot_id, id_snapshot_id, bet.To, bet.BetweenBoundaries == BetweenBoundariesInternal.BothInclusive || bet.BetweenBoundaries == BetweenBoundariesInternal.FromExclusiveToInclusive);
                    return(index_res);
                }
            }

            if (bet.From >= 0 && bet.To >= 0)
            {
                var op = new Oper()
                {
                    ColumnNumber = bet.ColumnNumber,
                    ColumnType   = bet.ColumnType,
                    TableNumber  = bet.TableNumber,
                    ColumnName   = bet.ColumnName,
                    TableName    = bet.TableName
                };

                var val        = EncodeValue(op.ColumnType, bet.From);
                var result_tmp = GreaterThanOperator(op, val, bet.BetweenBoundaries == BetweenBoundariesInternal.BothInclusive || bet.BetweenBoundaries == BetweenBoundariesInternal.FromInclusiveToExclusive, cache, ro, snapshot_id, id_snapshot_id,
                                                     bet.To, bet.BetweenBoundaries == BetweenBoundariesInternal.BothInclusive || bet.BetweenBoundaries == BetweenBoundariesInternal.FromExclusiveToInclusive);
                result = result_tmp;
            }
            else if (bet.From < 0 && bet.To < 0)
            {
                var op = new Oper()
                {
                    ColumnNumber = (short)(-1 * bet.ColumnNumber),
                    ColumnType   = bet.ColumnType,
                    TableNumber  = bet.TableNumber,
                    TableName    = bet.TableName,
                    ColumnName   = bet.ColumnName
                };

                var val = EncodeValue(op.ColumnType, bet.To);
                if (val.Type == LinqDbTypes.double_)
                {
                    val.DoubleVal *= -1;
                }
                else if (val.Type == LinqDbTypes.int_)
                {
                    val.IntVal *= -1;
                }
                var result_tmp = GreaterThanOperator(op, val, bet.BetweenBoundaries == BetweenBoundariesInternal.BothInclusive || bet.BetweenBoundaries == BetweenBoundariesInternal.FromExclusiveToInclusive, cache, ro, snapshot_id, id_snapshot_id,
                                                     -1 * bet.From, bet.BetweenBoundaries == BetweenBoundariesInternal.BothInclusive || bet.BetweenBoundaries == BetweenBoundariesInternal.FromInclusiveToExclusive);
                result = result_tmp;
            }
            else
            {
                var op = new Oper()
                {
                    ColumnNumber = (short)(-1 * bet.ColumnNumber),
                    ColumnType   = bet.ColumnType,
                    TableNumber  = bet.TableNumber,
                    TableName    = bet.TableName,
                    ColumnName   = bet.ColumnName
                };

                var val        = EncodeValue(op.ColumnType, 0);
                var result_tmp = GreaterThanOperator(op, val, true, cache, ro, snapshot_id, id_snapshot_id,
                                                     -1 * bet.From, bet.BetweenBoundaries == BetweenBoundariesInternal.BothInclusive || bet.BetweenBoundaries == BetweenBoundariesInternal.FromInclusiveToExclusive);
                result = result_tmp;

                op = new Oper()
                {
                    ColumnNumber = bet.ColumnNumber,
                    ColumnType   = bet.ColumnType,
                    TableNumber  = bet.TableNumber,
                    TableName    = bet.TableName,
                    ColumnName   = bet.ColumnName
                };


                val = EncodeValue(op.ColumnType, 0);
                var result_pos = GreaterThanOperator(op, val, false, cache, ro, snapshot_id, id_snapshot_id,
                                                     bet.To, bet.BetweenBoundaries == BetweenBoundariesInternal.BothInclusive || bet.BetweenBoundaries == BetweenBoundariesInternal.FromExclusiveToInclusive);

                result = result.MyUnion(result_pos);
            }

            return(result);
        }
示例#6
0
        List <int> NotEqualGeneric(Oper odb, EncodedValue val, Dictionary <long, byte[]> cache, ReadOptions ro)
        {
            byte[] byte_val = null;
            if (val.IsNull)
            {
                byte_val = NullConstant;
            }
            else if (odb.ColumnType == LinqDbTypes.double_ || odb.ColumnType == LinqDbTypes.DateTime_)
            {
                byte_val = BitConverter.GetBytes(val.DoubleVal).MyReverseNoCopy();
            }
            else if ((odb.ColumnType == LinqDbTypes.int_))
            {
                byte_val = BitConverter.GetBytes(val.IntVal).MyReverseNoCopy();
            }
            else if ((odb.ColumnType == LinqDbTypes.string_))
            {
                byte_val = val.StringValue;
            }

            var result_set = new List <int>();
            var key        = MakeIndexSearchKey(new IndexKeyInfo()
            {
                ColumnNumber = odb.ColumnNumber,
                TableNumber  = odb.TableNumber,
                Val          = PreNull,
                ColumnType   = odb.ColumnType
            });

            using (var it = leveld_db.NewIterator(null, ro))
            {
                it.Seek(key);
                if (!it.Valid())
                {
                    return(result_set);
                }
                var v = it.Key();
                if (v == null)
                {
                    return(result_set);
                }
                var kinfo = GetIndexKey(v);
                if (kinfo.NotKey || kinfo.TableNumber != odb.TableNumber || kinfo.ColumnNumber != odb.ColumnNumber)
                {
                    return(result_set);
                }
                if (!ValsEqual(kinfo.Val, byte_val))
                {
                    result_set.Add(kinfo.Id);
                    //PutToCache(kinfo, cache);
                }

                while (true)
                {
                    it.Next();
                    if (!it.Valid())
                    {
                        return(result_set);
                    }
                    var ckey = it.Key();
                    if (ckey == null)
                    {
                        return(result_set);
                    }
                    kinfo = GetIndexKey(ckey);
                    if (kinfo.NotKey || kinfo.TableNumber != odb.TableNumber || kinfo.ColumnNumber != odb.ColumnNumber)
                    {
                        return(result_set);
                    }
                    if (!ValsEqual(kinfo.Val, byte_val))
                    {
                        result_set.Add(kinfo.Id);
                        //PutToCache(kinfo, cache);
                    }
                    else
                    {
                        continue;
                    }
                }
            }
        }
示例#7
0
        List <int> NotEqualOperatorWithIndex(Oper odb, EncodedValue val, ReadOptions ro, string snapshot_id, string id_snapshot_id)
        {
            List <int> result = new List <int>();

            if (string.IsNullOrEmpty(snapshot_id))
            {
                return(null);
            }
            if (string.IsNullOrEmpty(odb.TableName) || string.IsNullOrEmpty(odb.ColumnName))
            {
                throw new LinqDbException("Linqdb: bad indexes.");
            }
            if (!indexes.ContainsKey(odb.TableName + "|" + odb.ColumnName + "|" + snapshot_id))
            {
                return(null);
            }
            var index     = indexes[odb.TableName + "|" + odb.ColumnName + "|" + snapshot_id];
            var ids_index = indexes[odb.TableName + "|Id|" + id_snapshot_id];

            if (index.IndexType == IndexType.GroupOnly)
            {
                return(null);
            }

            switch (odb.ColumnType)
            {
            case LinqDbTypes.int_:
                if (val.IsNull)
                {
                    int icount = index.Parts.Count();
                    for (int i = 0; i < icount; i++)
                    {
                        var ids    = ids_index.Parts[i].IntValues;
                        var iv     = index.Parts[i].IntValues;
                        int jcount = iv.Count();
                        for (int j = 0; j < jcount; j++)
                        {
                            if (iv[j] != null)
                            {
                                result.Add((int)ids[j]);
                            }
                        }
                    }
                }
                else
                {
                    int icount = index.Parts.Count();
                    for (int i = 0; i < icount; i++)
                    {
                        var ids    = ids_index.Parts[i].IntValues;
                        var iv     = index.Parts[i].IntValues;
                        int jcount = iv.Count();
                        for (int j = 0; j < jcount; j++)
                        {
                            if (iv[j] != val.IntVal)
                            {
                                result.Add((int)ids[j]);
                            }
                        }
                    }
                }
                break;

            case LinqDbTypes.double_:
            case LinqDbTypes.DateTime_:
                if (val.IsNull)
                {
                    int icount = index.Parts.Count();
                    for (int i = 0; i < icount; i++)
                    {
                        var ids    = ids_index.Parts[i].IntValues;
                        var iv     = index.Parts[i].DoubleValues;
                        int jcount = iv.Count();
                        for (int j = 0; j < jcount; j++)
                        {
                            if (iv[j] != null)
                            {
                                result.Add((int)ids[j]);
                            }
                        }
                    }
                }
                else
                {
                    int icount = index.Parts.Count();
                    for (int i = 0; i < icount; i++)
                    {
                        var ids    = ids_index.Parts[i].IntValues;
                        var iv     = index.Parts[i].DoubleValues;
                        int jcount = iv.Count();
                        for (int j = 0; j < jcount; j++)
                        {
                            if (iv[j] != val.DoubleVal)
                            {
                                result.Add((int)ids[j]);
                            }
                        }
                    }
                }
                break;

            default:
                return(null);
            }

            return(result);
        }
示例#8
0
        public void ParseBinExpr(BinaryExpression expr, List <ParameterExpression> pars, Stack <Oper> stack, Type table_type)
        {
            var op = new Oper()
            {
                IsOperator = true,
                Type       = expr.NodeType
            };

            stack.Push(op);

            var left  = expr.Left;
            var right = expr.Right;

            if (left is BinaryExpression)
            {
                ParseBinExpr(left as BinaryExpression, pars, stack, table_type);
            }
            else
            {
                op = FillOpData(left, pars, table_type);
                stack.Push(op);
            }
            if (right is BinaryExpression)
            {
                ParseBinExpr(right as BinaryExpression, pars, stack, table_type);
            }
            else
            {
                try
                {
                    object tmp_val = null;
                    if (right is MemberExpression || right.NodeType == ExpressionType.Convert && (right as UnaryExpression).Operand is MemberExpression)
                    {
                        MemberExpression outerMember = null;
                        if (right is MemberExpression)
                        {
                            outerMember = (MemberExpression)right;
                        }
                        else
                        {
                            outerMember = (right as UnaryExpression).Operand as MemberExpression;
                        }
                        if (outerMember.Member is FieldInfo)
                        {
                            FieldInfo outerProp = (FieldInfo)outerMember.Member;
                            if (outerMember is MemberExpression && outerMember.Member is FieldInfo && (outerMember.Member as FieldInfo).IsStatic)
                            {
                                object source = null;
                                tmp_val = ((FieldInfo)outerMember.Member).GetValue(source);
                            }
                            else if (outerMember.Expression is MemberExpression)
                            {
                                MemberExpression   innerMember = (MemberExpression)outerMember.Expression;
                                FieldInfo          innerField  = (FieldInfo)innerMember.Member;
                                ConstantExpression ce          = (ConstantExpression)innerMember.Expression;
                                object             innerObj    = ce.Value;
                                object             outerObj    = innerField.GetValue(innerObj);
                                tmp_val = outerProp.GetValue(outerObj);
                            }
                            else if (outerMember.Expression is ConstantExpression)
                            {
                                var constantSelector = (ConstantExpression)outerMember.Expression;
                                tmp_val = ((FieldInfo)outerMember.Member).GetValue(constantSelector.Value);
                            }
                            else
                            {
                                throw new Exception("bad where");
                            }
                        }
                        else if (outerMember.Member is PropertyInfo)
                        {
                            PropertyInfo outerProp = (PropertyInfo)outerMember.Member;

                            if (outerMember.Expression is ConstantExpression)
                            {
                                tmp_val = (outerMember.Member as PropertyInfo).GetValue(((ConstantExpression)outerMember.Expression).Value);
                            }
                            else
                            {
                                MemberExpression   innerMember = (MemberExpression)outerMember.Expression;
                                FieldInfo          innerField  = (FieldInfo)innerMember.Member;
                                ConstantExpression ce          = (ConstantExpression)innerMember.Expression;
                                object             innerObj    = ce.Value;
                                object             outerObj    = innerField.GetValue(innerObj);
                                tmp_val = outerProp.GetValue(outerObj, null);
                            }
                        }
                        else
                        {
                            throw new Exception("bad where");
                        }
                    }
                    else if (right.NodeType == ExpressionType.Convert)
                    {
                        var operand = (right as UnaryExpression).Operand;
                        if (operand is ConstantExpression)
                        {
                            tmp_val = (operand as ConstantExpression).Value;
                        }
                        else
                        {
                            operand = (operand as UnaryExpression).Operand;
                            tmp_val = (operand as ConstantExpression).Value;
                        }
                    }
                    else if (right.NodeType == ExpressionType.Constant)
                    {
                        tmp_val = (right as ConstantExpression).Value;
                    }
                    else
                    {
                        throw new Exception("bad where");
                    }

                    if (right.NodeType == ExpressionType.MemberAccess || right.NodeType == ExpressionType.Constant || right.NodeType == ExpressionType.Convert)
                    {
                        op = new Oper()
                        {
                            IsDb       = false,
                            IsOperator = false,
                            NonDbValue = tmp_val
                        };
                        stack.Push(op);
                        return;
                    }
                    else
                    {
                        throw new Exception("bad where");
                    }

                    //op = FillOpData(right, pars, table_type);
                    //stack.Push(op);
                }
                catch (Exception ex)
                {
                    throw new LinqDbException("Linqdb: error in Where clause - on the right hand side of the operator there must be member access (first level) or variable or constant of the same type as left hand side.");
                }
            }
        }
示例#9
0
        List <int> GreaterThanOperatorWithIndex(Oper odb, EncodedValue val, bool is_equal, ReadOptions ro, string snapshot_id, string id_snapshot_id, double?stop_val = null, bool stop_equal = false)
        {
            List <int> result = new List <int>();

            if (string.IsNullOrEmpty(snapshot_id))
            {
                return(null);
            }
            if (string.IsNullOrEmpty(odb.TableName) || string.IsNullOrEmpty(odb.ColumnName))
            {
                throw new LinqDbException("Linqdb: bad indexes.");
            }
            if (!indexes.ContainsKey(odb.TableName + "|" + odb.ColumnName + "|" + snapshot_id))
            {
                return(null);
            }
            var index     = indexes[odb.TableName + "|" + odb.ColumnName + "|" + snapshot_id];
            var ids_index = indexes[odb.TableName + "|Id|" + id_snapshot_id];

            if (index.IndexType == IndexType.GroupOnly)
            {
                return(null);
            }

            switch (odb.ColumnType)
            {
            case LinqDbTypes.int_:
                if (val.IsNull)
                {
                    throw new LinqDbException("Linqdb: can't evaluate < null");
                }
                else
                {
                    int ival = val.IntVal;
                    if (!is_equal && stop_val == null)
                    {
                        int icount = index.Parts.Count();
                        for (int i = 0; i < icount; i++)
                        {
                            var ids    = ids_index.Parts[i].IntValues;
                            var iv     = index.Parts[i].IntValues;
                            int jcount = iv.Count();
                            for (int j = 0; j < jcount; j++)
                            {
                                if (ival < iv[j])
                                {
                                    result.Add((int)ids[j]);
                                }
                            }
                        }
                    }
                    else if (is_equal && stop_val == null)
                    {
                        int icount = index.Parts.Count();
                        for (int i = 0; i < icount; i++)
                        {
                            var ids    = ids_index.Parts[i].IntValues;
                            var iv     = index.Parts[i].IntValues;
                            int jcount = iv.Count();
                            for (int j = 0; j < jcount; j++)
                            {
                                if (ival <= iv[j])
                                {
                                    result.Add((int)ids[j]);
                                }
                            }
                        }
                    }
                    else if (!is_equal && stop_val != null)
                    {
                        int stop_val_int = (int)stop_val;
                        if (!stop_equal)
                        {
                            int icount = index.Parts.Count();
                            for (int i = 0; i < icount; i++)
                            {
                                var ids    = ids_index.Parts[i].IntValues;
                                var iv     = index.Parts[i].IntValues;
                                int jcount = iv.Count();
                                for (int j = 0; j < jcount; j++)
                                {
                                    if (ival < iv[j] && iv[j] < stop_val_int)
                                    {
                                        result.Add((int)ids[j]);
                                    }
                                }
                            }
                        }
                        else
                        {
                            int icount = index.Parts.Count();
                            for (int i = 0; i < icount; i++)
                            {
                                var ids    = ids_index.Parts[i].IntValues;
                                var iv     = index.Parts[i].IntValues;
                                int jcount = iv.Count();
                                for (int j = 0; j < jcount; j++)
                                {
                                    if (ival < iv[j] && iv[j] <= stop_val_int)
                                    {
                                        result.Add((int)ids[j]);
                                    }
                                }
                            }
                        }
                    }
                    else if (is_equal && stop_val != null)
                    {
                        int stop_val_int = (int)stop_val;
                        if (!stop_equal)
                        {
                            int icount = index.Parts.Count();
                            for (int i = 0; i < icount; i++)
                            {
                                var ids    = ids_index.Parts[i].IntValues;
                                var iv     = index.Parts[i].IntValues;
                                int jcount = iv.Count();
                                for (int j = 0; j < jcount; j++)
                                {
                                    if (ival <= iv[j] && iv[j] < stop_val_int)
                                    {
                                        result.Add((int)ids[j]);
                                    }
                                }
                            }
                        }
                        else
                        {
                            int icount = index.Parts.Count();
                            for (int i = 0; i < icount; i++)
                            {
                                var ids    = ids_index.Parts[i].IntValues;
                                var iv     = index.Parts[i].IntValues;
                                int jcount = iv.Count();
                                for (int j = 0; j < jcount; j++)
                                {
                                    if (ival <= iv[j] && iv[j] <= stop_val_int)
                                    {
                                        result.Add((int)ids[j]);
                                    }
                                }
                            }
                        }
                    }
                }
                break;

            case LinqDbTypes.double_:
            case LinqDbTypes.DateTime_:
                if (val.IsNull)
                {
                    throw new LinqDbException("Linqdb: can't evaluate < null");
                }
                else
                {
                    double dval = val.DoubleVal;
                    if (!is_equal && stop_val == null)
                    {
                        int icount = index.Parts.Count();
                        for (int i = 0; i < icount; i++)
                        {
                            var ids    = ids_index.Parts[i].IntValues;
                            var iv     = index.Parts[i].DoubleValues;
                            int jcount = iv.Count();
                            for (int j = 0; j < jcount; j++)
                            {
                                if (dval < iv[j])
                                {
                                    result.Add((int)ids[j]);
                                }
                            }
                        }
                    }
                    else if (is_equal && stop_val == null)
                    {
                        int icount = index.Parts.Count();
                        for (int i = 0; i < icount; i++)
                        {
                            var ids    = ids_index.Parts[i].IntValues;
                            var iv     = index.Parts[i].DoubleValues;
                            int jcount = iv.Count();
                            for (int j = 0; j < jcount; j++)
                            {
                                if (dval <= iv[j])
                                {
                                    result.Add((int)ids[j]);
                                }
                            }
                        }
                    }
                    else if (!is_equal && stop_val != null)
                    {
                        double stop_val_double = (double)stop_val;
                        if (!stop_equal)
                        {
                            int icount = index.Parts.Count();
                            for (int i = 0; i < icount; i++)
                            {
                                var ids    = ids_index.Parts[i].IntValues;
                                var iv     = index.Parts[i].DoubleValues;
                                int jcount = iv.Count();
                                for (int j = 0; j < jcount; j++)
                                {
                                    if (dval < iv[j] && iv[j] < stop_val_double)
                                    {
                                        result.Add((int)ids[j]);
                                    }
                                }
                            }
                        }
                        else
                        {
                            int icount = index.Parts.Count();
                            for (int i = 0; i < icount; i++)
                            {
                                var ids    = ids_index.Parts[i].IntValues;
                                var iv     = index.Parts[i].DoubleValues;
                                int jcount = iv.Count();
                                for (int j = 0; j < jcount; j++)
                                {
                                    if (dval < iv[j] && iv[j] <= stop_val_double)
                                    {
                                        result.Add((int)ids[j]);
                                    }
                                }
                            }
                        }
                    }
                    else if (is_equal && stop_val != null)
                    {
                        double stop_val_double = (double)stop_val;
                        if (!stop_equal)
                        {
                            int icount = index.Parts.Count();
                            for (int i = 0; i < icount; i++)
                            {
                                var ids    = ids_index.Parts[i].IntValues;
                                var iv     = index.Parts[i].DoubleValues;
                                int jcount = iv.Count();
                                for (int j = 0; j < jcount; j++)
                                {
                                    if (dval <= iv[j] && iv[j] < stop_val_double)
                                    {
                                        result.Add((int)ids[j]);
                                    }
                                }
                            }
                        }
                        else
                        {
                            int icount = index.Parts.Count();
                            for (int i = 0; i < icount; i++)
                            {
                                var ids    = ids_index.Parts[i].IntValues;
                                var iv     = index.Parts[i].DoubleValues;
                                int jcount = iv.Count();
                                for (int j = 0; j < jcount; j++)
                                {
                                    if (dval <= iv[j] && iv[j] <= stop_val_double)
                                    {
                                        result.Add((int)ids[j]);
                                    }
                                }
                            }
                        }
                    }
                }
                break;

            default:
                return(null);
            }

            return(result);
        }
示例#10
0
        List <int> GreaterThanOperator(Oper odb, EncodedValue val, bool is_equal, Dictionary <long, byte[]> cache, ReadOptions ro, string snapshot_id, string id_snapshot_id, double?stop_val = null, bool stop_equal = false)
        {
            var index_res = GreaterThanOperatorWithIndex(odb, val, is_equal, ro, snapshot_id, id_snapshot_id, stop_val, stop_equal);

            if (index_res != null)
            {
                return(index_res);
            }

            if (val.Type == LinqDbTypes.double_ && val.DoubleVal < 0 || val.Type == LinqDbTypes.DateTime_ && val.DoubleVal < 0 || val.Type == LinqDbTypes.int_ && val.IntVal < 0)
            {
                return(OperatorGetAll(odb, cache, ro));
            }
            else
            {
                var result_set = new List <int>();

                byte[] byte_val = null;
                if (val.IsNull)
                {
                    byte_val = NullConstant;
                }
                else if (odb.ColumnType == LinqDbTypes.double_ || odb.ColumnType == LinqDbTypes.DateTime_)
                {
                    byte_val = BitConverter.GetBytes(val.DoubleVal).MyReverseNoCopy();
                }
                else if ((odb.ColumnType == LinqDbTypes.int_))
                {
                    byte_val = BitConverter.GetBytes(val.IntVal).MyReverseNoCopy();
                }

                var key = MakeIndexSearchKey(new IndexKeyInfo()
                {
                    ColumnNumber = odb.ColumnNumber,
                    TableNumber  = odb.TableNumber,
                    Val          = byte_val,
                    ColumnType   = odb.ColumnType
                });
                using (var it = leveld_db.NewIterator(null, ro))
                {
                    it.Seek(key);
                    if (!it.Valid())
                    {
                        return(result_set);
                    }
                    var ck = it.Key();
                    if (ck == null)
                    {
                        return(result_set);
                    }
                    var kinfo = GetIndexKey(ck);
                    if (kinfo.NotKey || kinfo.TableNumber != odb.TableNumber || kinfo.ColumnNumber != odb.ColumnNumber)
                    {
                        return(result_set);
                    }

                    if (stop_val != null)
                    {
                        double cv = 0;
                        if (val.Type == LinqDbTypes.int_)
                        {
                            cv = BitConverter.ToInt32(kinfo.Val.MyReverseWithCopy(), 0);
                        }
                        if (val.Type == LinqDbTypes.double_ || val.Type == LinqDbTypes.DateTime_)
                        {
                            cv = BitConverter.ToDouble(kinfo.Val.MyReverseWithCopy(), 0);
                        }
                        if (cv == stop_val && !stop_equal || cv > stop_val)
                        {
                            return(result_set);
                        }
                    }

                    while (ValsEqual(kinfo.Val, byte_val))
                    {
                        if (is_equal)
                        {
                            result_set.Add(kinfo.Id);
                            //PutToCache(kinfo, cache);
                        }
                        it.Next();
                        if (!it.Valid())
                        {
                            return(result_set);
                        }
                        ck = it.Key();
                        if (ck == null)
                        {
                            return(result_set);
                        }
                        kinfo = GetIndexKey(ck);
                        if (kinfo.NotKey || kinfo.TableNumber != odb.TableNumber || kinfo.ColumnNumber != odb.ColumnNumber)
                        {
                            return(result_set);
                        }
                    }

                    if (stop_val != null)
                    {
                        double cv = 0;
                        if (val.Type == LinqDbTypes.int_)
                        {
                            cv = BitConverter.ToInt32(kinfo.Val.MyReverseWithCopy(), 0);
                        }
                        if (val.Type == LinqDbTypes.double_ || val.Type == LinqDbTypes.DateTime_)
                        {
                            cv = BitConverter.ToDouble(kinfo.Val.MyReverseWithCopy(), 0);
                        }
                        if (cv == stop_val && !stop_equal || cv > stop_val)
                        {
                            return(result_set);
                        }
                    }

                    result_set.Add(kinfo.Id);
                    //PutToCache(kinfo, cache);
                    while (true)
                    {
                        it.Next();
                        if (!it.Valid())
                        {
                            return(result_set);
                        }
                        ck = it.Key();
                        if (ck == null)
                        {
                            return(result_set);
                        }
                        kinfo = GetIndexKey(ck);
                        if (kinfo.NotKey || kinfo.TableNumber != odb.TableNumber || kinfo.ColumnNumber != odb.ColumnNumber)
                        {
                            return(result_set);
                        }

                        if (stop_val != null)
                        {
                            double cv = 0;
                            if (val.Type == LinqDbTypes.int_)
                            {
                                cv = BitConverter.ToInt32(kinfo.Val.MyReverseWithCopy(), 0);
                            }
                            if (val.Type == LinqDbTypes.double_ || val.Type == LinqDbTypes.DateTime_)
                            {
                                cv = BitConverter.ToDouble(kinfo.Val.MyReverseWithCopy(), 0);
                            }
                            if (cv == stop_val && !stop_equal || cv > stop_val)
                            {
                                return(result_set);
                            }
                        }

                        result_set.Add(kinfo.Id);
                        //PutToCache(kinfo, cache);
                    }
                }
            }
        }
示例#11
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));
            }
        }
示例#12
0
        List <int> EqualOperator(Oper odb, EncodedValue val, TableInfo table_info, Dictionary <long, byte[]> cache, ReadOptions ro, string snapshot_id, string id_snapshot_id)
        {
            if (!string.IsNullOrEmpty(snapshot_id))
            {
                var index_res = EqualOperatorWithIndex(odb, val, table_info, ro, snapshot_id, id_snapshot_id);
                if (index_res != null)
                {
                    return(index_res);
                }
            }
            byte[] byte_val = null;
            if (val.IsNull)
            {
                byte_val = NullConstant;
            }
            else if (odb.ColumnType == LinqDbTypes.double_ || odb.ColumnType == LinqDbTypes.DateTime_)
            {
                if (val.DoubleVal < 0)
                {
                    odb.ColumnNumber *= -1;
                    val.DoubleVal     = -1 * val.DoubleVal;
                }
                byte_val = BitConverter.GetBytes(val.DoubleVal).MyReverseNoCopy();
            }
            else if ((odb.ColumnType == LinqDbTypes.int_))
            {
                if (val.IntVal < 0)
                {
                    odb.ColumnNumber *= -1;
                    val.IntVal        = -1 * val.IntVal;
                }
                byte_val = BitConverter.GetBytes(val.IntVal).MyReverseNoCopy();
            }
            else if (odb.ColumnType == LinqDbTypes.string_)
            {
                byte_val = val.StringValue;
            }
            var result_set = new List <int>();
            var key        = MakeIndexSearchKey(new IndexKeyInfo()
            {
                ColumnNumber = odb.ColumnNumber,
                TableNumber  = odb.TableNumber,
                Val          = byte_val,
                ColumnType   = odb.ColumnType
            });

            using (var it = leveld_db.NewIterator(null, ro))
            {
                it.Seek(key);
                if (!it.Valid())
                {
                    return(result_set);
                }
                var v = it.Key();
                if (v == null)
                {
                    return(result_set);
                }
                var kinfo = GetIndexKey(v);
                if (kinfo.NotKey || kinfo.TableNumber != odb.TableNumber || kinfo.ColumnNumber != odb.ColumnNumber)
                {
                    return(result_set);
                }
                if (ValsEqual(kinfo.Val, byte_val))
                {
                    result_set.Add(kinfo.Id);
                    //PutToCache(kinfo, cache);
                    while (true)
                    {
                        it.Next();
                        if (!it.Valid())
                        {
                            return(result_set);
                        }
                        var ckey = it.Key();
                        if (ckey == null)
                        {
                            return(result_set);
                        }
                        kinfo = GetIndexKey(ckey);
                        if (kinfo.NotKey || kinfo.TableNumber != odb.TableNumber || kinfo.ColumnNumber != odb.ColumnNumber)
                        {
                            return(result_set);
                        }
                        if (ValsEqual(kinfo.Val, byte_val))
                        {
                            result_set.Add(kinfo.Id);
                            //PutToCache(kinfo, cache);
                        }
                        else
                        {
                            return(result_set);
                        }
                    }
                }

                return(result_set);
            }
        }
示例#13
0
文件: Intersect.cs 项目: ren85/linqdb
        List <int> IntersectWithIndex(Oper odb, List <EncodedValue> val, ReadOptions ro, string snapshot_id, string id_snapshot_id)
        {
            var result = new List <int>();

            if (string.IsNullOrEmpty(snapshot_id))
            {
                return(null);
            }
            if (string.IsNullOrEmpty(odb.TableName) || string.IsNullOrEmpty(odb.ColumnName))
            {
                throw new LinqDbException("Linqdb: bad indexes.");
            }
            if (!indexes.ContainsKey(odb.TableName + "|" + odb.ColumnName + "|" + snapshot_id))
            {
                return(null);
            }
            var index     = indexes[odb.TableName + "|" + odb.ColumnName + "|" + snapshot_id];
            var ids_index = indexes[odb.TableName + "|Id|" + id_snapshot_id];

            if (index.IndexType == IndexType.GroupOnly)
            {
                return(null);
            }
            int bloom_max = 1000000;

            switch (odb.ColumnType)
            {
            case LinqDbTypes.int_:
                HashSet <int> ivals     = new HashSet <int>(val.Where(f => !f.IsNull).Select(f => f.IntVal));
                List <bool>   bloom_int = new List <bool>(bloom_max);

                for (int i = 0; i < bloom_max; i++)
                {
                    bloom_int.Add(false);
                }
                foreach (var int_val in ivals)
                {
                    bloom_int[int_val % bloom_max] = true;
                }

                int icount = index.Parts.Count();
                for (int i = 0; i < icount; i++)
                {
                    var ids    = ids_index.Parts[i].IntValues;
                    var iv     = index.Parts[i].IntValues;
                    int jcount = iv.Count();
                    for (int j = 0; j < jcount; j++)
                    {
                        int id = ids[j];
                        if (bloom_int[iv[j] % bloom_max])
                        {
                            if (ivals.Contains(iv[j]))
                            {
                                result.Add(id);
                            }
                        }
                    }
                }
                break;

            case LinqDbTypes.double_:
            case LinqDbTypes.DateTime_:
                HashSet <double> dvals        = new HashSet <double>(val.Where(f => !f.IsNull).Select(f => f.DoubleVal));
                List <bool>      bloom_double = new List <bool>(bloom_max);
                for (int i = 0; i < bloom_max; i++)
                {
                    bloom_double.Add(false);
                }
                foreach (var d_val in dvals)
                {
                    bloom_double[Math.Abs(d_val.GetHashCode()) % bloom_max] = true;
                }
                int dcount = index.Parts.Count();
                for (int i = 0; i < dcount; i++)
                {
                    var ids    = ids_index.Parts[i].IntValues;
                    var iv     = index.Parts[i].DoubleValues;
                    int jcount = iv.Count();
                    for (int j = 0; j < jcount; j++)
                    {
                        int id = ids[j];
                        if (bloom_double[Math.Abs(iv[j].GetHashCode()) % bloom_max])
                        {
                            if (dvals.Contains(iv[j]))
                            {
                                result.Add(id);
                            }
                        }
                    }
                }
                break;

            default:
                return(null);
            }

            return(result);
        }
示例#14
0
文件: Intersect.cs 项目: ren85/linqdb
        public List <int> IntersectOne(IntersectInfo info, TableInfo table_info, Dictionary <long, byte[]> cache, ReadOptions ro)
        {
            var result = new List <int>();


            //if (info.Set.Count() > 50)
            //{
            Oper odb = new Oper()
            {
                TableNumber  = info.TableNumber,
                ColumnType   = info.ColumnType,
                ColumnNumber = info.ColumnNumber,
                ColumnName   = table_info.ColumnNumbers.First(f => f.Value == info.ColumnNumber).Key,
                TableName    = table_info.Name
            };

            var skey   = MakeSnapshotKey(table_info.TableNumber, table_info.ColumnNumbers[odb.ColumnName]);
            var snapid = leveld_db.Get(skey, null, ro);

            if (snapid != null)
            {
                var snapshot_id = Encoding.UTF8.GetString(snapid);
                skey   = MakeSnapshotKey(table_info.TableNumber, table_info.ColumnNumbers["Id"]);
                snapid = leveld_db.Get(skey, null, ro);
                string id_snapshot_id = Encoding.UTF8.GetString(snapid);

                var index_res = IntersectWithIndex(odb, info.Set, ro, snapshot_id, id_snapshot_id);
                if (index_res != null)
                {
                    return(index_res);
                }
            }

            foreach (var val in info.Set)
            {
                Oper odb2 = new Oper()
                {
                    TableNumber  = info.TableNumber,
                    ColumnType   = info.ColumnType,
                    ColumnNumber = info.ColumnNumber,
                    ColumnName   = table_info.ColumnNumbers.First(f => f.Value == info.ColumnNumber).Key,
                    TableName    = table_info.Name
                };
                result.AddRange(EqualOperator(odb2, val, table_info, cache, ro, null, null));
            }

            return(result);
            //}

            //foreach (var val in info.Set)
            //{
            //    Oper odb = new Oper()
            //    {
            //        TableNumber = info.TableNumber,
            //        ColumnType = info.ColumnType,
            //        ColumnNumber = info.ColumnNumber,
            //        ColumnName = table_info.ColumnNumbers.First(f => f.Value == info.ColumnNumber).Key,
            //        TableName = table_info.Name
            //    };
            //    result.AddRange(EqualOperator(odb, val, table_info, cache, ro, null, null));
            //}

            //return result;
        }
示例#15
0
        List <int> LessThanOperator(Oper odb, EncodedValue val, bool or_equal, Dictionary <long, byte[]> cache, ReadOptions ro, string snapshot_id, string id_snapshot_id)
        {
            if (!string.IsNullOrEmpty(snapshot_id))
            {
                var index_res = LessThanOperatorWithIndex(odb, val, or_equal, ro, snapshot_id, id_snapshot_id);
                if (index_res != null)
                {
                    return(index_res);
                }
            }

            var result_set = new List <int>();

            if (val.Type == LinqDbTypes.double_ && val.DoubleVal < 0 || val.Type == LinqDbTypes.DateTime_ && val.DoubleVal < 0 || val.Type == LinqDbTypes.int_ && val.IntVal < 0)
            {
                return(result_set);
            }
            else
            {
                byte[] byte_val = null;
                if (val.IsNull)
                {
                    byte_val = NullConstant;
                }
                else if (odb.ColumnType == LinqDbTypes.double_ || odb.ColumnType == LinqDbTypes.DateTime_)
                {
                    byte_val = BitConverter.GetBytes(val.DoubleVal).MyReverseNoCopy();
                }
                else if ((odb.ColumnType == LinqDbTypes.int_))
                {
                    byte_val = BitConverter.GetBytes(val.IntVal).MyReverseNoCopy();
                }

                using (var it = leveld_db.NewIterator(null, ro))
                {
                    var pkey = MakeIndexKey(new IndexKeyInfo()
                    {
                        TableNumber  = odb.TableNumber,
                        ColumnNumber = odb.ColumnNumber,
                        Val          = PostNullConstantPreEverythingElse,
                        ColumnType   = odb.ColumnType
                    });
                    it.Seek(pkey); //skip null values

                    if (!it.Valid())
                    {
                        return(result_set);
                    }
                    var v = it.Key();
                    if (v == null)
                    {
                        return(result_set);
                    }
                    var kinfo = GetIndexKey(v);
                    if (kinfo.NotKey || kinfo.TableNumber != odb.TableNumber || kinfo.ColumnNumber != odb.ColumnNumber)
                    {
                        return(result_set);
                    }

                    if (ValGreater(byte_val, kinfo.Val) || (or_equal && ValsEqual(kinfo.Val, byte_val)))
                    {
                        result_set.Add(kinfo.Id);
                        //PutToCache(kinfo, cache);
                        while (true)
                        {
                            it.Next();
                            if (!it.Valid())
                            {
                                return(result_set);
                            }
                            var ckey = it.Key();
                            if (ckey == null)
                            {
                                return(result_set);
                            }
                            kinfo = GetIndexKey(ckey);
                            if (kinfo.NotKey || kinfo.TableNumber != odb.TableNumber || kinfo.ColumnNumber != odb.ColumnNumber)
                            {
                                return(result_set);
                            }
                            if (ValGreater(byte_val, kinfo.Val) || (or_equal && ValsEqual(kinfo.Val, byte_val)))
                            {
                                result_set.Add(kinfo.Id);
                                //PutToCache(kinfo, cache);
                            }
                            else
                            {
                                return(result_set);
                            }
                        }
                    }
                }

                return(result_set);
            }
        }