/// <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]))); }
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()); }
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?"); }
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); }
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(); }