github.com/siglens/siglens@v0.0.0-20240328180423-f7ce9ae441ed/pkg/segment/query/metadata/metareader.go (about) 1 /* 2 Copyright 2023. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package metadata 18 19 import ( 20 "bytes" 21 "errors" 22 23 "github.com/bits-and-blooms/bloom/v3" 24 "github.com/siglens/siglens/pkg/segment/structs" 25 "github.com/siglens/siglens/pkg/segment/utils" 26 toputils "github.com/siglens/siglens/pkg/utils" 27 log "github.com/sirupsen/logrus" 28 ) 29 30 func readRangeIndexFromByteArray(blkRILen uint32, bbRI []byte) map[string]*structs.Numbers { 31 var byteCounter uint32 = 0 32 blkRI := map[string]*structs.Numbers{} 33 34 for byteCounter < blkRILen { 35 //read RangeKeyLen 36 blkRangeKeyLen := toputils.BytesToUint16LittleEndian(bbRI[byteCounter : byteCounter+2]) 37 38 byteCounter += 2 39 //read ActualRangeKey 40 blkActualRangeKey := string(bbRI[byteCounter : byteCounter+uint32(blkRangeKeyLen)]) 41 byteCounter += uint32(blkRangeKeyLen) 42 43 //read RangeNumType 44 45 blkRangeNumType := utils.RangeNumType(bbRI[byteCounter : byteCounter+1][0]) 46 byteCounter += 1 47 var blkRIToAdd *structs.Numbers 48 blkRIToAdd, byteCounter = rangeIndexToBytes(blkActualRangeKey, blkRangeNumType, bbRI, byteCounter) 49 blkRI[blkActualRangeKey] = blkRIToAdd 50 51 } 52 return blkRI 53 } 54 55 func rangeIndexToBytes(blkActualRangeKey string, blkRangeNumType utils.RangeNumType, bbBlockRI []byte, byteCounter uint32) (*structs.Numbers, uint32) { 56 var finalRangeIndex *structs.Numbers 57 switch blkRangeNumType { 58 case utils.RNT_UNSIGNED_INT: 59 minVal := toputils.BytesToUint64LittleEndian(bbBlockRI[byteCounter : byteCounter+8]) 60 byteCounter += 8 61 maxVal := toputils.BytesToUint64LittleEndian(bbBlockRI[byteCounter : byteCounter+8]) 62 byteCounter += 8 63 finalRangeIndex = &structs.Numbers{Min_uint64: minVal, Max_uint64: maxVal, NumType: utils.RNT_UNSIGNED_INT} 64 case utils.RNT_SIGNED_INT: 65 minVal := toputils.BytesToInt64LittleEndian(bbBlockRI[byteCounter : byteCounter+8]) 66 byteCounter += 8 67 maxVal := toputils.BytesToInt64LittleEndian(bbBlockRI[byteCounter : byteCounter+8]) 68 byteCounter += 8 69 finalRangeIndex = &structs.Numbers{Min_int64: minVal, Max_int64: maxVal, NumType: utils.RNT_SIGNED_INT} 70 case utils.RNT_FLOAT64: 71 minVal := toputils.BytesToFloat64LittleEndian(bbBlockRI[byteCounter : byteCounter+8]) 72 byteCounter += 8 73 maxVal := toputils.BytesToFloat64LittleEndian(bbBlockRI[byteCounter : byteCounter+8]) 74 byteCounter += 8 75 finalRangeIndex = &structs.Numbers{Min_float64: minVal, Max_float64: maxVal, NumType: utils.RNT_FLOAT64} 76 } 77 return finalRangeIndex, byteCounter 78 } 79 80 func getCmi(cmbuf []byte) (*structs.CmiContainer, error) { 81 82 cmic := &structs.CmiContainer{} 83 84 switch cmbuf[0] { 85 case utils.CMI_BLOOM_INDEX[0]: 86 bufRdr := bytes.NewReader(cmbuf[1:]) 87 blkBloom := &bloom.BloomFilter{} 88 _, bferr := blkBloom.ReadFrom(bufRdr) 89 if bferr != nil { 90 log.Errorf("getCmi: failed to convert bloom cmi %+v", bferr) 91 return nil, bferr 92 } 93 cmic.CmiType = utils.CMI_BLOOM_INDEX[0] 94 cmic.Loaded = true 95 cmic.Bf = blkBloom 96 case utils.CMI_RANGE_INDEX[0]: 97 blkRI := readRangeIndexFromByteArray(uint32(len(cmbuf)-1), cmbuf[1:]) 98 cmic.CmiType = utils.CMI_RANGE_INDEX[0] 99 cmic.Loaded = true 100 cmic.Ranges = blkRI 101 default: 102 log.Errorf("getCmi: unknown cmitype=%v", cmbuf[0]) 103 return nil, errors.New("getCmi: unknown cmitype") 104 } 105 106 return cmic, nil 107 }