public IEnumerable<ListItem> Read(string name, Guid start, int take) { Api.JetSetCurrentIndex(session, Lists, "by_name_and_etag"); Api.MakeKey(session, Lists, name, Encoding.Unicode, MakeKeyGrbit.NewKey); Api.MakeKey(session, Lists, start.TransformToValueForEsentSorting(), MakeKeyGrbit.None); if (Api.TrySeek(session, Lists, SeekGrbit.SeekGT) == false) yield break; int count = 0; do { var nameFromDb = Api.RetrieveColumnAsString(session, Lists, tableColumnsCache.ListsColumns["name"], Encoding.Unicode); if(string.Equals(name, nameFromDb, StringComparison.InvariantCultureIgnoreCase) == false) yield break; count++; var etag = Api.RetrieveColumn(session, Lists, tableColumnsCache.ListsColumns["etag"]).TransfromToGuidWithProperSorting(); using (Stream stream = new BufferedStream(new ColumnStream(session, Lists, tableColumnsCache.ListsColumns["data"]))) { yield return new ListItem { Etag = etag, Data = stream.ToJObject(), Key = Api.RetrieveColumnAsString(session, Lists, tableColumnsCache.ListsColumns["key"], Encoding.Unicode) }; } } while (Api.TryMoveNext(session, Lists) && count < take); }
public IEnumerable<RavenJObject> GetMappedResults(params GetMappedResultsParams[] getMappedResultsParams) { var optimizedIndexReader = new OptimizedIndexReader<GetMappedResultsParams>(Session, MappedResults, getMappedResultsParams.Length); Api.JetSetCurrentIndex(session, MappedResults, "by_reduce_key_and_view_hashed"); foreach (var item in getMappedResultsParams) { Api.MakeKey(session, MappedResults, item.ViewAndReduceKeyHashed, MakeKeyGrbit.NewKey); if (Api.TrySeek(session, MappedResults, SeekGrbit.SeekEQ) == false) continue; Api.MakeKey(session, MappedResults, item.ViewAndReduceKeyHashed, MakeKeyGrbit.NewKey); Api.JetSetIndexRange(session, MappedResults, SetIndexRangeGrbit.RangeUpperLimit | SetIndexRangeGrbit.RangeInclusive); do { optimizedIndexReader.Add(item); } while (Api.TryMoveNext(session, MappedResults)); } return optimizedIndexReader .Where(item => { // we need to check that we don't have hash collisions var currentReduceKey = Api.RetrieveColumnAsString(session, MappedResults, tableColumnsCache.MappedResultsColumns["reduce_key"]); if (currentReduceKey != item.ReduceKey) return false; var currentView = Api.RetrieveColumnAsString(session, MappedResults, tableColumnsCache.MappedResultsColumns["view"]); return currentView == item.View; }) .Select(item => { using (var stream = new BufferedStream(new ColumnStream(session, MappedResults, tableColumnsCache.MappedResultsColumns["data"]))) { return stream.ToJObject(); } }); }
public ListItem ReadLast(string name) { Api.JetSetCurrentIndex(session, Lists, "by_name_and_etag"); Api.MakeKey(session, Lists, name, Encoding.Unicode, MakeKeyGrbit.NewKey); Api.MakeKey(session, Lists, Etag.InvalidEtag.TransformToValueForEsentSorting(), MakeKeyGrbit.None); if (Api.TrySeek(session, Lists, SeekGrbit.SeekLE) == false) return null; var nameFromDb = Api.RetrieveColumnAsString(session, Lists, tableColumnsCache.ListsColumns["name"], Encoding.Unicode); if (string.Equals(name, nameFromDb, StringComparison.InvariantCultureIgnoreCase) == false) return null; using (Stream stream = new BufferedStream(new ColumnStream(session, Lists, tableColumnsCache.ListsColumns["data"]))) { return new ListItem { Data = stream.ToJObject(), Key = Api.RetrieveColumnAsString(session, Lists, tableColumnsCache.ListsColumns["key"], Encoding.Unicode), Etag = Etag.Parse(Api.RetrieveColumn(session, Lists, tableColumnsCache.ListsColumns["etag"])), CreatedAt = Api.RetrieveColumnAsDateTime(session, Lists, tableColumnsCache.ListsColumns["created_at"]).Value }; } }
public ListItem Read(string name, string key) { Api.JetSetCurrentIndex(session, Lists, "by_name_and_key"); Api.MakeKey(session, Lists, name, Encoding.Unicode, MakeKeyGrbit.NewKey); Api.MakeKey(session, Lists, key, Encoding.Unicode, MakeKeyGrbit.None); if (Api.TrySeek(session, Lists, SeekGrbit.SeekEQ) == false) return null; using (Stream stream = new BufferedStream(new ColumnStream(session, Lists, tableColumnsCache.ListsColumns["data"]))) { return new ListItem { Data = stream.ToJObject(), Key = Api.RetrieveColumnAsString(session, Lists, tableColumnsCache.ListsColumns["key"], Encoding.Unicode), Etag = Etag.Parse(Api.RetrieveColumn(session, Lists, tableColumnsCache.ListsColumns["etag"])), CreatedAt = Api.RetrieveColumnAsDateTime(session, Lists, tableColumnsCache.ListsColumns["created_at"]).Value }; } }
public IEnumerable<ListItem> Read(string name, int start, int take) { Api.JetSetCurrentIndex(session, Lists, "by_name_and_etag"); Api.MakeKey(session, Lists, name, Encoding.Unicode, MakeKeyGrbit.NewKey); if (Api.TrySeek(session, Lists, SeekGrbit.SeekGT) == false) yield break; int skipped = 0; while (skipped < start) { if (!Api.TryMoveNext(session, Lists)) yield break; skipped++; } int count = 0; do { var nameFromDb = Api.RetrieveColumnAsString(session, Lists, tableColumnsCache.ListsColumns["name"], Encoding.Unicode); if (string.Equals(name, nameFromDb, StringComparison.InvariantCultureIgnoreCase) == false) yield break; var etag = Etag.Parse(Api.RetrieveColumn(session, Lists, tableColumnsCache.ListsColumns["etag"])); count++; using (Stream stream = new BufferedStream(new ColumnStream(session, Lists, tableColumnsCache.ListsColumns["data"]))) { yield return new ListItem { Etag = etag, Data = stream.ToJObject(), Key = Api.RetrieveColumnAsString(session, Lists, tableColumnsCache.ListsColumns["key"], Encoding.Unicode), CreatedAt = Api.RetrieveColumnAsDateTime(session, Lists, tableColumnsCache.ListsColumns["created_at"]).Value }; } } while (Api.TryMoveNext(session, Lists) && count < take); }
public IEnumerable<RavenJObject> GetMappedResults(params GetMappedResultsParams[] getMappedResultsParams) { // optimized according to this: http://managedesent.codeplex.com/discussions/274843#post680337 var primaryKeyIndexes = new List<Tuple<byte[], GetMappedResultsParams>>(); Api.JetSetCurrentIndex(session, MappedResults, "by_reduce_key_and_view_hashed"); foreach (var item in getMappedResultsParams) { Api.MakeKey(session, MappedResults, item.ViewAndReduceKeyHashed, MakeKeyGrbit.NewKey); if (Api.TrySeek(session, MappedResults, SeekGrbit.SeekEQ) == false) continue; var bookmarkBuffer = new byte[SystemParameters.BookmarkMost]; var ignoredBuffer = new byte[SystemParameters.BookmarkMost]; Api.MakeKey(session, MappedResults, item.ViewAndReduceKeyHashed, MakeKeyGrbit.NewKey); Api.JetSetIndexRange(session, MappedResults, SetIndexRangeGrbit.RangeUpperLimit | SetIndexRangeGrbit.RangeInclusive); do { int actualBookmarkSize; int ignored; Api.JetGetSecondaryIndexBookmark(session, MappedResults, ignoredBuffer, ignoredBuffer.Length, out ignored, bookmarkBuffer, bookmarkBuffer.Length, out actualBookmarkSize, GetSecondaryIndexBookmarkGrbit.None); primaryKeyIndexes.Add(Tuple.Create(bookmarkBuffer.Take(actualBookmarkSize).ToArray(), item)); } while (Api.TryMoveNext(session, MappedResults)); } primaryKeyIndexes.Sort((x, y) => { var bytes1 = x.Item1; var bytes2 = y.Item1; for (int i = 0; i < Math.Min(bytes1.Length, bytes2.Length); i++) { if (bytes1[i] != bytes2[i]) return bytes1[i] - bytes2[i]; } return bytes1.Length - bytes2.Length; }); foreach (var primaryKeyIndexTuple in primaryKeyIndexes) { var bookmark = primaryKeyIndexTuple.Item1; var item = primaryKeyIndexTuple.Item2; Api.JetGotoBookmark(session, MappedResults, bookmark, bookmark.Length); // we need to check that we don't have hash collisions var currentReduceKey = Api.RetrieveColumnAsString(session, MappedResults, tableColumnsCache.MappedResultsColumns["reduce_key"]); if (currentReduceKey != item.ReduceKey) continue; var currentView = Api.RetrieveColumnAsString(session, MappedResults, tableColumnsCache.MappedResultsColumns["view"]); if (currentView != item.View) continue; RavenJObject obj; using(var stream = new BufferedStream(new ColumnStream(session, MappedResults, tableColumnsCache.MappedResultsColumns["data"]))) { obj = stream.ToJObject(); } yield return obj; } }