public void Insert(IEnumerable <KeyValuePair <BsonValue, PageAddress> > items, int order, BufferSlice buffer) { var query = order == Query.Ascending ? items.OrderBy(x => x.Key, _collation) : items.OrderByDescending(x => x.Key, _collation); var offset = 0; foreach (var item in query) { buffer.WriteIndexKey(item.Key, offset); var keyLength = IndexNode.GetKeyLength(item.Key, false); if (keyLength > MAX_INDEX_KEY_LENGTH) { throw LiteException.InvalidIndexKey($"Sort key must be less than {MAX_INDEX_KEY_LENGTH} bytes."); } offset += keyLength; buffer.Write(item.Value, offset); offset += PageAddress.SIZE; _remaining++; } _count = _remaining; }
/// <summary> /// Loop in values enumerator to return N values for a single container /// </summary> private IEnumerable <KeyValuePair <BsonValue, PageAddress> > YieldValues(IEnumerator <KeyValuePair <BsonValue, PageAddress> > source, Done done) { var size = IndexNode.GetKeyLength(source.Current.Key, false) + PageAddress.SIZE; if (size > MAX_INDEX_KEY_LENGTH) { throw new LiteException(0, $"Current value are larger than {MAX_INDEX_KEY_LENGTH} bytes and can't be sorted."); } yield return(source.Current); while (source.MoveNext()) { var length = IndexNode.GetKeyLength(source.Current.Key, false) + PageAddress.SIZE; done.Count++; if (size + length > _containerSize) { yield break; } size += length; yield return(source.Current); } done.Running = false; }
/// <summary> /// Loop in values enumerator to return N values for a single container /// </summary> private IEnumerable <KeyValuePair <BsonValue, PageAddress> > YieldValues(IEnumerator <KeyValuePair <BsonValue, PageAddress> > source, Done done) { var size = IndexNode.GetKeyLength(source.Current.Key, false) + PageAddress.SIZE; yield return(source.Current); while (source.MoveNext()) { var length = IndexNode.GetKeyLength(source.Current.Key, false) + PageAddress.SIZE; done.Count++; if (size + length > _containerSize) { yield break; } size += length; yield return(source.Current); } done.Running = false; }