private IEnumerable<MappedResultInfo> GetReducedResultsForBucket(string index, string reduceKey, int level, int bucket, bool loadData) { var results = storage.ReduceResults["ByViewReduceKeyLevelAndBucket"] .SkipTo(new RavenJObject { {"view", index}, {"reduceKey", reduceKey}, {"level", level}, {"bucket", bucket} }) .TakeWhile(x => string.Equals(index, x.Value<string>("view"), StringComparison.InvariantCultureIgnoreCase) && string.Equals(reduceKey, x.Value<string>("reduceKey"), StringComparison.InvariantCultureIgnoreCase) && level == x.Value<int>("level") && bucket == x.Value<int>("bucket")); bool hasResults = false; foreach (var result in results) { hasResults = true; var readResult = storage.ReduceResults.Read(result); var mappedResultInfo = new MappedResultInfo { ReduceKey = readResult.Key.Value<string>("reduceKey"), Etag = new Guid(readResult.Key.Value<byte[]>("etag")), Timestamp = readResult.Key.Value<DateTime>("timestamp"), Bucket = readResult.Key.Value<int>("bucket"), Source = readResult.Key.Value<int>("sourceBucket").ToString(), Size = readResult.Size, Data = loadData ? LoadMappedResult(readResult) : null }; yield return mappedResultInfo; } if (hasResults) yield break; yield return new MappedResultInfo { Bucket = bucket, ReduceKey = reduceKey }; }
public IEnumerable<MappedResultInfo> GetMappedResultsReduceKeysAfter(string indexName, Guid lastReducedEtag, bool loadData, int take) { Api.JetSetCurrentIndex(session, MappedResults, "by_view_and_etag"); Api.MakeKey(session, MappedResults, indexName, Encoding.Unicode, MakeKeyGrbit.NewKey); Api.MakeKey(session, MappedResults, lastReducedEtag, MakeKeyGrbit.None); if (Api.TrySeek(session, MappedResults, SeekGrbit.SeekLE) == false) return Enumerable.Empty<MappedResultInfo>(); var results = new Dictionary<string, MappedResultInfo>(); while ( results.Count < take && Api.RetrieveColumnAsString(session, MappedResults, tableColumnsCache.MappedResultsColumns["view"], Encoding.Unicode, RetrieveColumnGrbit.RetrieveFromIndex) == indexName) { var key = Api.RetrieveColumnAsString(session, MappedResults, tableColumnsCache.MappedResultsColumns["reduce_key"]); var mappedResultInfo = new MappedResultInfo { ReduceKey = key, Etag = new Guid(Api.RetrieveColumn(session, MappedResults, tableColumnsCache.MappedResultsColumns["etag"])), Timestamp = Api.RetrieveColumnAsDateTime(session, MappedResults, tableColumnsCache.MappedResultsColumns["timestamp"]). Value, Data = loadData ? LoadMappedResults(key) : null, Size = Api.RetrieveColumnSize(session, MappedResults, tableColumnsCache.MappedResultsColumns["data"]) ?? 0 }; results[mappedResultInfo.ReduceKey] = mappedResultInfo; // the index is view ascending and etag descending // that means that we are going backward to go up if (Api.TryMovePrevious(session, MappedResults) == false) break; } return results.Values; }
public IEnumerable<MappedResultInfo> GetMappedResultsReduceKeysAfter(string indexName, Guid lastReducedEtag, bool loadData, int take) { var mappedResultInfos = storage.MappedResults["ByViewAndEtagDesc"] // the index is sorted view ascending and then etag descending // we index before this index, then backward toward the last one. .SkipBefore(new RavenJObject { { "view", indexName }, { "etag", lastReducedEtag.ToByteArray() } }) .TakeWhile(x => StringComparer.InvariantCultureIgnoreCase.Equals(x.Value<string>("view"), indexName)) .Select(key => { var mappedResultInfo = new MappedResultInfo { ReduceKey = key.Value<string>("reduceKey"), Etag = new Guid(key.Value<byte[]>("etag")), Timestamp = key.Value<DateTime>("timestamp") }; var readResult = storage.MappedResults.Read(key); if (readResult != null) { mappedResultInfo.Size = readResult.Size; if (loadData) mappedResultInfo.Data = LoadMappedResult(readResult); } return mappedResultInfo; }); var results = new Dictionary<string, MappedResultInfo>(); foreach (var mappedResultInfo in mappedResultInfos) { results[mappedResultInfo.ReduceKey] = mappedResultInfo; if (results.Count == take) break; } return results.Values; }
public IEnumerable<MappedResultInfo> GetMappedResultsReduceKeysAfter(string indexName, Guid lastReducedEtag, bool loadData) { Api.JetSetCurrentIndex(session, MappedResults, "by_view_and_etag"); Api.MakeKey(session, MappedResults, indexName, Encoding.Unicode, MakeKeyGrbit.NewKey); Api.MakeKey(session, MappedResults, lastReducedEtag, MakeKeyGrbit.None); if (Api.TrySeek(session, MappedResults, SeekGrbit.SeekLE) == false) yield break; while (Api.RetrieveColumnAsString(session, MappedResults, tableColumnsCache.MappedResultsColumns["view"]) == indexName) { var result = new MappedResultInfo { ReduceKey = Api.RetrieveColumnAsString(session, MappedResults, tableColumnsCache.MappedResultsColumns["reduce_key"]), Etag = new Guid(Api.RetrieveColumn(session, MappedResults, tableColumnsCache.MappedResultsColumns["etag"])), Timestamp = Api.RetrieveColumnAsDateTime(session, MappedResults, tableColumnsCache.MappedResultsColumns["timestamp"]).Value, }; if (loadData) result.Data = Api.RetrieveColumn(session, MappedResults, tableColumnsCache.MappedResultsColumns["data"]).ToJObject(); yield return result; // the index is view ascending and etag descending // that means that we are going backward to go up if (Api.TryMovePrevious(session, MappedResults) == false) yield break; } }