IDbQueryable <T> Intersect <T, TKey>(IDbQueryable <T> source, Expression <Func <T, TKey> > keySelector, List <EncodedValue> set, Dictionary <long, byte[]> cache) { if (source.LDBTree == null) { source.LDBTree = new QueryTree(); } var tree = source.LDBTree; if (tree.IntersectInfo == null) { tree.IntersectInfo = new List <IntersectInfo>(); } var info = new IntersectInfo(); tree.IntersectInfo.Add(info); info.Set = set; string name = "Id"; if (keySelector != null) { var par = keySelector.Parameters.First(); name = SharedUtils.GetPropertyName(keySelector.Body.ToString()); } var table_info = GetTableInfo(typeof(T).Name); info.TableNumber = table_info.TableNumber; info.ColumnNumber = table_info.ColumnNumbers[name]; info.ColumnType = table_info.Columns[name]; source.LDBTree.Prev = info; source.LDBTree.Prev.Id = source.LDBTree.Counter + 1; source.LDBTree.Counter++; return(source); }
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; }