Skip to content

Commit

Permalink
Implement support for partial indexes (#32)
Browse files Browse the repository at this point in the history
  • Loading branch information
lafriks authored Oct 12, 2021
1 parent 24d431f commit a2577d3
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 28 deletions.
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,17 @@ func main() {

- Microsoft SQL Server 2017
- Microsoft SQL Server 2019

## Testing

### Start Microsoft SQL server in Docker

```console
docker run -it --rm -p 1434:1433 -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=REL2021-mssql" -e "MSSQL_PID=Developer" mcr.microsoft.com/mssql/server:2019-latest
```

### Run tests

```console
MSSQL_DATABASE="sqlserver://sa:REL2021-mssql@localhost:1434" go test ./...
```
10 changes: 10 additions & 0 deletions builder/index.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import (
// Index builder.
type Index struct {
BufferFactory builder.BufferFactory
Query builder.QueryWriter
Filter builder.Filter
}

// Build sql query for index.
Expand Down Expand Up @@ -64,6 +66,14 @@ func (i Index) WriteCreateIndex(buffer *builder.Buffer, index rel.Index) {
buffer.WriteString(" IS NOT NULL")
}
}
if !index.Filter.None() {
if index.Unique {
buffer.WriteString(" AND ")
} else {
buffer.WriteString(" WHERE ")
}
i.Filter.Write(buffer, index.Filter, i.Query)
}
}

// WriteDropIndex to buffer
Expand Down
19 changes: 1 addition & 18 deletions builder/table.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package builder

import (
"encoding/json"
"strconv"

"github.com/go-rel/rel"
Expand Down Expand Up @@ -162,23 +161,7 @@ func (t Table) WriteColumn(buffer *builder.Buffer, column rel.Column) {

if column.Default != nil {
buffer.WriteString(" DEFAULT ")
switch v := column.Default.(type) {
case string:
// TODO: single quote only required by postgres.
buffer.WriteByte('\'')
buffer.WriteString(v)
buffer.WriteByte('\'')
case bool:
if v {
buffer.WriteString("'1'")
} else {
buffer.WriteString("'0'")
}
default:
// TODO: improve
bytes, _ := json.Marshal(column.Default)
buffer.Write(bytes)
}
buffer.WriteValue(column.Default)
}

t.WriteOptions(buffer, column.Options)
Expand Down
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ go 1.16

require (
github.com/denisenkom/go-mssqldb v0.10.0
github.com/go-rel/rel v0.24.0
github.com/go-rel/sql v0.1.0
github.com/go-rel/rel v0.25.1-0.20211011102656-a1b38f01d34a
github.com/go-rel/sql v0.1.1-0.20211011073646-a38034248e90
github.com/stretchr/testify v1.7.0
)
10 changes: 5 additions & 5 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/go-rel/rel v0.23.0/go.mod h1:/VBLj1U4ZVb53aB3n22RQwX0V9DvckohseDJQibn2Rs=
github.com/go-rel/rel v0.24.0 h1:DXx8DjUwkkg9EcLfS/m5YGGjdV4fjs7dsrcDVS1Zk0w=
github.com/go-rel/rel v0.24.0/go.mod h1:/VBLj1U4ZVb53aB3n22RQwX0V9DvckohseDJQibn2Rs=
github.com/go-rel/sql v0.1.0 h1:fdkdENIgJzoqUfdbQYtPCl85jcu7Ajj8zh/A5hWS+SI=
github.com/go-rel/sql v0.1.0/go.mod h1:vnvQ9jFzTgFvOl5qcntoFXrs9sas39YcIJG30LFlc50=
github.com/go-rel/rel v0.25.1-0.20211007095335-eec7ac68c920/go.mod h1:/VBLj1U4ZVb53aB3n22RQwX0V9DvckohseDJQibn2Rs=
github.com/go-rel/rel v0.25.1-0.20211011102656-a1b38f01d34a h1:FAd8FrXgy+G/44OwXYOk3A0b4lhdoyKMgF9m3h6pTt4=
github.com/go-rel/rel v0.25.1-0.20211011102656-a1b38f01d34a/go.mod h1:/VBLj1U4ZVb53aB3n22RQwX0V9DvckohseDJQibn2Rs=
github.com/go-rel/sql v0.1.1-0.20211011073646-a38034248e90 h1:638QwWIymw8cizASdq594qlDM729vYEtJobdy8wv2Lo=
github.com/go-rel/sql v0.1.1-0.20211011073646-a38034248e90/go.mod h1:ukXvTr/zbEZLu+lJCXcKpMg1Vp7Ps9cfKD+Us4kJREo=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
Expand Down
8 changes: 5 additions & 3 deletions mssql.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,15 +85,17 @@ func (m MSSQL) InsertAll(ctx context.Context, query rel.Query, primaryField stri
// New mssql adapter using existing connection.
func New(db *db.DB) rel.Adapter {
var (
bufferFactory = builder.BufferFactory{ArgumentPlaceholder: "@p", ArgumentOrdinal: true, EscapePrefix: "[", EscapeSuffix: "]"}
bufferFactory = builder.BufferFactory{ArgumentPlaceholder: "@p", ArgumentOrdinal: true, BoolTrueValue: "1", BoolFalseValue: "0", Quoter: builder.Quote{IDPrefix: "[", IDSuffix: "]", IDSuffixEscapeChar: "]", ValueQuote: "'", ValueQuoteEscapeChar: "'"}}
filterBuilder = builder.Filter{}
queryBuilder = mssqlbuilder.Query{Query: builder.Query{BufferFactory: bufferFactory, Filter: filterBuilder}}
InsertBuilder = mssqlbuilder.Insert{BufferFactory: bufferFactory}
insertAllBuilder = mssqlbuilder.InsertAll{BufferFactory: bufferFactory}
updateBuilder = builder.Update{BufferFactory: bufferFactory, Query: queryBuilder, Filter: filterBuilder}
deleteBuilder = builder.Delete{BufferFactory: bufferFactory, Query: queryBuilder, Filter: filterBuilder}
tableBuilder = mssqlbuilder.Table{BufferFactory: bufferFactory, ColumnMapper: columnMapper}
indexBuilder = mssqlbuilder.Index{BufferFactory: bufferFactory}
ddlBufferFactory = builder.BufferFactory{InlineValues: true, BoolTrueValue: "1", BoolFalseValue: "0", Quoter: builder.Quote{IDPrefix: "[", IDSuffix: "]", IDSuffixEscapeChar: "]", ValueQuote: "'", ValueQuoteEscapeChar: "'"}}
ddlQueryBuilder = builder.Query{BufferFactory: ddlBufferFactory, Filter: filterBuilder}
tableBuilder = mssqlbuilder.Table{BufferFactory: ddlBufferFactory, ColumnMapper: columnMapper}
indexBuilder = mssqlbuilder.Index{BufferFactory: ddlBufferFactory, Query: ddlQueryBuilder, Filter: filterBuilder}
)

return &MSSQL{
Expand Down

0 comments on commit a2577d3

Please sign in to comment.