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  }