From f0e7e3279143a902f29afe8030e80064c9d35bbd Mon Sep 17 00:00:00 2001 From: Jakub Skoczen Date: Mon, 4 May 2026 21:30:03 +0200 Subject: [PATCH 1/2] Add item CQL indexes --- .../034_add_item_cql_indexes.down.sql | 3 + .../034_add_item_cql_indexes.up.sql | 10 ++ broker/oapi/open-api.yaml | 3 +- .../patron_request/db/field_exists_string.go | 91 ++++++++++++++ broker/patron_request/db/prcql.go | 5 + broker/patron_request/db/prcql_test.go | 115 +++++++++++++++++ broker/sqlc/pr_schema.sql | 11 ++ broker/test/patron_request/db/prrepo_test.go | 117 ++++++++++++++++++ .../Lending side create pull slip.bru | Bin 831 -> 6931 bytes 9 files changed, 354 insertions(+), 1 deletion(-) create mode 100644 broker/migrations/034_add_item_cql_indexes.down.sql create mode 100644 broker/migrations/034_add_item_cql_indexes.up.sql create mode 100644 broker/patron_request/db/field_exists_string.go diff --git a/broker/migrations/034_add_item_cql_indexes.down.sql b/broker/migrations/034_add_item_cql_indexes.down.sql new file mode 100644 index 00000000..6d94be36 --- /dev/null +++ b/broker/migrations/034_add_item_cql_indexes.down.sql @@ -0,0 +1,3 @@ +DROP INDEX IF EXISTS idx_item_call_number_pr_id; +DROP INDEX IF EXISTS idx_item_item_id_pr_id; +DROP INDEX IF EXISTS idx_item_barcode_pr_id; diff --git a/broker/migrations/034_add_item_cql_indexes.up.sql b/broker/migrations/034_add_item_cql_indexes.up.sql new file mode 100644 index 00000000..7e173548 --- /dev/null +++ b/broker/migrations/034_add_item_cql_indexes.up.sql @@ -0,0 +1,10 @@ +CREATE INDEX idx_item_barcode_pr_id + ON item (barcode, pr_id); + +CREATE INDEX idx_item_item_id_pr_id + ON item (item_id, pr_id) + WHERE item_id IS NOT NULL; + +CREATE INDEX idx_item_call_number_pr_id + ON item (call_number, pr_id) + WHERE call_number IS NOT NULL; diff --git a/broker/oapi/open-api.yaml b/broker/oapi/open-api.yaml index 55829da5..21b24562 100644 --- a/broker/oapi/open-api.yaml +++ b/broker/oapi/open-api.yaml @@ -1359,7 +1359,8 @@ paths: Query parameter cql can be used to filter the results. With cql you can use these fields state, side, requester_symbol, supplier_symbol, needs_attention, has_notification, has_cost, has_unread_notification, service_type, service_level, created_at, needed_at, - requester_req_id, title, author, patron, terminal_state, updated_at, cql.serverChoice. + requester_req_id, title, author, isbn, issn, item_id, barcode, call_number, patron, terminal_state, + updated_at, cql.serverChoice. tags: - patron-requests-api parameters: diff --git a/broker/patron_request/db/field_exists_string.go b/broker/patron_request/db/field_exists_string.go new file mode 100644 index 00000000..3844fa36 --- /dev/null +++ b/broker/patron_request/db/field_exists_string.go @@ -0,0 +1,91 @@ +package pr_db + +import ( + "fmt" + + "github.com/indexdata/cql-go/cql" + "github.com/indexdata/cql-go/pgcql" +) + +type FieldExistsString struct { + column string + table string + alias string + correlation string + valueExpression string + sortExpression string + field *pgcql.FieldString +} + +func NewFieldExistsString(table, alias, correlation, valueExpression string) *FieldExistsString { + field := pgcql.NewFieldString().WithLikeOps() + field.SetColumn(valueExpression) + return &FieldExistsString{ + table: table, + alias: alias, + correlation: correlation, + valueExpression: valueExpression, + field: field, + } +} + +func (f *FieldExistsString) GetColumn() string { + return f.column +} + +func (f *FieldExistsString) SetColumn(column string) { + f.column = column +} + +func (f *FieldExistsString) Sort() string { + return f.sortExpression +} + +func (f *FieldExistsString) WithSortExpression(sortExpression string) *FieldExistsString { + f.sortExpression = sortExpression + return f +} + +func (f *FieldExistsString) WithField(field *pgcql.FieldString) *FieldExistsString { + f.field = field + f.field.SetColumn(f.valueExpression) + return f +} + +func (f *FieldExistsString) Generate(sc cql.SearchClause, queryArgumentIndex int) (string, []any, error) { + switch { + case sc.Term == "" && isPositiveStringRelation(sc.Relation): + return "NOT " + f.existsSql(f.nonEmptyValuePredicate()), nil, nil + case sc.Term == "" && sc.Relation == cql.NE: + return f.existsSql(f.nonEmptyValuePredicate()), nil, nil + case sc.Relation == cql.NE: + sc.Relation = cql.EQ + predicate, args, err := f.field.Generate(sc, queryArgumentIndex) + if err != nil { + return "", nil, err + } + return "NOT " + f.existsSql(predicate), args, nil + default: + predicate, args, err := f.field.Generate(sc, queryArgumentIndex) + if err != nil { + return "", nil, err + } + return f.existsSql(predicate), args, nil + } +} + +func isPositiveStringRelation(relation cql.Relation) bool { + return relation == cql.EQ || relation == cql.EXACT || relation == "==" +} + +func (f *FieldExistsString) existsSql(predicate string) string { + source := f.table + if f.alias != "" { + source += " " + f.alias + } + return fmt.Sprintf("EXISTS (SELECT 1 FROM %s WHERE %s AND %s)", source, f.correlation, predicate) +} + +func (f *FieldExistsString) nonEmptyValuePredicate() string { + return fmt.Sprintf("COALESCE(%s, '') <> ''", f.valueExpression) +} diff --git a/broker/patron_request/db/prcql.go b/broker/patron_request/db/prcql.go index b61db410..8d432e67 100644 --- a/broker/patron_request/db/prcql.go +++ b/broker/patron_request/db/prcql.go @@ -143,6 +143,11 @@ func handlePatronRequestsQuery(cqlString string, noBaseArgs int) (pgcql.Query, e def.AddField("isbn", NewFieldTextArrayContains("bibliographic_item_identifiers(ill_request, 'ISBN')").WithFunction("norm_isxn")) def.AddField("issn", NewFieldTextArrayContains("bibliographic_item_identifiers(ill_request, 'ISSN')").WithFunction("norm_isxn")) + itemCorrelation := "cql_item.pr_id = patron_request_search_view.id" + def.AddField("item_id", NewFieldExistsString("item", "cql_item", itemCorrelation, "cql_item.item_id")) + def.AddField("barcode", NewFieldExistsString("item", "cql_item", itemCorrelation, "cql_item.barcode")) + def.AddField("call_number", NewFieldExistsString("item", "cql_item", itemCorrelation, "cql_item.call_number")) + f = pgcql.NewFieldString().WithLikeOps() def.AddField("patron", f) diff --git a/broker/patron_request/db/prcql_test.go b/broker/patron_request/db/prcql_test.go index 895a3c0b..7e55a8cd 100644 --- a/broker/patron_request/db/prcql_test.go +++ b/broker/patron_request/db/prcql_test.go @@ -98,6 +98,121 @@ func TestHandlePatronRequestsQueryIsbnUsesNormIsxn(t *testing.T) { } } +func TestFieldExistsStringGenerate(t *testing.T) { + f := NewFieldExistsString("item", "i", "i.pr_id = pr.id", "i.barcode") + + t.Run("eq uses exists with string field predicate", func(t *testing.T) { + sc := searchClauseForTest("abc", "=") + gotSQL, gotArgs, err := f.Generate(sc, 3) + if err != nil { + t.Fatalf("Generate() error = %v", err) + } + wantSQL := "EXISTS (SELECT 1 FROM item i WHERE i.pr_id = pr.id AND i.barcode = $3)" + if gotSQL != wantSQL { + t.Fatalf("sql = %q, want %q", gotSQL, wantSQL) + } + if len(gotArgs) != 1 || gotArgs[0] != "abc" { + t.Fatalf("args = %#v, want one raw term arg", gotArgs) + } + }) + + t.Run("wildcard eq uses exists with like predicate", func(t *testing.T) { + sc := searchClauseForTest("abc*", "=") + gotSQL, gotArgs, err := f.Generate(sc, 4) + if err != nil { + t.Fatalf("Generate() error = %v", err) + } + wantSQL := "EXISTS (SELECT 1 FROM item i WHERE i.pr_id = pr.id AND i.barcode LIKE $4)" + if gotSQL != wantSQL { + t.Fatalf("sql = %q, want %q", gotSQL, wantSQL) + } + if len(gotArgs) != 1 || gotArgs[0] != "abc%" { + t.Fatalf("args = %#v, want wildcard-converted term arg", gotArgs) + } + }) + + t.Run("ne uses not exists with positive string field predicate", func(t *testing.T) { + sc := searchClauseForTest("abc*", "<>") + gotSQL, gotArgs, err := f.Generate(sc, 5) + if err != nil { + t.Fatalf("Generate() error = %v", err) + } + wantSQL := "NOT EXISTS (SELECT 1 FROM item i WHERE i.pr_id = pr.id AND i.barcode LIKE $5)" + if gotSQL != wantSQL { + t.Fatalf("sql = %q, want %q", gotSQL, wantSQL) + } + if len(gotArgs) != 1 || gotArgs[0] != "abc%" { + t.Fatalf("args = %#v, want wildcard-converted term arg", gotArgs) + } + }) + + t.Run("empty eq checks no non-empty related value", func(t *testing.T) { + sc := searchClauseForTest("", "=") + gotSQL, gotArgs, err := f.Generate(sc, 6) + if err != nil { + t.Fatalf("Generate() error = %v", err) + } + wantSQL := "NOT EXISTS (SELECT 1 FROM item i WHERE i.pr_id = pr.id AND COALESCE(i.barcode, '') <> '')" + if gotSQL != wantSQL { + t.Fatalf("sql = %q, want %q", gotSQL, wantSQL) + } + if len(gotArgs) != 0 { + t.Fatalf("args = %#v, want empty args", gotArgs) + } + }) + + t.Run("empty ne checks at least one non-empty related value", func(t *testing.T) { + sc := searchClauseForTest("", "<>") + gotSQL, gotArgs, err := f.Generate(sc, 7) + if err != nil { + t.Fatalf("Generate() error = %v", err) + } + wantSQL := "EXISTS (SELECT 1 FROM item i WHERE i.pr_id = pr.id AND COALESCE(i.barcode, '') <> '')" + if gotSQL != wantSQL { + t.Fatalf("sql = %q, want %q", gotSQL, wantSQL) + } + if len(gotArgs) != 0 { + t.Fatalf("args = %#v, want empty args", gotArgs) + } + }) +} + +func TestHandlePatronRequestsQueryItemFieldsUseExists(t *testing.T) { + tests := []struct { + name string + cql string + wantWhere string + }{ + { + name: "item_id exact", + cql: `item_id = "item-123"`, + wantWhere: "EXISTS (SELECT 1 FROM item cql_item WHERE cql_item.pr_id = patron_request_search_view.id AND cql_item.item_id = $3)", + }, + { + name: "barcode wildcard", + cql: `barcode = "abc*"`, + wantWhere: "EXISTS (SELECT 1 FROM item cql_item WHERE cql_item.pr_id = patron_request_search_view.id AND cql_item.barcode LIKE $3)", + }, + { + name: "call_number empty", + cql: `call_number = ""`, + wantWhere: "NOT EXISTS (SELECT 1 FROM item cql_item WHERE cql_item.pr_id = patron_request_search_view.id AND COALESCE(cql_item.call_number, '') <> '')", + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + query, err := handlePatronRequestsQuery(tc.cql, 2) + if err != nil { + t.Fatalf("handlePatronRequestsQuery() error = %v", err) + } + if got := query.GetWhereClause(); got != tc.wantWhere { + t.Fatalf("where clause = %q, want %q", got, tc.wantWhere) + } + }) + } +} + func searchClauseForTest(term, relation string) cql.SearchClause { return cql.SearchClause{Term: term, Relation: cql.Relation(relation)} } diff --git a/broker/sqlc/pr_schema.sql b/broker/sqlc/pr_schema.sql index 66f39149..877a3249 100644 --- a/broker/sqlc/pr_schema.sql +++ b/broker/sqlc/pr_schema.sql @@ -40,6 +40,17 @@ CREATE TABLE item created_at TIMESTAMP NOT NULL DEFAULT now() ); +CREATE INDEX idx_item_barcode_pr_id + ON item (barcode, pr_id); + +CREATE INDEX idx_item_item_id_pr_id + ON item (item_id, pr_id) + WHERE item_id IS NOT NULL; + +CREATE INDEX idx_item_call_number_pr_id + ON item (call_number, pr_id) + WHERE call_number IS NOT NULL; + CREATE TABLE notification ( id VARCHAR PRIMARY KEY, diff --git a/broker/test/patron_request/db/prrepo_test.go b/broker/test/patron_request/db/prrepo_test.go index 9c4a13ee..0943e6e0 100644 --- a/broker/test/patron_request/db/prrepo_test.go +++ b/broker/test/patron_request/db/prrepo_test.go @@ -307,6 +307,7 @@ func TestNotification(t *testing.T) { func TestListPatronRequests(t *testing.T) { prIds := []string{} + itemIds := []string{} // Create 2 requests for i := 0; i < 2; i++ { @@ -373,6 +374,48 @@ func TestListPatronRequests(t *testing.T) { }) assert.NoError(t, err) } + firstItemId := uuid.NewString() + itemIds = append(itemIds, firstItemId) + _, err := prRepo.SaveItem(appCtx, pr_db.SaveItemParams{ + ID: firstItemId, + PrID: prIds[0], + Barcode: "barcode-123", + CallNumber: pgtype.Text{ + String: "call-123", + Valid: true, + }, + Title: pgtype.Text{ + String: "Item title", + Valid: true, + }, + ItemID: pgtype.Text{ + String: "item-123", + Valid: true, + }, + CreatedAt: pgtype.Timestamp{ + Time: time.Now(), + Valid: true, + }, + }) + assert.NoError(t, err) + + secondItemId := uuid.NewString() + itemIds = append(itemIds, secondItemId) + _, err = prRepo.SaveItem(appCtx, pr_db.SaveItemParams{ + ID: secondItemId, + PrID: prIds[0], + Barcode: "barcode-456", + Title: pgtype.Text{ + String: "Second item title", + Valid: true, + }, + CreatedAt: pgtype.Timestamp{ + Time: time.Now(), + Valid: true, + }, + }) + assert.NoError(t, err) + cql := "title = Androids" list, fullCount, err := prRepo.ListPatronRequests(appCtx, pr_db.ListPatronRequestsParams{ Limit: 1, @@ -455,6 +498,76 @@ func TestListPatronRequests(t *testing.T) { assert.Len(t, list, 2) assert.Equal(t, int64(2), fullCount) + cql = `item_id = "item-123"` + list, fullCount, err = prRepo.ListPatronRequests(appCtx, pr_db.ListPatronRequestsParams{ + Limit: 10, + Offset: 0, + }, &cql) + assert.NoError(t, err) + assert.Len(t, list, 1) + assert.Equal(t, prIds[0], list[0].ID) + assert.Equal(t, int64(1), fullCount) + + cql = `barcode = "barcode-123"` + list, fullCount, err = prRepo.ListPatronRequests(appCtx, pr_db.ListPatronRequestsParams{ + Limit: 10, + Offset: 0, + }, &cql) + assert.NoError(t, err) + assert.Len(t, list, 1) + assert.Equal(t, prIds[0], list[0].ID) + assert.Equal(t, int64(1), fullCount) + + cql = `barcode = "barcode-*"` + list, fullCount, err = prRepo.ListPatronRequests(appCtx, pr_db.ListPatronRequestsParams{ + Limit: 10, + Offset: 0, + }, &cql) + assert.NoError(t, err) + assert.Len(t, list, 1) + assert.Equal(t, prIds[0], list[0].ID) + assert.Equal(t, int64(1), fullCount) + + cql = `call_number = "call-123"` + list, fullCount, err = prRepo.ListPatronRequests(appCtx, pr_db.ListPatronRequestsParams{ + Limit: 10, + Offset: 0, + }, &cql) + assert.NoError(t, err) + assert.Len(t, list, 1) + assert.Equal(t, prIds[0], list[0].ID) + assert.Equal(t, int64(1), fullCount) + + cql = `barcode <> "barcode-123"` + list, fullCount, err = prRepo.ListPatronRequests(appCtx, pr_db.ListPatronRequestsParams{ + Limit: 10, + Offset: 0, + }, &cql) + assert.NoError(t, err) + assert.Len(t, list, 1) + assert.Equal(t, prIds[1], list[0].ID) + assert.Equal(t, int64(1), fullCount) + + cql = `call_number = ""` + list, fullCount, err = prRepo.ListPatronRequests(appCtx, pr_db.ListPatronRequestsParams{ + Limit: 10, + Offset: 0, + }, &cql) + assert.NoError(t, err) + assert.Len(t, list, 1) + assert.Equal(t, prIds[1], list[0].ID) + assert.Equal(t, int64(1), fullCount) + + cql = `call_number <> ""` + list, fullCount, err = prRepo.ListPatronRequests(appCtx, pr_db.ListPatronRequestsParams{ + Limit: 10, + Offset: 0, + }, &cql) + assert.NoError(t, err) + assert.Len(t, list, 1) + assert.Equal(t, prIds[0], list[0].ID) + assert.Equal(t, int64(1), fullCount) + // not found cql = "title = banners" list, fullCount, err = prRepo.ListPatronRequests(appCtx, pr_db.ListPatronRequestsParams{ @@ -484,6 +597,10 @@ func TestListPatronRequests(t *testing.T) { assert.Len(t, list, 1) assert.Equal(t, int64(2), fullCount) + for _, itemId := range itemIds { + err = prRepo.DeleteItemById(appCtx, itemId) + assert.NoError(t, err) + } for _, prId := range prIds { err = prRepo.DeletePatronRequest(appCtx, prId) assert.NoError(t, err) diff --git a/bruno/crosslink/PR Happy flow/Lending side create pull slip.bru b/bruno/crosslink/PR Happy flow/Lending side create pull slip.bru index 416daa2807ebf1c36533e4b63c6cc33a790dd4d6..5da641c46988f4b18a2757c9223d1024098cd36b 100644 GIT binary patch literal 6931 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 Date: Sat, 23 May 2026 12:18:29 +0200 Subject: [PATCH 2/2] Rename --- ...tem_cql_indexes.down.sql => 040_add_item_cql_indexes.down.sql} | 0 ...dd_item_cql_indexes.up.sql => 040_add_item_cql_indexes.up.sql} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename broker/migrations/{034_add_item_cql_indexes.down.sql => 040_add_item_cql_indexes.down.sql} (100%) rename broker/migrations/{034_add_item_cql_indexes.up.sql => 040_add_item_cql_indexes.up.sql} (100%) diff --git a/broker/migrations/034_add_item_cql_indexes.down.sql b/broker/migrations/040_add_item_cql_indexes.down.sql similarity index 100% rename from broker/migrations/034_add_item_cql_indexes.down.sql rename to broker/migrations/040_add_item_cql_indexes.down.sql diff --git a/broker/migrations/034_add_item_cql_indexes.up.sql b/broker/migrations/040_add_item_cql_indexes.up.sql similarity index 100% rename from broker/migrations/034_add_item_cql_indexes.up.sql rename to broker/migrations/040_add_item_cql_indexes.up.sql