github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/inverted/prop_value_pairs_test.go (about)

     1  //                           _       _
     2  // __      _____  __ ___   ___  __ _| |_ ___
     3  // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
     4  //  \ V  V /  __/ (_| |\ V /| | (_| | ||  __/
     5  //   \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
     6  //
     7  //  Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
     8  //
     9  //  CONTACT: hello@weaviate.io
    10  //
    11  
    12  package inverted
    13  
    14  import (
    15  	"testing"
    16  
    17  	"github.com/stretchr/testify/assert"
    18  	"github.com/stretchr/testify/require"
    19  	"github.com/weaviate/sroar"
    20  	"github.com/weaviate/weaviate/adapters/repos/db/roaringset"
    21  	"github.com/weaviate/weaviate/entities/filters"
    22  )
    23  
    24  func TestPropValuePairs_Merging(t *testing.T) {
    25  	t.Run("always creates new underlying bitmap", func(t *testing.T) {
    26  		type testCase struct {
    27  			name string
    28  
    29  			bitmaps  []*sroar.Bitmap
    30  			operator filters.Operator
    31  
    32  			expectedIds []uint64
    33  		}
    34  
    35  		testCases := []testCase{
    36  			{
    37  				name: "AND; different sets",
    38  
    39  				bitmaps: []*sroar.Bitmap{
    40  					roaringset.NewBitmap(7, 8, 9, 10, 11),
    41  					roaringset.NewBitmap(1, 3, 5, 7, 9, 11),
    42  					roaringset.NewBitmap(1, 3, 5, 7, 9),
    43  				},
    44  				operator: filters.OperatorAnd,
    45  
    46  				expectedIds: []uint64{7, 9},
    47  			},
    48  			{
    49  				name: "OR; different sets",
    50  
    51  				bitmaps: []*sroar.Bitmap{
    52  					roaringset.NewBitmap(7, 8, 9, 10, 11),
    53  					roaringset.NewBitmap(1, 3, 5, 7, 9, 11),
    54  					roaringset.NewBitmap(1, 3, 5, 7, 9),
    55  				},
    56  				operator: filters.OperatorOr,
    57  
    58  				expectedIds: []uint64{1, 3, 5, 7, 8, 9, 10, 11},
    59  			},
    60  			{
    61  				name: "AND; same sets",
    62  
    63  				bitmaps: []*sroar.Bitmap{
    64  					roaringset.NewBitmap(7, 8, 9, 10, 11),
    65  					roaringset.NewBitmap(7, 8, 9, 10, 11),
    66  					roaringset.NewBitmap(7, 8, 9, 10, 11),
    67  				},
    68  				operator: filters.OperatorAnd,
    69  
    70  				expectedIds: []uint64{7, 8, 9, 10, 11},
    71  			},
    72  			{
    73  				name: "OR; same sets",
    74  
    75  				bitmaps: []*sroar.Bitmap{
    76  					roaringset.NewBitmap(7, 8, 9, 10, 11),
    77  					roaringset.NewBitmap(7, 8, 9, 10, 11),
    78  					roaringset.NewBitmap(7, 8, 9, 10, 11),
    79  				},
    80  				operator: filters.OperatorOr,
    81  
    82  				expectedIds: []uint64{7, 8, 9, 10, 11},
    83  			},
    84  		}
    85  
    86  		for _, tc := range testCases {
    87  			t.Run(tc.name, func(t *testing.T) {
    88  				pv := &propValuePair{
    89  					operator: tc.operator,
    90  					children: make([]*propValuePair, len(tc.bitmaps)),
    91  				}
    92  				for i := range tc.bitmaps {
    93  					pv.children[i] = &propValuePair{
    94  						operator: filters.OperatorEqual,
    95  						docIDs: docBitmap{
    96  							docIDs: tc.bitmaps[i],
    97  						},
    98  					}
    99  				}
   100  
   101  				dbm, err := pv.mergeDocIDs()
   102  
   103  				require.Nil(t, err)
   104  				assert.ElementsMatch(t, tc.expectedIds, dbm.IDs())
   105  				assert.False(t, tc.bitmaps[0] == dbm.docIDs)
   106  				assert.False(t, tc.bitmaps[1] == dbm.docIDs)
   107  				assert.False(t, tc.bitmaps[2] == dbm.docIDs)
   108  			})
   109  		}
   110  	})
   111  }