weaviate
188 строк · 4.4 Кб
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
12package modtransformers
13
14import (
15"context"
16"testing"
17
18"github.com/sirupsen/logrus"
19ltest "github.com/sirupsen/logrus/hooks/test"
20"github.com/stretchr/testify/assert"
21"github.com/stretchr/testify/require"
22"github.com/weaviate/weaviate/entities/models"
23"github.com/weaviate/weaviate/entities/schema"
24)
25
26func TestConfigDefaults(t *testing.T) {
27t.Run("for properties", func(t *testing.T) {
28def := New().ClassConfigDefaults()
29
30assert.Equal(t, true, def["vectorizeClassName"])
31assert.Equal(t, "masked_mean", def["poolingStrategy"])
32})
33
34t.Run("for the class", func(t *testing.T) {
35dt := schema.DataTypeText
36def := New().PropertyConfigDefaults(&dt)
37assert.Equal(t, false, def["vectorizePropertyName"])
38assert.Equal(t, false, def["skip"])
39})
40}
41
42func TestConfigValidator(t *testing.T) {
43t.Run("all usable props no-indexed", func(t *testing.T) {
44t.Run("all schema vectorization turned off", func(t *testing.T) {
45class := &models.Class{
46Vectorizer: "text2vec-contextionary",
47Class: "ValidName",
48Properties: []*models.Property{
49{
50DataType: []string{"text"},
51Name: "description",
52},
53{
54DataType: schema.DataTypeText.PropString(),
55Tokenization: models.PropertyTokenizationWhitespace,
56Name: "name",
57},
58{
59DataType: []string{"int"},
60Name: "amount",
61},
62},
63}
64
65logger, _ := ltest.NewNullLogger()
66v := NewConfigValidator(logger)
67err := v.Do(context.Background(), class, nil, &fakeIndexChecker{
68vectorizePropertyName: false,
69vectorizeClassName: false,
70propertyIndexed: false,
71})
72assert.NotNil(t, err)
73})
74})
75}
76
77func TestConfigValidator_RiskOfDuplicateVectors(t *testing.T) {
78type test struct {
79name string
80in *models.Class
81expectWarning bool
82indexChecker *fakeIndexChecker
83}
84
85tests := []test{
86{
87name: "usable properties",
88in: &models.Class{
89Class: "ValidName",
90Properties: []*models.Property{
91{
92DataType: []string{string(schema.DataTypeText)},
93Name: "textProp",
94},
95},
96},
97expectWarning: false,
98indexChecker: &fakeIndexChecker{
99vectorizePropertyName: false,
100vectorizeClassName: true,
101propertyIndexed: true,
102},
103},
104{
105name: "no properties",
106in: &models.Class{
107Class: "ValidName",
108},
109expectWarning: true,
110indexChecker: &fakeIndexChecker{
111vectorizePropertyName: false,
112vectorizeClassName: true,
113propertyIndexed: false,
114},
115},
116{
117name: "usable properties, but they are no-indexed",
118in: &models.Class{
119Class: "ValidName",
120Properties: []*models.Property{
121{
122DataType: []string{string(schema.DataTypeText)},
123Name: "textProp",
124},
125},
126},
127expectWarning: true,
128indexChecker: &fakeIndexChecker{
129vectorizePropertyName: false,
130vectorizeClassName: true,
131propertyIndexed: false,
132},
133},
134{
135name: "only unusable properties",
136in: &models.Class{
137Class: "ValidName",
138Properties: []*models.Property{
139{
140DataType: []string{string(schema.DataTypeInt)},
141Name: "intProp",
142},
143},
144},
145expectWarning: true,
146indexChecker: &fakeIndexChecker{
147vectorizePropertyName: false,
148vectorizeClassName: true,
149propertyIndexed: false,
150},
151},
152}
153
154for _, test := range tests {
155t.Run(test.name, func(t *testing.T) {
156logger, hook := ltest.NewNullLogger()
157v := NewConfigValidator(logger)
158err := v.Do(context.Background(), test.in, nil, test.indexChecker)
159require.Nil(t, err)
160
161entry := hook.LastEntry()
162if test.expectWarning {
163require.NotNil(t, entry)
164assert.Equal(t, logrus.WarnLevel, entry.Level)
165} else {
166assert.Nil(t, entry)
167}
168})
169}
170}
171
172type fakeIndexChecker struct {
173vectorizeClassName bool
174vectorizePropertyName bool
175propertyIndexed bool
176}
177
178func (f *fakeIndexChecker) VectorizeClassName() bool {
179return f.vectorizeClassName
180}
181
182func (f *fakeIndexChecker) VectorizePropertyName(propName string) bool {
183return f.vectorizePropertyName
184}
185
186func (f *fakeIndexChecker) PropertyIndexed(propName string) bool {
187return f.propertyIndexed
188}
189