Before this commit we were not benchmarking ksql with the
"omit-select" feature.
This could lead people to say that this feature is actually
expensive, but it really isn't so I just updated the benchmarks
to always run with this feature.
Before doing this change I actually put both features together
on the benchmark to compare them and these are the results:
```
ksql/sql-adapter/single-row-12 17186 143286 ns/op
ksql/sql-adapter-with-omit/single-row-12 16502 142893 ns/op
ksql/sql-adapter/multiple-rows-12 15361 153890 ns/op
ksql/sql-adapter-with-omit/multiple-rows-12 15360 156075 ns/op
ksql/pgx-adapter/single-row-12 33894 68332 ns/op
ksql/pgx-adapter-with-omit/single-row-12 34563 68861 ns/op
ksql/pgx-adapter/multiple-rows-12 29677 79196 ns/op
ksql/pgx-adapter-with-omit/multiple-rows-12 28934 80422 ns/op
```
Please note that benchmarks usually run slighly slower or faster
on each attempt, so small differences like the ones presented
above are really hard to interpret.
Some databases (maybe all of them) will set the database column
names to lowercase.
This was problematic because we needed to match these names
with the ksql tags, which were not lowercased.
Now we support both versions, lowercased or not.
This PR includes one breaking change:
- The `Provider.Exec` function now returns 2 values instead of only the error, the extra argument is the number of affected rows.
This PR also adds:
- CI with tests and linter
- Dockertest for making tests easier to run not only on CI but also on local machines for contributors
- Some bug fixes: Now we are handling a few edge cases better:
* If a struct has duplicated ksql tag names we will return an error instead of failing silently
* If a struct has no ksql tags we will return an error instead of failing on the query
* If a struct has attributes with no ksql tags they will be safely ignored instead of causing an error
* If a jointed table struct has an extra attribute with no `tablename` tag it will be ignored too because having an error for this would be more confusing than just ignoring it.
This change was finally made because the Delete function was the
only helper function that was not returning the ksql.ErrRecordNotFound
when no rows were found.
The other reason for this change is that we the most common use case is
by far for deleting a single element, and the philosophy of the library
is to optimize for the most common use-cases.
For making it easier to write queries for deleting many items
as well as many other less common use cases we
are already implementing the `kbuilder` package which is a
query builder.