Skip to content

Commit

Permalink
Merge pull request #250 from Revolyssup/models
Browse files Browse the repository at this point in the history
Add support for greedy search,sort,page,pagesize
  • Loading branch information
Revolyssup authored Jan 11, 2023
2 parents 48d2239 + dd28c03 commit 9488a38
Show file tree
Hide file tree
Showing 4 changed files with 189 additions and 20 deletions.
77 changes: 68 additions & 9 deletions models/meshmodel/core/v1alpha1/component.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ package v1alpha1

import (
"encoding/json"
"fmt"
"sync"
"time"

"github.com/google/uuid"
"github.com/layer5io/meshkit/database"
"github.com/layer5io/meshkit/models/meshmodel/core/types"
"gorm.io/gorm"
"gorm.io/gorm/clause"
)

type TypeMeta struct {
Expand Down Expand Up @@ -47,6 +49,8 @@ type ComponentDefinitionDB struct {
CreatedAt time.Time `json:"-"`
UpdatedAt time.Time `json:"-"`
}

// swagger:response Model
type Model struct {
ID uuid.UUID `json:"-"`
Name string `json:"name"`
Expand Down Expand Up @@ -104,28 +108,78 @@ func GetComponents(db *database.Handler, f ComponentFilter) (c []ComponentDefini
if f.ModelName != "" {
var models []Model
_ = db.Where("name = ?", f.ModelName).Find(&models).Error
if f.Name == "" {
_ = db.Find(&cdb).Error
} else {
_ = db.Where("kind = ?", f.Name).Find(&cdb).Error
finder := db.Model(&cdb)
if f.OrderOn != "" {
if f.Sort == "desc" {
finder = finder.Order(clause.OrderByColumn{Column: clause.Column{Name: f.OrderOn}, Desc: true})
} else {
finder = finder.Order(f.OrderOn)
}
}
skipLimit := false
if f.Limit == 0 {
skipLimit = true
}
if f.Name != "" {
if f.Greedy {
finder = finder.Where("kind LIKE ?", f.Name+"%")
} else {
finder = finder.Where("kind = ?", f.Name)
}
}
_ = finder.Find(&cdb).Error
for _, comp := range cdb {
for _, mod := range models {
if mod.ID == comp.ModelID {
c = append(c, comp.GetComponentDefinition(mod))
//TODO: Use model id as foreign key in above DB calls instead of making comparisons here
if f.Offset == 0 {
if skipLimit || f.Limit > 0 {
for _, mod := range models {
if mod.ID == comp.ModelID {
c = append(c, comp.GetComponentDefinition(mod))
f.Limit--
continue
}
}
}
} else {
f.Offset--
}
}
} else if f.Name != "" {
_ = db.Where("kind = ?", f.Name).Find(&cdb).Error
finder := db.Model(&cdb)
if f.Greedy {
finder = finder.Where("kind LIKE ?", f.Name+"%")
} else {
finder = finder.Where("kind = ?", f.Name)
}
if f.OrderOn != "" {
if f.Sort == "desc" {
finder = finder.Order(fmt.Sprintf("%s DESC", f.OrderOn))
} else {
finder = finder.Order(f.OrderOn)
}
}
if f.Limit != 0 {
finder = finder.Limit(f.Limit)
}
if f.Offset != 0 {
finder = finder.Offset(f.Offset)
}
_ = finder.Find(&cdb).Error
for _, compdb := range cdb {
var model Model
db.First(&model, "id = ?", compdb.ModelID)
comp := compdb.GetComponentDefinition(model)
c = append(c, comp)
}
} else {
db.Find(&cdb)
finder := db.Model(&cdb)
if f.Limit != 0 {
finder = finder.Limit(f.Limit)
}
if f.Offset != 0 {
finder = finder.Offset(f.Offset)
}
finder.Find(&cdb)
for _, compdb := range cdb {
var model Model
db.First(&model, "id = ?", compdb.ModelID)
Expand All @@ -148,8 +202,13 @@ func GetComponents(db *database.Handler, f ComponentFilter) (c []ComponentDefini

type ComponentFilter struct {
Name string
Greedy bool //when set to true - instead of an exact match, name will be prefix matched
ModelName string
Version string
Sort string //asc or desc. Default behavior is asc
OrderOn string
Limit int //If 0 or unspecified then all records are returned and limit is not used
Offset int
}

// Create the filter from map[string]interface{}
Expand Down
5 changes: 5 additions & 0 deletions models/meshmodel/core/v1alpha1/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,13 @@ package v1alpha1

type ModelFilter struct {
Name string
Greedy bool //when set to true - instead of an exact match, name will be prefix matched
Version string
Category string
OrderOn string
Sort string //asc or desc. Default behavior is asc
Limit int //If 0 or unspecified then all records are returned and limit is not used
Offset int
}

// Create the filter from map[string]interface{}
Expand Down
107 changes: 97 additions & 10 deletions models/meshmodel/core/v1alpha1/relationship.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ package v1alpha1

import (
"encoding/json"
"fmt"
"time"

"github.com/google/uuid"
"github.com/layer5io/meshkit/database"
"github.com/layer5io/meshkit/models/meshmodel/core/types"
"gorm.io/gorm"
"gorm.io/gorm/clause"
)

// https://docs.google.com/drawings/d/1_qzQ_YxvCWPYrOBcdqGMlMwfbsZx96SBuIkbn8TfKhU/edit?pli=1
Expand Down Expand Up @@ -41,8 +43,14 @@ type RelationshipDefinitionDB struct {
// TODO: Add support for Model
type RelationshipFilter struct {
Kind string
Greedy bool //when set to true - instead of an exact match, kind will be prefix matched
SubType string
Version string
ModelName string
OrderOn string
Sort string //asc or desc. Default behavior is asc
Limit int //If 0 or unspecified then all records are returned and limit is not used
Offset int
}

// Create the filter from map[string]interface{}
Expand All @@ -54,18 +62,97 @@ func (rf *RelationshipFilter) Create(m map[string]interface{}) {

func GetRelationships(db *database.Handler, f RelationshipFilter) (rs []RelationshipDefinition) {
var rdb []RelationshipDefinitionDB
// GORM takes care of drafting the correct SQL
// https://gorm.io/docs/query.html#Struct-amp-Map-Conditions
_ = db.Where(&RelationshipDefinitionDB{SubType: f.SubType, TypeMeta: TypeMeta{Kind: f.Kind}}).Find(&rdb)
for _, reldb := range rdb {
var mod Model
if f.ModelName != "" {
db.Where("id = ?", reldb.ModelID).Where("name = ?", f.ModelName).Find(&mod)
if f.ModelName != "" {
var models []Model
_ = db.Where("name = ?", f.ModelName).Find(&models).Error
finder := db.Model(&rdb)
if f.OrderOn != "" {
if f.Sort == "desc" {
finder = finder.Order(clause.OrderByColumn{Column: clause.Column{Name: f.OrderOn}, Desc: true})
} else {
finder = finder.Order(f.OrderOn)
}
}
if mod.Name != "" { //relationships with a valid model name will be returned
rel := reldb.GetRelationshipDefinition(mod)
rs = append(rs, rel)
skipLimit := false
if f.Limit == 0 {
skipLimit = true
}
if f.Kind != "" {
if f.Greedy {
finder = finder.Where("kind LIKE ?", f.Kind+"%")
} else {
finder = finder.Where("kind = ?", f.Kind)
}
}
_ = finder.Find(&rdb).Error
for _, rel := range rdb {
//TODO: Use model id as foreign key in above DB calls instead of making comparisons here
if f.Offset == 0 {
if skipLimit || f.Limit > 0 {
for _, mod := range models {
if mod.ID == rel.ModelID {
rs = append(rs, rel.GetRelationshipDefinition(mod))
f.Limit--
continue
}
}
}
} else {
f.Offset--
}
}
} else if f.Kind != "" {
finder := db.Model(&rdb)
if f.Greedy {
finder = finder.Where("kind LIKE ?", f.Kind+"%")
} else {
finder = finder.Where("kind = ?", f.Kind)
}
if f.OrderOn != "" {
if f.Sort == "desc" {
finder = finder.Order(fmt.Sprintf("%s DESC", f.OrderOn))
} else {
finder = finder.Order(f.OrderOn)
}
}
if f.Limit != 0 {
finder = finder.Limit(f.Limit)
}
if f.Offset != 0 {
finder = finder.Offset(f.Offset)
}
_ = finder.Find(&rdb).Error
for _, compdb := range rdb {
var model Model
db.First(&model, "id = ?", compdb.ModelID)
comp := compdb.GetRelationshipDefinition(model)
rs = append(rs, comp)
}
} else {
finder := db.Model(&rdb)
if f.Limit != 0 {
finder = finder.Limit(f.Limit)
}
if f.Offset != 0 {
finder = finder.Offset(f.Offset)
}
finder.Find(&rdb)
for _, compdb := range rdb {
var model Model
db.First(&model, "id = ?", compdb.ModelID)
comp := compdb.GetRelationshipDefinition(model)
rs = append(rs, comp)
}
}

if f.Version != "" {
var vrel []RelationshipDefinition
for _, r := range rs {
if r.Model.Version == f.Version {
vrel = append(vrel, r)
}
}
return vrel
}
return
}
Expand Down
20 changes: 19 additions & 1 deletion models/meshmodel/registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/layer5io/meshkit/database"
"github.com/layer5io/meshkit/models/meshmodel/core/types"
"github.com/layer5io/meshkit/models/meshmodel/core/v1alpha1"
"gorm.io/gorm/clause"
)

// MeshModelRegistrantData struct defines the body of the POST request that is sent to the capability
Expand Down Expand Up @@ -155,14 +156,31 @@ func (rm *RegistryManager) GetModels(f types.Filter) []v1alpha1.Model {
finder := rm.db.Model(&mod)
if mf, ok := f.(*v1alpha1.ModelFilter); ok {
if mf.Name != "" {
finder = finder.Where("name = ?", mf.Name)
if mf.Greedy {
finder = finder.Where("name LIKE ?", mf.Name+"%")
} else {
finder = finder.Where("name = ?", mf.Name)
}
}
if mf.Version != "" {
finder = finder.Where("version = ?", mf.Version)
}
if mf.Category != "" {
finder = finder.Where("category = ?", mf.Category)
}
if mf.OrderOn != "" {
if mf.Sort == "desc" {
finder = finder.Order(clause.OrderByColumn{Column: clause.Column{Name: mf.OrderOn}, Desc: true})
} else {
finder = finder.Order(mf.OrderOn)
}
}
if mf.Limit != 0 {
finder = finder.Limit(mf.Limit)
}
if mf.Offset != 0 {
finder = finder.Offset(mf.Offset)
}
}
_ = finder.Find(&mod).Error
return mod
Expand Down

0 comments on commit 9488a38

Please sign in to comment.