Skip to content

Commit 50c0c85

Browse files
committed
Merge branch 'master' into llm
# Conflicts: # go.mod # go.sum
2 parents 1cb3146 + e2da281 commit 50c0c85

File tree

5 files changed

+65
-19
lines changed

5 files changed

+65
-19
lines changed

cmd/gorse-in-one/main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ var oneCommand = &cobra.Command{
7272
conf.Database.CacheStore = "sqlite://cache.db"
7373
conf.Recommend.DataSource.PositiveFeedbackTypes = []string{"star", "like"}
7474
conf.Recommend.DataSource.ReadFeedbackTypes = []string{"read"}
75-
if err := conf.Validate(true); err != nil {
75+
if err := conf.Validate(); err != nil {
7676
log.Logger().Fatal("invalid config", zap.Error(err))
7777
}
7878

config/config.go

+25-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"sync"
2626
"time"
2727

28+
mapset "github.com/deckarep/golang-set/v2"
2829
"github.com/expr-lang/expr/parser"
2930
"github.com/go-playground/locales/en"
3031
ut "github.com/go-playground/universal-translator"
@@ -600,7 +601,7 @@ func LoadConfig(path string, oneModel bool) (*Config, error) {
600601
}
601602

602603
// validate config file
603-
if err := conf.Validate(oneModel); err != nil {
604+
if err := conf.Validate(); err != nil {
604605
return nil, errors.Trace(err)
605606
}
606607

@@ -614,7 +615,25 @@ func LoadConfig(path string, oneModel bool) (*Config, error) {
614615
return &conf, nil
615616
}
616617

617-
func (config *Config) Validate(oneModel bool) error {
618+
func (config *Config) Validate() error {
619+
// Check non-personalized recommenders
620+
nonPersonalizedNames := mapset.NewSet[string]()
621+
for _, nonPersonalized := range config.Recommend.NonPersonalized {
622+
if nonPersonalizedNames.Contains(nonPersonalized.Name) {
623+
return errors.Errorf("non-personalized recommender %v is duplicated", nonPersonalized.Name)
624+
}
625+
nonPersonalizedNames.Add(nonPersonalized.Name)
626+
}
627+
628+
// Check item-to-item recommenders
629+
itemToItemNames := mapset.NewSet[string]()
630+
for _, itemToItem := range config.Recommend.ItemToItem {
631+
if itemToItemNames.Contains(itemToItem.Name) {
632+
return errors.Errorf("item-to-item recommender %v is duplicated", itemToItem.Name)
633+
}
634+
itemToItemNames.Add(itemToItem.Name)
635+
}
636+
618637
validate := validator.New()
619638
if err := validate.RegisterValidation("data_store", func(fl validator.FieldLevel) bool {
620639
prefixes := []string{
@@ -658,6 +677,10 @@ func (config *Config) Validate(oneModel bool) error {
658677
return errors.Trace(err)
659678
}
660679
if err := validate.RegisterValidation("item_expr", func(fl validator.FieldLevel) bool {
680+
if fl.Field().String() == "" {
681+
// Empty expression is legal.
682+
return true
683+
}
661684
_, err := parser.Parse(fl.Field().String())
662685
return err == nil
663686
}); err != nil {

config/config_test.go

+38
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/sclevine/yj/convert"
2727
"github.com/spf13/viper"
2828
"github.com/stretchr/testify/assert"
29+
"github.com/stretchr/testify/suite"
2930
)
3031

3132
func TestUnmarshal(t *testing.T) {
@@ -448,3 +449,40 @@ func TestItemToItemConfig_Hash(t *testing.T) {
448449
b = ItemToItemConfig{Column: "b"}
449450
assert.NotEqual(t, a.Hash(), b.Hash())
450451
}
452+
453+
type ValidateTestSuite struct {
454+
suite.Suite
455+
*Config
456+
}
457+
458+
func (s *ValidateTestSuite) SetupTest() {
459+
s.Config = GetDefaultConfig()
460+
s.Database.CacheStore = "redis://localhost:6379/0"
461+
s.Database.DataStore = "mysql://gorse:gorse_pass@tcp(localhost:3306)/gorse"
462+
}
463+
464+
func (s *ValidateTestSuite) TestDuplicateNonPersonalized() {
465+
s.Recommend.NonPersonalized = []NonPersonalizedConfig{{
466+
Name: "most_starred_weekly",
467+
Score: "count(feedback, .FeedbackType == 'star')",
468+
}, {
469+
Name: "most_starred_weekly",
470+
Score: "count(feedback, .FeedbackType == 'star')",
471+
}}
472+
s.Error(s.Validate())
473+
}
474+
475+
func (s *ValidateTestSuite) TestDuplicateItemToItem() {
476+
s.Recommend.ItemToItem = []ItemToItemConfig{{
477+
Name: "item_to_item",
478+
Type: "users",
479+
}, {
480+
Name: "item_to_item",
481+
Type: "users",
482+
}}
483+
s.Error(s.Validate())
484+
}
485+
486+
func TestValidate(t *testing.T) {
487+
suite.Run(t, new(ValidateTestSuite))
488+
}

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ require (
110110
github.com/golang/protobuf v1.5.3 // indirect
111111
github.com/golang/snappy v0.0.4 // indirect
112112
github.com/google/flatbuffers v2.0.6+incompatible // indirect
113+
github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5 // indirect
113114
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect
114115
github.com/hashicorp/go-version v1.6.0 // indirect
115116
github.com/hashicorp/hcl v1.0.0 // indirect
@@ -151,7 +152,6 @@ require (
151152
github.com/sagikazarmark/locafero v0.4.0 // indirect
152153
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
153154
github.com/shopspring/decimal v1.3.1 // indirect
154-
github.com/sirupsen/logrus v1.9.3 // indirect
155155
github.com/sourcegraph/conc v0.3.0 // indirect
156156
github.com/spf13/afero v1.11.0 // indirect
157157
github.com/spf13/cast v1.6.0 // indirect

go.sum

-15
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@ gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zum
3535
git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=
3636
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
3737
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
38-
github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
39-
github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
4038
github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
4139
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
4240
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
@@ -213,8 +211,6 @@ github.com/go-resty/resty/v2 v2.16.3/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ
213211
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
214212
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
215213
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
216-
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
217-
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
218214
github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss=
219215
github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
220216
github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw=
@@ -308,8 +304,6 @@ github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyC
308304
github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
309305
github.com/gorse-io/clickhouse v0.3.3-0.20220715124633-688011a495bb h1:z/oOWE+Vy0PLcwIulZmIug4FtmvE3dJ1YOGprLeHwwY=
310306
github.com/gorse-io/clickhouse v0.3.3-0.20220715124633-688011a495bb/go.mod h1:iILWzbul8U+gsf4kqbheF2QzBmdvVp63mloGGK8emDI=
311-
github.com/gorse-io/dashboard v0.0.0-20250125070654-fba9eb31ccea h1:ZJkKE4ZSfJOGbbmqsRwgwPYwOPUMNL3lixBpfqRffpc=
312-
github.com/gorse-io/dashboard v0.0.0-20250125070654-fba9eb31ccea/go.mod h1:6h/3EYChEyiynyCMMDsCsDEVBSOPLSo1L/+aHqj9kdc=
313307
github.com/gorse-io/dashboard v0.0.0-20250209091713-a70341e78d48 h1:kfCK07ae/+NvxlcPqh0SpaXxkDlceqSmamsX7t/E4+w=
314308
github.com/gorse-io/dashboard v0.0.0-20250209091713-a70341e78d48/go.mod h1:lv2bu311bjIJeRfY+6hiIaw20M6fLxT4ma9Ye+bpwGY=
315309
github.com/gorse-io/gorgonia v0.0.0-20230817132253-6dd1dbf95849 h1:Hwywr6NxzYeZYn35KwOsw7j8ZiMT60TBzpbn1MbEido=
@@ -494,13 +488,7 @@ github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt
494488
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
495489
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
496490
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
497-
github.com/nikolalohinski/gonja/v2 v2.3.3 h1:5cTcmz0i/DwJl67US8Rvnb4OkBXB5V5OWd5IIAPPkXw=
498491
github.com/nikolalohinski/gonja/v2 v2.3.3/go.mod h1:8KC3RlefxnOaY5P4rH5erdwV0/owS83U615cSnDLYFs=
499-
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
500-
github.com/onsi/ginkgo/v2 v2.20.1 h1:YlVIbqct+ZmnEph770q9Q7NVAz4wwIiVNahee6JyUzo=
501-
github.com/onsi/ginkgo/v2 v2.20.1/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI=
502-
github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4=
503-
github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
504492
github.com/openzipkin/zipkin-go v0.4.1 h1:kNd/ST2yLLWhaWrkgchya40TJabe8Hioj9udfPcEO5A=
505493
github.com/openzipkin/zipkin-go v0.4.1/go.mod h1:qY0VqDSN1pOBN94dBc6w2GJlWLiovAyg7Qt6/I9HecM=
506494
github.com/orcaman/concurrent-map v1.0.0 h1:I/2A2XPCb4IuQWcQhBhSwGfiuybl/J0ev9HDbW65HOY=
@@ -597,8 +585,6 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx
597585
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
598586
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
599587
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
600-
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
601-
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
602588
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
603589
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
604590
github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
@@ -918,7 +904,6 @@ golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBc
918904
golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
919905
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
920906
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
921-
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
922907
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
923908
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
924909
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=

0 commit comments

Comments
 (0)