private void CheckDecode()
 {
     if (!decoded)
     {
         if (EncodedValue == null)
         {
             value = null;
         }
         else
         {
             var v = EncodedValue.DecodeAsString();
             if (v.Length == 0)
             {
                 value = null;
             }
             else if (typeof(T) == typeof(string))
             {
                 value = v as T;
             }
             else
             {
                 value = JsonConvert.DeserializeObject <T>(v);
             }
         }
         decoded = true;
     }
 }
Beispiel #2
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));
            }
        }
Beispiel #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);
        }
Beispiel #4
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;
                    }
                }
            }
        }
Beispiel #5
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);
        }
Beispiel #6
0
        private object ConvertField(EncodedValue value, Class currentClass)
        {
            switch (value.EncodedType)
            {
            case EncodedValueType.VALUE_BYTE:
                return(((EncodedNumber)value).AsByte());

            case EncodedValueType.VALUE_NULL:
                return(null);

            case EncodedValueType.VALUE_BOOLEAN:
                return(((EncodedNumber)value).AsBoolean());

            case EncodedValueType.VALUE_SHORT:
                return(((EncodedNumber)value).AsShort());

            case EncodedValueType.VALUE_CHAR:
                return(((EncodedNumber)value).AsChar());

            case EncodedValueType.VALUE_INT:
                return(((EncodedNumber)value).AsInt());

            case EncodedValueType.VALUE_LONG:
                return(((EncodedNumber)value).AsLong());

            case EncodedValueType.VALUE_FLOAT:
                return(((EncodedNumber)value).AsFloat());

            case EncodedValueType.VALUE_DOUBLE:
                return(((EncodedNumber)value).AsDouble());

            case EncodedValueType.VALUE_STRING:
                return(String.Format("\"{0}\"", runningApp.dex.GetString(((EncodedNumber)value).AsId()).Replace("\n", "\\n")));

            case EncodedValueType.VALUE_TYPE:
                return(runningApp.dex.GetTypeName(((EncodedNumber)value).AsId()));

            case EncodedValueType.VALUE_FIELD:
            case EncodedValueType.VALUE_ENUM:
                return(edw.GetFieldName(((EncodedNumber)value).AsId(), currentClass, true));

            case EncodedValueType.VALUE_METHOD:
                return(runningApp.dex.GetMethod(((EncodedNumber)value).AsId()));

            //return string.Format("{0}.{1}", runningApp.dex.GetTypeName(method.ClassIndex), method.Name);

            case EncodedValueType.VALUE_ARRAY:
                var      encodedArray = (EncodedArray)value;
                object[] array        = new object[(int)encodedArray.Count];

                int i = 0;
                foreach (var arrayValue in encodedArray.GetValues())
                {
                    //array.Add(ConvertField(arrayValue, currentClass));
                    array[i] = ConvertField(arrayValue, currentClass);
                    i++;
                }
                return(array);

            //return string.Format("[{0}]", string.Join(",", array));

            case EncodedValueType.VALUE_ANNOTATION:
                //Not sure when/if this is used
                var stringAnnotation = new StringWriter();
                edw.AnnotationToString(stringAnnotation, (EncodedAnnotation)value, currentClass, new Indentation());
                return(stringAnnotation);
            }

            return("Unknown");
        }
Beispiel #7
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);
        }
Beispiel #8
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);
                    }
                }
            }
        }
Beispiel #9
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);
            }
        }
Beispiel #10
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);
            }
        }