@@ -4093,3 +4093,236 @@ func queryWithIDFieldAndInterfaceArg(t *testing.T) {
40934093 // Cleanup
40944094 DeleteGqlType (t , "LibraryMember" , map [string ]interface {}{}, 1 , nil )
40954095}
4096+
4097+ func ngramFilters (t * testing.T ) {
4098+ // Test 1: Single word queries
4099+ queryArticleByTitle (t , "Running" , []* article {
4100+ {Title : "Running for Cardiovascular Health" },
4101+ })
4102+
4103+ queryArticleByTitle (t , "Training" , []* article {
4104+ {Title : "Weight Training and Muscle Building" },
4105+ })
4106+
4107+ queryArticleByTitle (t , "Nutrition" , []* article {
4108+ {Title : "Nutrition and Healthy Eating Habits" },
4109+ })
4110+
4111+ // Test 2: Two word queries
4112+ queryArticleByTitle (t , "Cardiovascular Health" , []* article {
4113+ {Title : "Running for Cardiovascular Health" },
4114+ })
4115+
4116+ queryArticleByTitle (t , "Muscle Building" , []* article {
4117+ {Title : "Weight Training and Muscle Building" },
4118+ })
4119+
4120+ queryArticleByTitle (t , "Eating Habits" , []* article {
4121+ {Title : "Nutrition and Healthy Eating Habits" },
4122+ })
4123+
4124+ // Test 3: Three word queries
4125+ queryArticleByTitle (t , "Weight Training and" , []* article {
4126+ {Title : "Weight Training and Muscle Building" },
4127+ })
4128+ }
4129+
4130+ func ngramStemming (t * testing.T ) {
4131+ // Test stemming with single words
4132+ queryArticleByTitle (t , "run" , []* article {
4133+ {Title : "Running for Cardiovascular Health" },
4134+ })
4135+
4136+ queryArticleByTitle (t , "train" , []* article {
4137+ {Title : "Weight Training and Muscle Building" },
4138+ })
4139+
4140+ queryArticleByTitle (t , "eat" , []* article {
4141+ {Title : "Nutrition and Healthy Eating Habits" },
4142+ })
4143+
4144+ // Test stemming in array field
4145+ queryArticleBySummaries (t , "strengthen" , []* article {
4146+ {Title : "Running for Cardiovascular Health" },
4147+ })
4148+
4149+ queryArticleBySummaries (t , "build" , []* article {
4150+ {Title : "Weight Training and Muscle Building" },
4151+ })
4152+
4153+ queryArticleBySummaries (t , "maintain" , []* article {
4154+ {Title : "Nutrition and Healthy Eating Habits" },
4155+ })
4156+ }
4157+
4158+ func ngramStopWords (t * testing.T ) {
4159+ // Test stop words in two word queries
4160+ queryArticleByTitle (t , "for Health" , []* article {
4161+ {Title : "Running for Cardiovascular Health" },
4162+ })
4163+
4164+ queryArticleByTitle (t , "and Muscle" , []* article {
4165+ {Title : "Weight Training and Muscle Building" },
4166+ })
4167+
4168+ queryArticleByTitle (t , "and Healthy" , []* article {
4169+ {Title : "Nutrition and Healthy Eating Habits" },
4170+ })
4171+
4172+ // Test stop words in summaries with longer phrases
4173+ queryArticleBySummaries (t , "is the best" , []* article {
4174+ {Title : "Running for Cardiovascular Health" },
4175+ })
4176+
4177+ queryArticleBySummaries (t , "for beginners and" , []* article {
4178+ {Title : "Weight Training and Muscle Building" },
4179+ })
4180+
4181+ queryArticleBySummaries (t , "that support long-term" , []* article {
4182+ {Title : "Nutrition and Healthy Eating Habits" },
4183+ })
4184+ }
4185+
4186+ func ngramCaseInsensitive (t * testing.T ) {
4187+ // Test case insensitivity in titles
4188+ queryArticleByTitle (t , "RUNNING" , []* article {
4189+ {Title : "Running for Cardiovascular Health" },
4190+ })
4191+
4192+ queryArticleByTitle (t , "weight training" , []* article {
4193+ {Title : "Weight Training and Muscle Building" },
4194+ })
4195+
4196+ queryArticleByTitle (t , "NUTRITION AND HEALTHY" , []* article {
4197+ {Title : "Nutrition and Healthy Eating Habits" },
4198+ })
4199+
4200+ // Test case insensitivity in summaries
4201+ queryArticleBySummaries (t , "CARDIOVASCULAR BENEFITS" , []* article {
4202+ {Title : "Running for Cardiovascular Health" },
4203+ })
4204+
4205+ queryArticleBySummaries (t , "strength training" , []* article {
4206+ {Title : "Weight Training and Muscle Building" },
4207+ })
4208+ }
4209+
4210+ func ngramCompoundWords (t * testing.T ) {
4211+ // Test compound words and hyphenated terms
4212+ queryArticleBySummaries (t , "long-term" , []* article {
4213+ {Title : "Nutrition and Healthy Eating Habits" },
4214+ })
4215+
4216+ // Test compound concepts
4217+ queryArticleByTitle (t , "Cardiovascular" , []* article {
4218+ {Title : "Running for Cardiovascular Health" },
4219+ })
4220+
4221+ // Test multi-word technical terms
4222+ queryArticleBySummaries (t , "bone density" , []* article {
4223+ {Title : "Weight Training and Muscle Building" },
4224+ })
4225+
4226+ queryArticleBySummaries (t , "heart health" , []* article {
4227+ {Title : "Running for Cardiovascular Health" },
4228+ })
4229+ }
4230+
4231+ func ngramArrayFields (t * testing.T ) {
4232+ // Test ngram search specifically on array field (summaries)
4233+ queryArticleBySummaries (t , "exercise" , []* article {
4234+ {Title : "Running for Cardiovascular Health" },
4235+ })
4236+
4237+ queryArticleBySummaries (t , "muscle mass" , []* article {
4238+ {Title : "Weight Training and Muscle Building" },
4239+ })
4240+
4241+ queryArticleBySummaries (t , "optimal performance" , []* article {
4242+ {Title : "Nutrition and Healthy Eating Habits" },
4243+ })
4244+
4245+ // Test array field with multiple word phrases
4246+ queryArticleBySummaries (t , "progressive resistance" , []* article {
4247+ {Title : "Weight Training and Muscle Building" },
4248+ })
4249+ }
4250+
4251+ func ngramLinguisticVariations (t * testing.T ) {
4252+ // Test negative cases - should return empty results
4253+ queryArticleByTitle (t , "nonexistent" , []* article {})
4254+ queryArticleBySummaries (t , "swimming" , []* article {})
4255+
4256+ // Test partial word boundaries
4257+ queryArticleBySummaries (t , "wellness" , []* article {
4258+ {Title : "Nutrition and Healthy Eating Habits" },
4259+ })
4260+
4261+ // Test technical terminology variations
4262+ queryArticleBySummaries (t , "nutritional guideline" , []* article {
4263+ {Title : "Nutrition and Healthy Eating Habits" },
4264+ })
4265+
4266+ // Test cross-phrase matching in array field
4267+ queryArticleBySummaries (t , "advanced athletes" , []* article {
4268+ {Title : "Weight Training and Muscle Building" },
4269+ })
4270+
4271+ // Test punctuation variations
4272+ queryArticleBySummaries (t , " beginners advanced" , []* article {
4273+ {Title : "Weight Training and Muscle Building" },
4274+ })
4275+ queryArticleBySummaries (t , "eat nutrition healthy" , []* article {
4276+ {Title : "Nutrition and Healthy Eating Habits" },
4277+ })
4278+ }
4279+
4280+ func queryArticleByTitle (t * testing.T , title string , expectedArticles []* article ) {
4281+ getArticleParams := & GraphQLParams {
4282+ Query : `query queryArticle($title: String!) {
4283+ queryArticle(filter: { title: { ngram: $title } }) {
4284+ title
4285+ }
4286+ }` ,
4287+ Variables : map [string ]interface {}{"title" : title },
4288+ }
4289+
4290+ gqlResponse := getArticleParams .ExecuteAsPost (t , GraphqlURL )
4291+ RequireNoGQLErrors (t , gqlResponse )
4292+
4293+ var result struct {
4294+ QueryArticle []* article
4295+ }
4296+ err := json .Unmarshal (gqlResponse .Data , & result )
4297+ require .NoError (t , err )
4298+
4299+ opt := cmpopts .IgnoreFields (article {}, "ID" )
4300+ if diff := cmp .Diff (expectedArticles , result .QueryArticle , opt ); diff != "" {
4301+ t .Errorf ("result mismatch (-want +got):\n %s" , diff )
4302+ }
4303+ }
4304+
4305+ func queryArticleBySummaries (t * testing.T , summaries string , expectedArticles []* article ) {
4306+ getArticleParams := & GraphQLParams {
4307+ Query : `query queryArticle($summaries: String!) {
4308+ queryArticle(filter: { summaries: { ngram: $summaries } }) {
4309+ title
4310+ }
4311+ }` ,
4312+ Variables : map [string ]interface {}{"summaries" : summaries },
4313+ }
4314+
4315+ gqlResponse := getArticleParams .ExecuteAsPost (t , GraphqlURL )
4316+ RequireNoGQLErrors (t , gqlResponse )
4317+
4318+ var result struct {
4319+ QueryArticle []* article
4320+ }
4321+ err := json .Unmarshal (gqlResponse .Data , & result )
4322+ require .NoError (t , err )
4323+
4324+ opt := cmpopts .IgnoreFields (article {}, "ID" )
4325+ if diff := cmp .Diff (expectedArticles , result .QueryArticle , opt ); diff != "" {
4326+ t .Errorf ("result mismatch (-want +got):\n %s" , diff )
4327+ }
4328+ }
0 commit comments