123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- // Copyright (c) 2019 Couchbase, Inc.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
-
- package zap
-
- import (
- "fmt"
- )
-
- // LegacyChunkMode was the original chunk mode (always chunk size 1024)
- // this mode is still used for chunking doc values.
- var LegacyChunkMode uint32 = 1024
-
- // DefaultChunkMode is the most recent improvement to chunking and should
- // be used by default.
- var DefaultChunkMode uint32 = 1025
-
- func getChunkSize(chunkMode uint32, cardinality uint64, maxDocs uint64) (uint64, error) {
- switch {
- // any chunkMode <= 1024 will always chunk with chunkSize=chunkMode
- case chunkMode <= 1024:
- // legacy chunk size
- return uint64(chunkMode), nil
-
- case chunkMode == 1025:
- // attempt at simple improvement
- // theory - the point of chunking is to put a bound on the maximum number of
- // calls to Next() needed to find a random document. ie, you should be able
- // to do one jump to the correct chunk, and then walk through at most
- // chunk-size items
- // previously 1024 was chosen as the chunk size, but this is particularly
- // wasteful for low cardinality terms. the observation is that if there
- // are less than 1024 items, why not put them all in one chunk,
- // this way you'll still achieve the same goal of visiting at most
- // chunk-size items.
- // no attempt is made to tweak any other case
- if cardinality <= 1024 {
- return maxDocs, nil
- }
- return 1024, nil
- }
- return 0, fmt.Errorf("unknown chunk mode %d", chunkMode)
- }
|