Skip to content

Commit

Permalink
add set dynamic to cql-lint
Browse files Browse the repository at this point in the history
  • Loading branch information
FrancoLiberali committed Jan 8, 2024
1 parent c84e7a3 commit 92c90e0
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 12 deletions.
34 changes: 22 additions & 12 deletions cql-lint/pkg/analyzer/analyzer.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,11 @@ var Analyzer = &analysis.Analyzer{
}

var (
cqlMethods = []string{"Query", "Update", "Delete"}
cqlOrder = []string{"Descending", "Ascending"}
cqlSet = []string{"SetMultiple"}
cqlSelectors = append(cqlOrder, cqlSet...)
cqlMethods = []string{"Query", "Update", "Delete"}
cqlOrder = []string{"Descending", "Ascending"}
cqlSetMultiple = "SetMultiple"
cqlSet = "Set"
cqlSelectors = append(cqlOrder, cqlSetMultiple, cqlSet)
)

type Position struct {
Expand Down Expand Up @@ -78,9 +79,7 @@ func run(pass *analysis.Pass) (interface{}, error) {
return nil, nil //nolint:nilnil // is necessary
}

// TODO set dynamic

// Finds errors in selector functions: Descending, Ascending, SetMultiple
// Finds errors in selector functions: Descending, Ascending, SetMultiple, Set
func findForSelector(callExpr *ast.CallExpr, positionsToReport []Position) []Position {
selectorExpr := callExpr.Fun.(*ast.SelectorExpr)

Expand All @@ -93,14 +92,25 @@ func findForSelector(callExpr *ast.CallExpr, positionsToReport []Position) []Pos
for _, arg := range callExpr.Args {
var model Model

if pie.Contains(cqlOrder, selectorExpr.Sel.Name) {
methodName := selectorExpr.Sel.Name

if pie.Contains(cqlOrder, methodName) {
model = getModel(arg.(*ast.SelectorExpr).X.(*ast.SelectorExpr))
positionsToReport = addPositionsToReport(positionsToReport, models, model)
} else {
// TODO tambien podria ser ser set dynamic que es distitno, hay que unificar para que ambos sean un solo llamado
model = getModel(arg.(*ast.CallExpr).Fun.(*ast.SelectorExpr).X.(*ast.CallExpr).Fun.(*ast.SelectorExpr).X.(*ast.SelectorExpr).X.(*ast.SelectorExpr))
}
argCallExpr := arg.(*ast.CallExpr)
setFunction := argCallExpr.Fun.(*ast.SelectorExpr).Sel.Name

positionsToReport = addPositionsToReport(positionsToReport, models, model)
if setFunction == "Dynamic" {
model = getModel(argCallExpr.Args[0].(*ast.CallExpr).Fun.(*ast.SelectorExpr).X.(*ast.SelectorExpr).X.(*ast.SelectorExpr))
positionsToReport = addPositionsToReport(positionsToReport, models, model)
}

if methodName == cqlSetMultiple {
model = getModel(argCallExpr.Fun.(*ast.SelectorExpr).X.(*ast.CallExpr).Fun.(*ast.SelectorExpr).X.(*ast.SelectorExpr).X.(*ast.SelectorExpr))
positionsToReport = addPositionsToReport(positionsToReport, models, model)
}
}
}

return positionsToReport
Expand Down
71 changes: 71 additions & 0 deletions cql-lint/pkg/analyzer/testdata/src/a/set.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,77 @@ import (
"github.com/FrancoLiberali/cql/test/models"
)

func testSetDynamicNotJoinedInSameLine() {
cql.Update[models.Brand](
db,
conditions.Brand.Name.Is().Eq("asd"),
).Set(conditions.Brand.Name.Set().Dynamic(conditions.City.Name.Value())) // want "conditions.City is not joined by the query"
}

func testSetDynamicNotJoinedInDifferentLines() {
cql.Update[models.Brand](
db,
conditions.Brand.Name.Is().Eq("asd"),
).Set(conditions.Brand.Name.Set().Dynamic(
conditions.City.Name.Value(), // want "conditions.City is not joined by the query"
))
}

func testSetDynamicMainModel() {
cql.Update[models.Brand](
db,
conditions.Brand.Name.IsDynamic().Eq(conditions.City.Name.Value()), // want "conditions.City is not joined by the query"
).Set(
conditions.Brand.Name.Set().Dynamic(
// TODO verificar que no sea el mismo
conditions.Brand.Name.Value(),
),
)
}

func testSetDynamicMainModelMultipleTimes() {
cql.Update[models.Brand](
db,
conditions.Brand.Name.IsDynamic().Eq(conditions.City.Name.Value()), // want "conditions.City is not joined by the query"
).Set(
// TODO ver que no se repitan
conditions.Brand.Name.Set().Dynamic(
// TODO verificar que no sea el mismo
conditions.Brand.Name.Value(),
),
conditions.Brand.Name.Set().Dynamic(
// TODO verificar que no sea el mismo
conditions.Brand.Name.Value(),
),
)
}

func testSetDynamicJoinedModel() {
cql.Update[models.Phone](
db,
conditions.Phone.Brand(),
conditions.Phone.Name.IsDynamic().Eq(conditions.City.Name.Value()), // want "conditions.City is not joined by the query"
).Set(
// TODO ver que no se repitan
conditions.Phone.Name.Set().Dynamic(conditions.Brand.Name.Value()),
conditions.Phone.Name.Set().Dynamic(conditions.Brand.Name.Value()),
)
}

func testSetDynamicNestedJoinedModel() {
cql.Update[models.Child](
db,
conditions.Child.Parent1(
conditions.Parent1.ParentParent(),
),
conditions.Child.Name.IsDynamic().Eq(conditions.City.Name.Value()), // want "conditions.City is not joined by the query"
).Set(
// TODO ver que no se repitan
conditions.Child.Name.Set().Dynamic(conditions.Parent1.Name.Value()),
conditions.Child.Name.Set().Dynamic(conditions.ParentParent.Name.Value()),
)
}

func testSetMultipleNotJoinedInSameLine() {
cql.Update[models.Brand](
db,
Expand Down
14 changes: 14 additions & 0 deletions test/update_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,20 @@ func (ts *UpdateIntTestSuite) TestUpdateDynamic() {
ts.NotEqual(pixel.UpdatedAt.UnixMicro(), phoneReturned.UpdatedAt.UnixMicro())
}

func (ts *UpdateIntTestSuite) TestUpdateDynamicNotJoinedReturnsError() {
_, err := cql.Update[models.Phone](
ts.db,
conditions.Phone.Brand(
conditions.Brand.Name.Is().Eq("google"),
),
).Set(
conditions.Phone.Name.Set().Dynamic(conditions.City.Name.Value()),
)

ts.ErrorIs(err, cql.ErrFieldModelNotConcerned)
ts.ErrorContains(err, "not concerned model: models.City; method: Set")
}

func (ts *UpdateIntTestSuite) TestUpdateDynamicWithoutJoinNumberReturnsErrorIfJoinedMoreThanOnce() {
_, err := cql.Update[models.Child](
ts.db,
Expand Down

0 comments on commit 92c90e0

Please sign in to comment.