Esempio n. 1
0
        /// <summary>
        /// Получение триплетов из диапазона, соответствующих заданному второму ключу
        /// </summary>
        /// <param name="dia">Диапазон в индексном массиве. Есть специальные требования к диапазону</param>
        /// <param name="key2">Ключ2 по которому фильтруется результарующее множество</param>
        /// <returns>Возвращает поток триплетов в объектной форме</returns>
        public IEnumerable <object> GetAllInDiap(Diapason dia, Tkey key2)
        {
            if (dia.IsEmpty())
            {
                return(Enumerable.Empty <object>());
            }
            int     hkey   = Half2Producer(key2);
            PaEntry entry  = Table.Element(0);
            var     query1 = index_cell.Root.BinarySearchAll(dia.start, dia.numb, ent =>
            {
                object[] va = (object[])ent.Get();
                int hk      = (int)va[2];
                int cmp     = hk.CompareTo(hkey);
                return(cmp);
            }).Select(ent => ent.Get())
                             .Where(va => (int)((object[])va)[2] == hkey);
            var query2 = index_cell.Root.ElementValues(dia.start, dia.numb)
                         .Where(va => (int)((object[])va)[2] == hkey);
            IEnumerable <object> query = dia.numb > 30 ? query1 : query2;

            return(query
                   .Select(va =>
            {
                long off = (long)((object[])va)[0];
                entry.offset = off;
                return entry.Get();
            })
                   .Where(two => !(bool)((object[])two)[0] && Key2Producer(two).CompareTo(key2) == 0)
                   .Select(two => ((object[])((object[])two)[1])));
        }
Esempio n. 2
0
        public int[] GetAllPrimaryByExternal(int exindnom, int exkey)
        {
            //TODO: нет концепции динамики для внешних индексов, тут должо быть решение
            if (exindexes == null || exindexes.Length <= exindnom)
            {
                throw new Exception("Err: 2983883");
            }
            var exindx = exindexes[exindnom];

            // Будут объединены результаты выборки из словаря и выборки из статического индекса
            List <int> frdic;

            int[] res;
            if (exindx.ekey_idlist.TryGetValue(exkey, out frdic))
            {
                res = frdic.ToArray();
            }
            else
            {
                res = new int[0];
            }

            if (exindx.GetDia == null)
            {
                return(res);
            }
            Diapason d = exindx.GetDia(exkey);

            if (d.IsEmpty())
            {
                return(res);
            }
            int start  = (int)d.start;
            int finish = start + (int)d.numb;

            for (; start < finish; start++)
            {
                if (exindx.key_arr[start] == exkey)
                {
                    break;
                }
            }
            if (start == finish)
            {
                return(res);
            }
            for (; finish > start; finish--)
            {
                if (exindx.key_arr[finish - 1] == exkey)
                {
                    break;
                }
            }
            //var query = exindx.prikeys.Root.ElementValues(start, finish - start).Cast<int>();
            var query = Enumerable.Range(start, finish - start).Select(i => exindx.exprikeys.ElementOffset(i))
                        .Select(off => ((object[])exindx.exprikeys.GetElement(off))[1]).Cast <int>();

            return(res.Concat(query).ToArray());
        }
Esempio n. 3
0
        public static void Main8_1()
        {
            int max = 1000000;

            int[] arr = Enumerable.Range(1, max).ToArray();
            var   Dia = GetDiaFunc2(arr);

            foreach (int key in arr)
            {
                Diapason di = Dia(key);
                if (di.IsEmpty())
                {
                    Console.WriteLine($"no dia for {key}");
                }
                int start = (int)di.start;
                int numb  = (int)di.numb;

                int found = -1;
                for (int i = start; i < start + numb || i < arr.Length; i++)
                {
                    if (arr[i] == key)
                    {
                        found = i; break;
                    }
                }
                if (found == -1)
                {
                    Console.WriteLine($"not found for {key}: start={start} numb={numb}");
                }

                int ind = Program.Get8FirstIndexOf(start, numb, arr, key);
                if (ind == -1)
                {
                    Console.WriteLine($"no ind for key {key}");
                    int ind2 = Program.Get8FirstIndexOf(start, numb, arr, key);
                }
                else
                {
                    int keyval = arr[ind];
                    if (keyval != key)
                    {
                        Console.WriteLine($"bad result index {ind} {keyval} for {key}");
                    }
                }
            }
            Console.WriteLine("ok?");
        }
Esempio n. 4
0
        public IEnumerable <object> GetAllInDiap(Diapason dia)
        {
            if (dia.IsEmpty())
            {
                return(Enumerable.Empty <object>());
            }
            PaEntry entry = Table.Element(0);

            var query2 = index_cell.Root.ElementValues(dia.start, dia.numb)
                         .Select(va =>
            {
                long off     = (long)((object[])va)[0];
                entry.offset = off;
                return(entry.Get());
            })
                         .Where(two => !(bool)((object[])two)[0])
                         .Select(two => ((object[])((object[])two)[1]));

            return(query2);
        }
Esempio n. 5
0
        public bool CheckPredObjInDiap(Diapason di, int pred, int obj)
        {
            Diapason set = otriples.Root.BinarySearchDiapason(di.start, di.numb, ent =>
            {
                int cmp = ((int)ent.Field(1).Get()).CompareTo(pred);
                if (cmp != 0)
                {
                    return(cmp);
                }
                return(((int)ent.Field(2).Get()).CompareTo(obj));
            });

            return(!set.IsEmpty());
            //var query = otriples.Root.BinarySearchAll(di.start, di.numb, ent =>
            //    {
            //        int cmp = ((int)ent.Field(1).Get()).CompareTo(pred);
            //        if (cmp != 0) return cmp;
            //        return ((int)ent.Field(2).Get()).CompareTo(obj);
            //    });
            //return query.Any();
        }