github.com/siglens/siglens@v0.0.0-20240328180423-f7ce9ae441ed/pkg/segment/reader/segread/multicolreader_test.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 segread
    18  
    19  import (
    20  	"os"
    21  	"testing"
    22  
    23  	"github.com/siglens/siglens/pkg/config"
    24  	"github.com/siglens/siglens/pkg/segment/utils"
    25  	"github.com/siglens/siglens/pkg/segment/writer"
    26  	log "github.com/sirupsen/logrus"
    27  	"github.com/stretchr/testify/assert"
    28  )
    29  
    30  func Test_multiSegReader(t *testing.T) {
    31  
    32  	config.InitializeTestingConfig()
    33  	segDir := "data/"
    34  	_ = os.MkdirAll(segDir, 0755)
    35  	segKey := segDir + "test"
    36  	numBlocks := 10
    37  	numEntriesInBlock := 10
    38  	_, bSum, _, cols, blockmeta, _ := writer.WriteMockColSegFile(segKey, numBlocks, numEntriesInBlock)
    39  
    40  	assert.Greater(t, len(cols), 1)
    41  	sharedReader, foundErr := InitSharedMultiColumnReaders(segKey, cols, blockmeta, bSum, 3, 9)
    42  	assert.Nil(t, foundErr)
    43  	assert.Len(t, sharedReader.MultiColReaders, sharedReader.numReaders)
    44  	assert.Equal(t, 3, sharedReader.numReaders)
    45  
    46  	multiReader := sharedReader.MultiColReaders[0]
    47  	var cVal *utils.CValueEnclosure
    48  	var err error
    49  	for colName := range cols {
    50  		if colName == config.GetTimeStampKey() {
    51  			continue
    52  		}
    53  		// invalid block
    54  		_, err = multiReader.ExtractValueFromColumnFile(colName, uint16(numBlocks), 0, 0)
    55  		assert.NotNil(t, err)
    56  
    57  		// correct block, incorrect recordNum
    58  		_, err = multiReader.ExtractValueFromColumnFile(colName, 0, uint16(numEntriesInBlock), 0)
    59  		assert.NotNil(t, err)
    60  
    61  		cVal, err = multiReader.ExtractValueFromColumnFile(colName, 0, uint16(numEntriesInBlock-3), 0)
    62  		assert.Nil(t, err)
    63  		assert.NotNil(t, cVal)
    64  		log.Infof("ExtractValueFromColumnFile: %+v for column %s", cVal, colName)
    65  	}
    66  
    67  	for blkNum := 0; blkNum < numBlocks; blkNum++ {
    68  		for recNum := 0; recNum < numEntriesInBlock; recNum++ {
    69  			ts, err := multiReader.GetTimeStampForRecord(uint16(blkNum), uint16(recNum), 0)
    70  			assert.Nil(t, err)
    71  			assert.Equal(t, uint64(recNum)+1, ts)
    72  		}
    73  	}
    74  
    75  	sharedReader.Close()
    76  	assert.Nil(t, err)
    77  	os.RemoveAll(segDir)
    78  }
    79  
    80  func Test_InitSharedMultiColumnReaders(t *testing.T) {
    81  
    82  	config.InitializeTestingConfig()
    83  	segDir := "data/test_cols_with_asterisk/"
    84  	_ = os.MkdirAll(segDir, 0755)
    85  	segKey := segDir + "test"
    86  	numBlocks := 10
    87  	numEntriesInBlock := 10
    88  	_, bSum, _, cols, blockmeta, _ := writer.WriteMockColSegFile(segKey, numBlocks, numEntriesInBlock)
    89  
    90  	assert.Greater(t, len(cols), 1)
    91  	sharedReader, foundErr := InitSharedMultiColumnReaders(segKey, cols, blockmeta, bSum, 3, 9)
    92  	assert.Nil(t, foundErr)
    93  	assert.Len(t, sharedReader.MultiColReaders, sharedReader.numReaders)
    94  	assert.Equal(t, 3, sharedReader.numReaders)
    95  
    96  	cols["*"] = true
    97  	sharedAsteriskReader, foundErr := InitSharedMultiColumnReaders(segKey, cols, blockmeta, bSum, 3, 9)
    98  	assert.Nil(t, foundErr)
    99  	assert.Len(t, sharedAsteriskReader.MultiColReaders, sharedAsteriskReader.numReaders)
   100  	assert.Equal(t, 3, sharedAsteriskReader.numReaders)
   101  
   102  	assert.Equal(t, sharedReader.numReaders, sharedAsteriskReader.numReaders)
   103  	assert.Equal(t, sharedReader.numOpenFDs, sharedAsteriskReader.numOpenFDs)
   104  	assert.Equal(t, len(sharedReader.MultiColReaders), len(sharedAsteriskReader.MultiColReaders))
   105  
   106  	for i := 0; i < len(sharedReader.MultiColReaders); i++ {
   107  		assert.ObjectsAreEqualValues(sharedReader.MultiColReaders[i], sharedAsteriskReader.MultiColReaders[i])
   108  	}
   109  
   110  	for col, f := range sharedReader.allFDs {
   111  		assert.Equal(t, (*((*sharedReader).allFDs[col])).Name(), f.Name())
   112  	}
   113  
   114  	var sharedAsteriskReaderMCR map[string]map[int]string = make(map[string]map[int]string)
   115  	var sharedReaderMCR map[string]map[int]string = make(map[string]map[int]string)
   116  
   117  	for i := 0; i < len(sharedReader.MultiColReaders); i++ {
   118  		assert.Equal(t, len(sharedReader.MultiColReaders[i].allFileReaders), len(sharedAsteriskReader.MultiColReaders[i].allFileReaders))
   119  		for j, aFR := range sharedReader.MultiColReaders[i].allFileReaders {
   120  			_, ok := sharedReaderMCR[aFR.ColName]
   121  			if !ok {
   122  				sharedReaderMCR[aFR.ColName] = make(map[int]string)
   123  			}
   124  
   125  			sharedReaderMCR[aFR.ColName][i] = aFR.fileName
   126  
   127  			aFR = sharedAsteriskReader.MultiColReaders[i].allFileReaders[j]
   128  			_, ok = sharedAsteriskReaderMCR[aFR.ColName]
   129  			if !ok {
   130  				sharedAsteriskReaderMCR[aFR.ColName] = make(map[int]string)
   131  			}
   132  			sharedAsteriskReaderMCR[aFR.ColName][i] = aFR.fileName
   133  		}
   134  	}
   135  
   136  	assert.Equal(t, len(sharedReaderMCR), len(sharedAsteriskReaderMCR))
   137  	for col := range sharedReaderMCR {
   138  		assert.Equal(t, len(sharedReaderMCR[col]), len(sharedAsteriskReaderMCR[col]))
   139  		for i := 0; i < len(sharedAsteriskReader.MultiColReaders); i++ {
   140  			assert.Equal(t, sharedAsteriskReaderMCR[col][i], sharedReaderMCR[col][i])
   141  		}
   142  	}
   143  
   144  	sharedReader.Close()
   145  	sharedAsteriskReader.Close()
   146  
   147  	os.RemoveAll(segDir)
   148  }