@@ -5,142 +5,142 @@ import (
55 "slices"
66
77 "github.com/meshery/meshkit/database"
8- "github.com/meshery/schemas/models/v1alpha3/relationship"
8+ relationship "github.com/meshery/schemas/models/v1alpha3/relationship"
99
1010 "gorm.io/gorm"
1111)
1212
13- type RelationshipSummaryFilter struct {
14- Kind string
15- Greedy bool
16- SubType string
17- RelationshipType string
18- Version string
19- ModelName string
20- Status string
21- Include []RelationshipSummaryDimension
22- }
23-
24- type RelationshipSummaryDimension string
25-
26- const (
27- RelationshipSummaryByModel RelationshipSummaryDimension = "by_model"
28- RelationshipSummaryByKind RelationshipSummaryDimension = "by_kind"
29- RelationshipSummaryByType RelationshipSummaryDimension = "by_type"
30- RelationshipSummaryBySubType RelationshipSummaryDimension = "by_subtype"
31- )
32-
33- type RelationshipGroupEntry struct {
34- Key string
35- Count int
36- }
37-
38- func (r RelationshipGroupEntry ) KeyValue () string {
39- return r .Key
40- }
41- func (r RelationshipGroupEntry ) CountValue () int {
42- return r .Count
43- }
44-
45- type RelationshipSummary struct {
46- Total int64
47- ByModel []RelationshipGroupEntry
48- ByKind []RelationshipGroupEntry
49- ByType []RelationshipGroupEntry
50- BySubType []RelationshipGroupEntry
51- }
52-
53- func (relationshipFilter * RelationshipSummaryFilter ) Validate () error {
54- for _ , dim := range relationshipFilter .Include {
55- switch dim {
56- case RelationshipSummaryByModel , RelationshipSummaryByKind , RelationshipSummaryByType , RelationshipSummaryBySubType :
57- // valid
58- default :
59- return fmt .Errorf ("unknown include dimension %s" , dim )
60- }
61- }
62- return nil
63- }
64-
65- func (relationshipFilter * RelationshipSummaryFilter ) GetSummary (db * database.Handler ) (* RelationshipSummary , error ) {
66- if err := relationshipFilter .Validate (); err != nil {
13+ func GetSummary (relationshipFilter * relationship.RelationshipSummaryFilter , db * database.Handler ) (* relationship.RelationshipSummary , error ) {
14+ if err := validate (relationshipFilter ); err != nil {
6715 return nil , err
6816 }
69- summary := & RelationshipSummary {}
7017
71- base := db .Model (& relationship.RelationshipDefinition {}).
18+ summary := & relationship.RelationshipSummary {}
19+
20+ base := db .Table ("relationship_definition_dbs" ).
7221 Joins ("JOIN model_dbs ON relationship_definition_dbs.model_id = model_dbs.id" ).
7322 Joins ("JOIN category_dbs ON model_dbs.category_id = category_dbs.id" )
7423
7524 status := "enabled"
7625
77- if relationshipFilter .Status != "" {
78- status = relationshipFilter .Status
26+ if relationshipFilter .Status != nil {
27+ status = * relationshipFilter .Status
7928 }
8029
8130 base = base .Where ("model_dbs.status = ?" , status )
8231
83- if relationshipFilter .Kind != "" {
84- if relationshipFilter .Greedy {
85- base = base .Where ("relationship_definition_dbs.kind LIKE ?" , "%" + relationshipFilter .Kind + "%" )
32+ if relationshipFilter .Kind != nil {
33+ greedy := relationshipFilter .Greedy != nil && * relationshipFilter .Greedy
34+ if greedy {
35+ base = base .Where ("relationship_definition_dbs.kind LIKE ?" , "%" + * relationshipFilter .Kind + "%" )
8636 } else {
87- base = base .Where ("relationship_definition_dbs.kind = ?" , relationshipFilter .Kind )
37+ base = base .Where ("relationship_definition_dbs.kind = ?" , * relationshipFilter .Kind )
8838 }
8939 }
9040
91- if relationshipFilter .RelationshipType != "" {
92- base = base .Where ("relationship_definition_dbs.type = ?" , relationshipFilter .RelationshipType )
41+ if relationshipFilter .RelationshipType != nil {
42+ base = base .Where ("relationship_definition_dbs.type = ?" , * relationshipFilter .RelationshipType )
9343 }
9444
95- if relationshipFilter .SubType != "" {
96- base = base .Where ("relationship_definition_dbs.sub_type = ?" , relationshipFilter .SubType )
45+ if relationshipFilter .SubType != nil {
46+ base = base .Where ("relationship_definition_dbs.sub_type = ?" , * relationshipFilter .SubType )
9747 }
98- if relationshipFilter .ModelName != "" {
99- base = base .Where ("model_dbs.name = ?" , relationshipFilter .ModelName )
48+ if relationshipFilter .ModelName != nil {
49+ base = base .Where ("model_dbs.name = ?" , * relationshipFilter .ModelName )
10050 }
101- if relationshipFilter .Version != "" {
102- base = base .Where ("model_dbs.model->>'version' = ?" , relationshipFilter .Version )
51+ if relationshipFilter .Version != nil {
52+ base = base .Where ("model_dbs.model->>'version' = ?" , * relationshipFilter .Version )
10353 }
10454 if err := base .Session (& gorm.Session {}).
10555 Distinct ("relationship_definition_dbs.id" ).
10656 Count (& summary .Total ).Error ; err != nil {
10757 return nil , err
10858 }
10959
110- shouldCompute := func (dim RelationshipSummaryDimension ) bool {
111- if len (relationshipFilter .Include ) == 0 {
60+ shouldCompute := func (dim relationship. RelationshipSummaryFilterInclude ) bool {
61+ if relationshipFilter . Include == nil || len (* relationshipFilter .Include ) == 0 {
11262 return true
11363 }
11464
115- return slices .Contains (relationshipFilter .Include , dim )
65+ return slices .Contains (* relationshipFilter .Include , dim )
66+ }
67+
68+ type groupEntry = struct {
69+ Count int32 `json:"count" yaml:"count"`
70+ Key string `json:"key" yaml:"key"`
11671 }
11772
11873 type dimensionInfo struct {
119- dim RelationshipSummaryDimension
74+ dim relationship. RelationshipSummaryFilterInclude
12075 selectExpr string
12176 groupExpr string
122- receiver * [] RelationshipGroupEntry
77+ setRows func ([] groupEntry )
12378 }
12479
12580 dimensions := []dimensionInfo {
126- {RelationshipSummaryByModel , "model_dbs.name as Key, COUNT(DISTINCT(relationship_definition_dbs.id)) as Count" , "model_dbs.name" , & summary .ByModel },
127- {RelationshipSummaryByKind , "relationship_definition_dbs.kind as Key, COUNT(DISTINCT(relationship_definition_dbs.id)) as Count" , "relationship_definition_dbs.kind" , & summary .ByKind },
128- {RelationshipSummaryByType , "relationship_definition_dbs.type as Key, COUNT(DISTINCT(relationship_definition_dbs.id)) as Count" , "relationship_definition_dbs.type" , & summary .ByType },
129- {RelationshipSummaryBySubType , "relationship_definition_dbs.sub_type as Key, COUNT(DISTINCT(relationship_definition_dbs.id)) as Count" , "relationship_definition_dbs.sub_type" , & summary .BySubType },
81+ {
82+ dim : relationship .ByModel ,
83+ selectExpr : "model_dbs.name as Key, COUNT(DISTINCT(relationship_definition_dbs.id)) as Count" ,
84+ groupExpr : "model_dbs.name" ,
85+ setRows : func (rows []groupEntry ) {
86+ summary .ByModel = & rows
87+ },
88+ },
89+ {
90+ dim : relationship .ByKind ,
91+ selectExpr : "relationship_definition_dbs.kind as Key, COUNT(DISTINCT(relationship_definition_dbs.id)) as Count" ,
92+ groupExpr : "relationship_definition_dbs.kind" ,
93+ setRows : func (rows []groupEntry ) {
94+ summary .ByKind = & rows
95+ },
96+ },
97+ {
98+ dim : relationship .ByType ,
99+ selectExpr : "relationship_definition_dbs.type as Key, COUNT(DISTINCT(relationship_definition_dbs.id)) as Count" ,
100+ groupExpr : "relationship_definition_dbs.type" ,
101+ setRows : func (rows []groupEntry ) {
102+ summary .ByType = & rows
103+ },
104+ },
105+ {
106+ dim : relationship .BySubtype ,
107+ selectExpr : "relationship_definition_dbs.sub_type as Key, COUNT(DISTINCT(relationship_definition_dbs.id)) as Count" ,
108+ groupExpr : "relationship_definition_dbs.sub_type" ,
109+ setRows : func (rows []groupEntry ) {
110+ summary .BySubType = & rows
111+ },
112+ },
130113 }
131114
132115 for _ , d := range dimensions {
133116 if shouldCompute (d .dim ) {
134- var rows []RelationshipGroupEntry
117+ var rows []groupEntry
135118 err := base .Session (& gorm.Session {}).
136119 Select (d .selectExpr ).
137120 Group (d .groupExpr ).
138121 Scan (& rows ).Error
139122 if err != nil {
140123 return nil , err
141124 }
142- * d . receiver = rows
125+ d . setRows ( rows )
143126 }
144127 }
145128 return summary , nil
146129}
130+
131+ func validate (relationshipFilter * relationship.RelationshipSummaryFilter ) error {
132+ if relationshipFilter == nil {
133+ return fmt .Errorf ("nil relationship summary filter" )
134+ }
135+
136+ if relationshipFilter .Include == nil {
137+ return nil
138+ }
139+
140+ for _ , dim := range * relationshipFilter .Include {
141+ if ! dim .Valid () {
142+ return fmt .Errorf ("unknown include dimension %s" , dim )
143+ }
144+ }
145+ return nil
146+ }
0 commit comments