Skip to content

Commit

Permalink
Fix linting errors
Browse files Browse the repository at this point in the history
  • Loading branch information
stephenafamo committed Sep 24, 2024
1 parent 75edad8 commit 77985f3
Show file tree
Hide file tree
Showing 15 changed files with 107 additions and 38 deletions.
2 changes: 2 additions & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ linters-settings:
disabled: true

issues:
exclude:
- G115
exclude-rules:
- path: .
linters:
Expand Down
8 changes: 6 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Added

- Added error constants for matching against both specific and generic unique constraint errors raised by the underlying database driver.
- Added error constants for matching against both specific and generic unique constraint errors raised by the underlying database driver. (thanks @mbezhanov)

### Removed

- Remove MS SQL artifacts. (thanks @mbezhanov)

### Fixed

- Removed unnecessary import of `strings` in `bobfactory_random.go`.
- Fixed data races in unit tests.
- Fixed invalid SQL statements generated by `sm.OrderBy().Collate()`.
- Fixed invalid SQL statements generated by `sm.OrderBy().Collate()`. (thanks @mbezhanov)

## [v0.28.1] - 2024-06-28

Expand Down
14 changes: 7 additions & 7 deletions dialect/mysql/table.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ func NewTablex[T orm.Table, Tslice ~[]T, Tset setter[T]](tableName string, uniqu

view, mappings := newView[T, Tslice](tableName)
t := &Table[T, Tslice, Tset]{
View: view,
setMapping: setMapping,
View: view,
setterMapping: setMapping,
}

pkCols := internal.FilterNonZero(mappings.PKs)
Expand Down Expand Up @@ -65,8 +65,8 @@ func NewTablex[T orm.Table, Tslice ~[]T, Tset setter[T]](tableName string, uniqu
// caches ???
type Table[T orm.Table, Tslice ~[]T, Tset setter[T]] struct {
*View[T, Tslice]
pkExpr dialect.Expression
setMapping mappings.Mapping
pkExpr dialect.Expression
setterMapping mappings.Mapping

BeforeInsertHooks orm.Hooks[[]Tset, orm.SkipModelHooksKey]
AfterInsertHooks orm.Hooks[Tslice, orm.SkipModelHooksKey]
Expand Down Expand Up @@ -159,7 +159,7 @@ func (t *Table[T, Tslice, Tset]) InsertMany(ctx context.Context, exec bob.Execut
}

q := Insert(
im.Into(t.Name(ctx), internal.FilterNonZero(t.setMapping.NonGenerated)...),
im.Into(t.Name(ctx), internal.FilterNonZero(t.setterMapping.NonGenerated)...),
)

// To prevent unnecessary work, we will do this before we add the rows
Expand Down Expand Up @@ -417,7 +417,7 @@ func (t *Table[T, Tslice, Tset]) uniqueSet(row Tset) ([]string, []any) {
break
}

colNames = append(colNames, t.setMapping.All[col])
colNames = append(colNames, t.setterMapping.All[col])
args = append(args, field.Interface())
}

Expand All @@ -432,7 +432,7 @@ func (t *Table[T, Tslice, Tset]) uniqueSet(row Tset) ([]string, []any) {
// Starts an insert query for this table
func (t *Table[T, Tslice, Tset]) InsertQ(ctx context.Context, exec bob.Executor, queryMods ...bob.Mod[*dialect.InsertQuery]) *TQuery[*dialect.InsertQuery, T, Tslice] {
q := &TQuery[*dialect.InsertQuery, T, Tslice]{
BaseQuery: Insert(im.Into(t.NameAs(ctx), internal.FilterNonZero(t.setMapping.NonGenerated)...)),
BaseQuery: Insert(im.Into(t.NameAs(ctx), internal.FilterNonZero(t.setterMapping.NonGenerated)...)),
ctx: ctx,
exec: exec,
view: t.View,
Expand Down
20 changes: 10 additions & 10 deletions dialect/psql/table.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ func NewTablex[T orm.Table, Tslice ~[]T, Tset setter[T]](schema, tableName strin
setMapping := mappings.GetMappings(reflect.TypeOf(zeroSet))
view, mappings := newView[T, Tslice](schema, tableName)
t := &Table[T, Tslice, Tset]{
View: view,
pkCols: internal.FilterNonZero(mappings.PKs),
setMapping: setMapping,
View: view,
pkCols: internal.FilterNonZero(mappings.PKs),
setterMapping: setMapping,
}

if len(t.pkCols) == 1 {
Expand All @@ -52,9 +52,9 @@ func NewTablex[T orm.Table, Tslice ~[]T, Tset setter[T]](schema, tableName strin
// caches ???
type Table[T orm.Table, Tslice ~[]T, Tset setter[T]] struct {
*View[T, Tslice]
pkCols []string
pkExpr dialect.Expression
setMapping mappings.Mapping
pkCols []string
pkExpr dialect.Expression
setterMapping mappings.Mapping

BeforeInsertHooks orm.Hooks[[]Tset, orm.SkipModelHooksKey]
AfterInsertHooks orm.Hooks[Tslice, orm.SkipModelHooksKey]
Expand Down Expand Up @@ -101,7 +101,7 @@ func (t *Table[T, Tslice, Tset]) InsertMany(ctx context.Context, exec bob.Execut
}

q := Insert(
im.Into(t.NameAs(ctx), internal.FilterNonZero(t.setMapping.NonGenerated)...),
im.Into(t.NameAs(ctx), internal.FilterNonZero(t.setterMapping.NonGenerated)...),
im.Returning(t.Columns()),
)

Expand Down Expand Up @@ -218,14 +218,14 @@ func (t *Table[T, Tslice, Tset]) UpsertMany(ctx context.Context, exec bob.Execut
}
// if still empty, use non-PKs
if len(excludeSetCols) == 0 {
excludeSetCols = t.setMapping.NonPKs
excludeSetCols = t.setterMapping.NonPKs
}
conflictQM = im.OnConflict(internal.ToAnySlice(conflictCols)...).
DoUpdate(im.SetExcluded(excludeSetCols...))
}

q := Insert(
im.Into(t.NameAs(ctx), internal.FilterNonZero(t.setMapping.NonGenerated)...),
im.Into(t.NameAs(ctx), internal.FilterNonZero(t.setterMapping.NonGenerated)...),
im.Returning(t.Columns()),
conflictQM,
)
Expand Down Expand Up @@ -289,7 +289,7 @@ func (t *Table[T, Tslice, Tset]) Delete(ctx context.Context, exec bob.Executor,
// Starts an insert query for this table
func (t *Table[T, Tslice, Tset]) InsertQ(ctx context.Context, exec bob.Executor, queryMods ...bob.Mod[*dialect.InsertQuery]) *TableQuery[*dialect.InsertQuery, T, Tslice] {
q := &TableQuery[*dialect.InsertQuery, T, Tslice]{
BaseQuery: Insert(im.Into(t.NameAs(ctx), internal.FilterNonZero(t.setMapping.NonGenerated)...)),
BaseQuery: Insert(im.Into(t.NameAs(ctx), internal.FilterNonZero(t.setterMapping.NonGenerated)...)),
ctx: ctx,
exec: exec,
view: t.View,
Expand Down
16 changes: 8 additions & 8 deletions dialect/sqlite/table.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ func NewTablex[T orm.Table, Tslice ~[]T, Tset setter[T]](schema, tableName strin
setMapping := mappings.GetMappings(reflect.TypeOf(zeroSet))
view, mappings := newView[T, Tslice](schema, tableName)
t := &Table[T, Tslice, Tset]{
View: view,
pkCols: internal.FilterNonZero(mappings.PKs),
setMapping: setMapping,
View: view,
pkCols: internal.FilterNonZero(mappings.PKs),
setterMapping: setMapping,
}

if len(t.pkCols) == 1 {
Expand All @@ -52,9 +52,9 @@ func NewTablex[T orm.Table, Tslice ~[]T, Tset setter[T]](schema, tableName strin
// caches ???
type Table[T orm.Table, Tslice ~[]T, Tset setter[T]] struct {
*View[T, Tslice]
pkCols []string
pkExpr dialect.Expression
setMapping mappings.Mapping
pkCols []string
pkExpr dialect.Expression
setterMapping mappings.Mapping

BeforeInsertHooks orm.Hooks[[]Tset, orm.SkipModelHooksKey]
AfterInsertHooks orm.Hooks[Tslice, orm.SkipModelHooksKey]
Expand Down Expand Up @@ -217,7 +217,7 @@ func (t *Table[T, Tslice, Tset]) UpsertMany(ctx context.Context, exec bob.Execut
}
// if still empty, use non-PKs
if len(excludeSetCols) == 0 {
excludeSetCols = t.setMapping.NonPKs
excludeSetCols = t.setterMapping.NonPKs
}
conflictQM = im.OnConflict(internal.ToAnySlice(conflictCols)...).
DoUpdate(im.SetExcluded(excludeSetCols...))
Expand Down Expand Up @@ -289,7 +289,7 @@ func (t *Table[T, Tslice, Tset]) Delete(ctx context.Context, exec bob.Executor,
// Starts an insert query for this table
func (t *Table[T, Tslice, Tset]) InsertQ(ctx context.Context, exec bob.Executor, queryMods ...bob.Mod[*dialect.InsertQuery]) *TQuery[*dialect.InsertQuery, T, Tslice] {
q := &TQuery[*dialect.InsertQuery, T, Tslice]{
BaseQuery: Insert(im.Into(t.NameAs(ctx), internal.FilterNonZero(t.setMapping.NonGenerated)...)),
BaseQuery: Insert(im.Into(t.NameAs(ctx), internal.FilterNonZero(t.setterMapping.NonGenerated)...)),
ctx: ctx,
exec: exec,
view: t.View,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ var (
)
{{- end -}}

{{define "unique_constraint_error_detection_method"}}
{{define "unique_constraint_error_detection_method" -}}
{{$.Importer.Import "strings"}}
{{$.Importer.Import "mysqlDriver" "github.com/go-sql-driver/mysql"}}
func (e *errUniqueConstraint) Is(target error) bool {
Expand All @@ -17,4 +17,4 @@ func (e *errUniqueConstraint) Is(target error) bool {
}
return err.Number == 1062 && strings.Contains(err.Message, e.s)
}
{{end}}
{{- end}}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{{define "unique_constraint_error_detection_method"}}
{{define "unique_constraint_error_detection_method" -}}
func (e *errUniqueConstraint) Is(target error) bool {
{{$supportedDrivers := list "github.com/lib/pq" "github.com/jackc/pgx" "github.com/jackc/pgx/v4" "github.com/jackc/pgx/v5"}}
{{if not (has $.DriverName $supportedDrivers)}}
Expand Down Expand Up @@ -28,4 +28,4 @@ func (e *errUniqueConstraint) Is(target error) bool {
return err.Code == "23505" && (e.s == "" || err.{{$constraintNameField}} == e.s)
{{end}}
}
{{end}}
{{- end}}
8 changes: 6 additions & 2 deletions gen/bobgen-sql/driver/sql.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ type Config struct {
Concurrency int
// Which UUID package to use (gofrs or google)
UUIDPkg string `yaml:"uuid_pkg"`
// Which `database/sql` driver to use (the full module name)
DriverName string `yaml:"driver_name"`

Output string
Pkgname string
Expand Down Expand Up @@ -98,6 +100,7 @@ func getPsqlDriver(ctx context.Context, config Config) (psqlDriver.Interface, er
Except: config.Except,
Concurrency: config.Concurrency,
UUIDPkg: config.UUIDPkg,
DriverName: config.DriverName,
Output: config.Output,
Pkgname: config.Pkgname,
NoFactory: config.NoFactory,
Expand Down Expand Up @@ -153,8 +156,9 @@ func getSQLiteDriver(ctx context.Context, config Config) (sqliteDriver.Interface
db.Close() // close early

d := sqliteDriver.New(sqliteDriver.Config{
DSN: tmp.Name(),
Attach: attach,
DSN: tmp.Name(),
Attach: attach,
DriverName: config.DriverName,

SharedSchema: config.SharedSchema,
Only: config.Only,
Expand Down
2 changes: 2 additions & 0 deletions gen/bobgen-sql/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ func run(c *cli.Context) error {

var modelTemplates []fs.FS
switch driverConfig.Dialect {
case "psql", "postgres":
modelTemplates = append(modelTemplates, gen.PSQLModelTemplates)
case "mysql":
modelTemplates = append(modelTemplates, gen.MySQLModelTemplates)
case "sqlite":
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ func (s {{$tAlias.UpSingular}}Setter) InsertMod() bob.Mod[*dialect.InsertQuery]
}
{{- end}}

{{define "unique_constraint_error_detection_method"}}
{{define "unique_constraint_error_detection_method" -}}
func (e *errUniqueConstraint) Is(target error) bool {
{{if not (eq $.DriverName "modernc.org/sqlite" "github.com/mattn/go-sqlite3")}}
return false
Expand All @@ -47,4 +47,4 @@ func (e *errUniqueConstraint) Is(target error) bool {
return err.{{$codeGetter}} == 2067 && strings.Contains(err.Error(), e.s)
{{end}}
}
{{end}}
{{- end}}
2 changes: 1 addition & 1 deletion website/docs/query-builder/mysql/examples/delete.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ mysql.Delete(
)
```

## With Limit And Offset
## With Limit And Offest

SQL:

Expand Down
18 changes: 18 additions & 0 deletions website/docs/query-builder/mysql/examples/select.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,3 +109,21 @@ mysql.Select(
sm.Where(mysql.Group(mysql.Quote("id"), mysql.Quote("employee_id")).In(mysql.ArgGroup(100, 200), mysql.ArgGroup(300, 400))),
)
```

## Select With Order By And Collate

SQL:

```sql
SELECT id, name FROM users ORDER BY name COLLATE utf8mb4_bg_0900_as_cs ASC
```

Code:

```go
mysql.Select(
sm.Columns("id", "name"),
sm.From("users"),
sm.OrderBy("name").Collate("utf8mb4_bg_0900_as_cs").Asc(),
)
```
18 changes: 18 additions & 0 deletions website/docs/query-builder/psql/examples/select.md
Original file line number Diff line number Diff line change
Expand Up @@ -292,3 +292,21 @@ psql.Select(
sm.Window("w").PartitionBy("depname").OrderBy("salary"),
)
```

## Select With Order By And Collate

SQL:

```sql
SELECT id, name FROM users ORDER BY name COLLATE "bg-BG-x-icu" ASC
```

Code:

```go
psql.Select(
sm.Columns("id", "name"),
sm.From("users"),
sm.OrderBy("name").Collate("bg-BG-x-icu").Asc(),
)
```
18 changes: 18 additions & 0 deletions website/docs/query-builder/sqlite/examples/select.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,3 +125,21 @@ sqlite.Select(
sm.Where(sqlite.Group(sqlite.Quote("id"), sqlite.Quote("employee_id")).In(sqlite.ArgGroup(100, 200), sqlite.ArgGroup(300, 400))),
)
```

## Select With Order By And Collate

SQL:

```sql
SELECT id, name FROM users ORDER BY name COLLATE NOCASE ASC
```

Code:

```go
sqlite.Select(
sm.Columns("id", "name"),
sm.From("users"),
sm.OrderBy("name").Collate("NOCASE").Asc(),
)
```
7 changes: 5 additions & 2 deletions website/examples_gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import (
"strings"

testutils "github.com/stephenafamo/bob/test/utils"
"golang.org/x/text/cases"
"golang.org/x/text/language"
)

var (
Expand All @@ -24,6 +26,7 @@ var (
rgxLeadingSpaces = regexp.MustCompile(`^\s+`)
// Switch from backticks to double quotes and back
rgxQuoteSwitch = regexp.MustCompile(`(\x60 \+ "|" \+ \x60)`)
caser = cases.Title(language.English, cases.NoLower) //nolint:gochecknoglobals
)

func main() {
Expand Down Expand Up @@ -348,7 +351,7 @@ func toMarkdown(destination string, cases []testcase) {
}

if c.doc == "" {
c.doc = strings.Title(c.name)
c.doc = caser.String(c.name)
}
// write the sql query
fmt.Fprintf(buf, "## %s\n\nSQL:\n\n```sql\n%s\n```\n\n", c.doc, c.query)
Expand Down Expand Up @@ -380,7 +383,7 @@ func toMarkdown(destination string, cases []testcase) {
func markdownTitle(s string) string {
base := filepath.Base(s)
heading := strings.TrimSuffix(base, filepath.Ext(base))
return fmt.Sprintf("# %s\n\n", strings.Title(heading))
return fmt.Sprintf("# %s\n\n", caser.String(heading))
}

func reindent(s string) string {
Expand Down

0 comments on commit 77985f3

Please sign in to comment.