Compare commits
10 Commits
Author | SHA1 | Date | |
---|---|---|---|
3bf9f02a9f | |||
533c767e1d | |||
84d55dbc8a | |||
5aafff6310 | |||
840aaf64ff | |||
7bbb56a328 | |||
394b08b2fe | |||
842252f9e2 | |||
279f5616d1 | |||
04bb88f74b |
@ -5,18 +5,18 @@ info:
|
|||||||
repository_url: https://github.com/dosco/super-graph
|
repository_url: https://github.com/dosco/super-graph
|
||||||
options:
|
options:
|
||||||
commits:
|
commits:
|
||||||
# filters:
|
filters:
|
||||||
# Type:
|
Type:
|
||||||
# - feat
|
- feat
|
||||||
# - fix
|
- fix
|
||||||
# - perf
|
- perf
|
||||||
# - refactor
|
- refactor
|
||||||
commit_groups:
|
commit_groups:
|
||||||
# title_maps:
|
title_maps:
|
||||||
# feat: Features
|
feat: Features
|
||||||
# fix: Bug Fixes
|
fix: Bug Fixes
|
||||||
# perf: Performance Improvements
|
perf: Performance Improvements
|
||||||
# refactor: Code Refactoring
|
refactor: Code Refactoring
|
||||||
header:
|
header:
|
||||||
pattern: "^((\\w+)\\s.*)$"
|
pattern: "^((\\w+)\\s.*)$"
|
||||||
pattern_maps:
|
pattern_maps:
|
||||||
|
8
.deepsource.toml
Normal file
8
.deepsource.toml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
version = 1
|
||||||
|
|
||||||
|
[[analyzers]]
|
||||||
|
name = "go"
|
||||||
|
enabled = true
|
||||||
|
|
||||||
|
[analyzers.meta]
|
||||||
|
import_path = "github.com/dosco/super-graph"
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -23,6 +23,8 @@
|
|||||||
/tmp/runner-build
|
/tmp/runner-build
|
||||||
/demo/tmp
|
/demo/tmp
|
||||||
|
|
||||||
|
.idea
|
||||||
|
*.iml
|
||||||
.vscode
|
.vscode
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.swp
|
.swp
|
||||||
|
570
CHANGELOG.md
570
CHANGELOG.md
@ -1,401 +1,371 @@
|
|||||||
<a name="unreleased"></a>
|
<a name="unreleased"></a>
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
### Add
|
|
||||||
- Add config driven custom table relationships
|
|
||||||
- Add support for `websearch_to_tsquery` in PG 11
|
|
||||||
|
|
||||||
### Create
|
<a name="v0.13.22"></a>
|
||||||
- Create CODE_OF_CONDUCT.md
|
## [v0.13.22] - 2020-05-01
|
||||||
|
|
||||||
### Fix
|
<a name="v0.13.21"></a>
|
||||||
- Fix bug with remote join example
|
## [v0.13.21] - 2020-04-24
|
||||||
- Fix grammer / syntax
|
|
||||||
|
|
||||||
### Update
|
<a name="v0.13.20"></a>
|
||||||
- Update issue templates
|
## [v0.13.20] - 2020-04-24
|
||||||
- Update CONTRIBUTING.md
|
|
||||||
- Update issue templates
|
<a name="v0.13.19"></a>
|
||||||
- Update feature_request.md
|
## [v0.13.19] - 2020-04-23
|
||||||
|
|
||||||
|
<a name="v0.13.18"></a>
|
||||||
|
## [v0.13.18] - 2020-04-23
|
||||||
|
|
||||||
|
<a name="v0.13.17"></a>
|
||||||
|
## [v0.13.17] - 2020-04-22
|
||||||
|
|
||||||
|
<a name="v0.13.16"></a>
|
||||||
|
## [v0.13.16] - 2020-04-21
|
||||||
|
### Features
|
||||||
|
- feat : improve the generated introspection schema and avoid the chirino/graphql api leaking through the core api. ([#53](https://github.com/dosco/super-graph/issues/53))
|
||||||
|
|
||||||
|
|
||||||
|
<a name="v0.13.15"></a>
|
||||||
|
## [v0.13.15] - 2020-04-20
|
||||||
|
|
||||||
|
<a name="v0.13.14"></a>
|
||||||
|
## [v0.13.14] - 2020-04-19
|
||||||
|
|
||||||
|
<a name="v0.13.13"></a>
|
||||||
|
## [v0.13.13] - 2020-04-19
|
||||||
|
|
||||||
|
<a name="v0.13.12"></a>
|
||||||
|
## [v0.13.12] - 2020-04-19
|
||||||
|
|
||||||
|
<a name="v0.13.11"></a>
|
||||||
|
## [v0.13.11] - 2020-04-18
|
||||||
|
|
||||||
|
<a name="v0.13.10"></a>
|
||||||
|
## [v0.13.10] - 2020-04-17
|
||||||
|
|
||||||
|
<a name="v0.13.9"></a>
|
||||||
|
## [v0.13.9] - 2020-04-16
|
||||||
|
|
||||||
|
<a name="v0.13.8"></a>
|
||||||
|
## [v0.13.8] - 2020-04-16
|
||||||
|
|
||||||
|
<a name="v0.13.7"></a>
|
||||||
|
## [v0.13.7] - 2020-04-16
|
||||||
|
|
||||||
|
<a name="v0.13.6"></a>
|
||||||
|
## [v0.13.6] - 2020-04-13
|
||||||
|
|
||||||
|
<a name="v0.13.5"></a>
|
||||||
|
## [v0.13.5] - 2020-04-13
|
||||||
|
|
||||||
|
<a name="v0.13.4"></a>
|
||||||
|
## [v0.13.4] - 2020-04-12
|
||||||
|
|
||||||
|
<a name="v0.13.3"></a>
|
||||||
|
## [v0.13.3] - 2020-04-12
|
||||||
|
|
||||||
|
<a name="v0.13.2"></a>
|
||||||
|
## [v0.13.2] - 2020-04-11
|
||||||
|
|
||||||
|
<a name="v0.13.1"></a>
|
||||||
|
## [v0.13.1] - 2020-04-11
|
||||||
|
|
||||||
|
<a name="v0.13.0"></a>
|
||||||
|
## [v0.13.0] - 2020-04-10
|
||||||
|
|
||||||
|
<a name="v0.12.49"></a>
|
||||||
|
## [v0.12.49] - 2020-04-01
|
||||||
|
|
||||||
|
<a name="v0.12.48"></a>
|
||||||
|
## [v0.12.48] - 2020-03-31
|
||||||
|
|
||||||
|
<a name="v0.12.47"></a>
|
||||||
|
## [v0.12.47] - 2020-03-30
|
||||||
|
|
||||||
|
<a name="v0.12.46"></a>
|
||||||
|
## [v0.12.46] - 2020-03-21
|
||||||
|
|
||||||
|
<a name="v0.12.45"></a>
|
||||||
|
## [v0.12.45] - 2020-03-18
|
||||||
|
|
||||||
|
<a name="v0.12.44"></a>
|
||||||
|
## [v0.12.44] - 2020-03-16
|
||||||
|
|
||||||
|
<a name="v0.12.43"></a>
|
||||||
|
## [v0.12.43] - 2020-03-16
|
||||||
|
|
||||||
|
<a name="v0.12.42"></a>
|
||||||
|
## [v0.12.42] - 2020-03-14
|
||||||
|
|
||||||
|
<a name="v0.12.41"></a>
|
||||||
|
## [v0.12.41] - 2020-03-06
|
||||||
|
|
||||||
|
<a name="v0.12.40"></a>
|
||||||
|
## [v0.12.40] - 2020-03-06
|
||||||
|
|
||||||
|
<a name="v0.12.39"></a>
|
||||||
|
## [v0.12.39] - 2020-03-06
|
||||||
|
|
||||||
|
<a name="v0.12.38"></a>
|
||||||
|
## [v0.12.38] - 2020-03-05
|
||||||
|
|
||||||
|
<a name="v0.12.37"></a>
|
||||||
|
## [v0.12.37] - 2020-03-04
|
||||||
|
|
||||||
|
<a name="v0.12.36"></a>
|
||||||
|
## [v0.12.36] - 2020-03-04
|
||||||
|
|
||||||
|
<a name="v0.12.35"></a>
|
||||||
|
## [v0.12.35] - 2020-03-03
|
||||||
|
|
||||||
|
<a name="v0.12.34"></a>
|
||||||
|
## [v0.12.34] - 2020-03-03
|
||||||
|
|
||||||
|
<a name="v0.12.33"></a>
|
||||||
|
## [v0.12.33] - 2020-02-29
|
||||||
|
|
||||||
|
<a name="v0.12.32"></a>
|
||||||
|
## [v0.12.32] - 2020-02-24
|
||||||
|
### Bug Fixes
|
||||||
|
- fix "Try the demo app" in docs ([#38](https://github.com/dosco/super-graph/issues/38))
|
||||||
|
|
||||||
|
|
||||||
|
<a name="v0.12.31"></a>
|
||||||
|
## [v0.12.31] - 2020-02-23
|
||||||
|
|
||||||
|
<a name="v0.12.30"></a>
|
||||||
|
## [v0.12.30] - 2020-02-23
|
||||||
|
|
||||||
|
<a name="v0.12.29"></a>
|
||||||
|
## [v0.12.29] - 2020-02-21
|
||||||
|
|
||||||
|
<a name="v0.12.28"></a>
|
||||||
|
## [v0.12.28] - 2020-02-20
|
||||||
|
|
||||||
|
<a name="v0.12.27"></a>
|
||||||
|
## [v0.12.27] - 2020-02-19
|
||||||
|
|
||||||
|
<a name="v0.12.26"></a>
|
||||||
|
## [v0.12.26] - 2020-02-11
|
||||||
|
|
||||||
|
<a name="v0.12.25"></a>
|
||||||
|
## [v0.12.25] - 2020-02-10
|
||||||
|
|
||||||
|
<a name="v0.12.24"></a>
|
||||||
|
## [v0.12.24] - 2020-02-03
|
||||||
|
|
||||||
|
<a name="v0.12.23"></a>
|
||||||
|
## [v0.12.23] - 2020-02-02
|
||||||
|
|
||||||
|
<a name="v0.12.22"></a>
|
||||||
|
## [v0.12.22] - 2020-02-01
|
||||||
|
|
||||||
|
<a name="v0.12.21"></a>
|
||||||
|
## [v0.12.21] - 2020-01-31
|
||||||
|
|
||||||
|
<a name="v0.12.20"></a>
|
||||||
|
## [v0.12.20] - 2020-01-28
|
||||||
|
|
||||||
|
<a name="v0.12.19"></a>
|
||||||
|
## [v0.12.19] - 2020-01-26
|
||||||
|
|
||||||
|
<a name="v0.12.18"></a>
|
||||||
|
## [v0.12.18] - 2020-01-20
|
||||||
|
|
||||||
|
<a name="v0.12.17"></a>
|
||||||
|
## [v0.12.17] - 2020-01-20
|
||||||
|
|
||||||
|
<a name="v0.12.16"></a>
|
||||||
|
## [v0.12.16] - 2020-01-19
|
||||||
|
|
||||||
|
<a name="v0.12.15"></a>
|
||||||
|
## [v0.12.15] - 2020-01-17
|
||||||
|
|
||||||
|
<a name="v0.12.14"></a>
|
||||||
|
## [v0.12.14] - 2020-01-17
|
||||||
|
|
||||||
|
<a name="v0.12.13"></a>
|
||||||
|
## [v0.12.13] - 2020-01-16
|
||||||
|
|
||||||
|
<a name="v0.12.12"></a>
|
||||||
|
## [v0.12.12] - 2020-01-15
|
||||||
|
|
||||||
|
<a name="v0.12.11"></a>
|
||||||
|
## [v0.12.11] - 2020-01-14
|
||||||
|
|
||||||
|
<a name="v0.12.10"></a>
|
||||||
|
## [v0.12.10] - 2020-01-14
|
||||||
|
|
||||||
|
<a name="v0.12.9"></a>
|
||||||
|
## [v0.12.9] - 2020-01-14
|
||||||
|
|
||||||
|
<a name="v0.12.8"></a>
|
||||||
|
## [v0.12.8] - 2020-01-13
|
||||||
|
|
||||||
|
<a name="v0.12.7"></a>
|
||||||
|
## [v0.12.7] - 2020-01-11
|
||||||
|
### Pull Requests
|
||||||
|
- Merge pull request [#22](https://github.com/dosco/super-graph/issues/22) from bhaskarmurthy/fix-grammer-syntax
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.12.6"></a>
|
<a name="v0.12.6"></a>
|
||||||
## [v0.12.6] - 2019-12-02
|
## [v0.12.6] - 2019-12-02
|
||||||
### Add
|
|
||||||
- Add support for `websearch_to_tsquery` in PG 11
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.12.5"></a>
|
<a name="v0.12.5"></a>
|
||||||
## [v0.12.5] - 2019-11-30
|
## [v0.12.5] - 2019-11-30
|
||||||
### Add
|
|
||||||
- Add a guide to the internals of the codebase
|
|
||||||
- Add a CONTRIBUTING.md guide for contributors
|
|
||||||
- Add a CHANGLOG.md
|
|
||||||
- Add issue templates
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
- Fix for missing filters on nested selectors
|
|
||||||
|
|
||||||
### Refactor
|
|
||||||
- Refactor rename 'Select.Table` to `Select.Name`
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.12.4"></a>
|
<a name="v0.12.4"></a>
|
||||||
## [v0.12.4] - 2019-11-28
|
## [v0.12.4] - 2019-11-28
|
||||||
### Move
|
|
||||||
- Move license from MIT to Apache 2.0. Add Makefile
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.12.3"></a>
|
<a name="v0.12.3"></a>
|
||||||
## [v0.12.3] - 2019-11-26
|
## [v0.12.3] - 2019-11-26
|
||||||
### Added
|
|
||||||
- Added support for query names to the allow.list
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.12.2"></a>
|
<a name="v0.12.2"></a>
|
||||||
## [v0.12.2] - 2019-11-25
|
## [v0.12.2] - 2019-11-25
|
||||||
### Fix
|
|
||||||
- Fix bug with compiling anon queries
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.12.1"></a>
|
<a name="v0.12.1"></a>
|
||||||
## [v0.12.1] - 2019-11-22
|
## [v0.12.1] - 2019-11-22
|
||||||
### Move
|
|
||||||
- Move sql query logging from info to debug
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.12.0"></a>
|
<a name="v0.12.0"></a>
|
||||||
## [v0.12.0] - 2019-11-22
|
## [v0.12.0] - 2019-11-22
|
||||||
### Use
|
|
||||||
- Use logger error instead of panic in goja handlers
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.11.9"></a>
|
<a name="v0.11.9"></a>
|
||||||
## [v0.11.9] - 2019-11-22
|
## [v0.11.9] - 2019-11-22
|
||||||
### Add
|
|
||||||
- Add a db:reset command only for dev mode
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.11.8"></a>
|
<a name="v0.11.8"></a>
|
||||||
## [v0.11.8] - 2019-11-21
|
## [v0.11.8] - 2019-11-21
|
||||||
### Optimize
|
|
||||||
- Optimize db queries limit use of transactions
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.11.7"></a>
|
<a name="v0.11.7"></a>
|
||||||
## [v0.11.7] - 2019-11-19
|
## [v0.11.7] - 2019-11-19
|
||||||
### Added
|
|
||||||
- Added support for multi-root queries
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.11.6"></a>
|
<a name="v0.11.6"></a>
|
||||||
## [v0.11.6] - 2019-11-15
|
## [v0.11.6] - 2019-11-15
|
||||||
### Fix
|
|
||||||
- Fix issues with JWT auth
|
|
||||||
- Fix bug with migration filename generation
|
|
||||||
- Fix bug with migration file name
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.11.5"></a>
|
<a name="v0.11.5"></a>
|
||||||
## [v0.11.5] - 2019-11-10
|
## [v0.11.5] - 2019-11-10
|
||||||
### Fix
|
|
||||||
- Fix bug with migration template name
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.11.4"></a>
|
<a name="v0.11.4"></a>
|
||||||
## [v0.11.4] - 2019-11-10
|
## [v0.11.4] - 2019-11-10
|
||||||
### Fix
|
|
||||||
- Fix bug with creating new migrations
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.11.3"></a>
|
<a name="v0.11.3"></a>
|
||||||
## [v0.11.3] - 2019-11-09
|
## [v0.11.3] - 2019-11-09
|
||||||
### Fix
|
|
||||||
- Fix macro syntax bug in app templates
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.11.2"></a>
|
<a name="v0.11.2"></a>
|
||||||
## [v0.11.2] - 2019-11-07
|
## [v0.11.2] - 2019-11-07
|
||||||
### Fix
|
|
||||||
- Fix bugs and add new production mode
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.11.1"></a>
|
<a name="v0.11.1"></a>
|
||||||
## [v0.11.1] - 2019-11-05
|
## [v0.11.1] - 2019-11-05
|
||||||
### Add
|
|
||||||
- Add nested where clause to filter based on related tables
|
|
||||||
|
|
||||||
### Block
|
|
||||||
- Block unauthorized requests when 'anon' role is not defined
|
|
||||||
|
|
||||||
### Update
|
|
||||||
- Update docs and website with new features
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.11"></a>
|
<a name="v0.11"></a>
|
||||||
## [v0.11] - 2019-11-01
|
## [v0.11] - 2019-11-01
|
||||||
### Add
|
|
||||||
- Add config driven presets for insert, update and upsert
|
|
||||||
- Add config driven presets for insert, update and upserta
|
|
||||||
- Add RBAC option to disable functions eg. count
|
|
||||||
- Add fuzz testing to 'serv' for the GQL hash parser
|
|
||||||
- Add fuzz testing to 'jsn' and 'qcode'
|
|
||||||
- Add ability to block queries and mutations by role
|
|
||||||
- Add built in 'anon' and 'user' roles
|
|
||||||
- Add role based access control
|
|
||||||
|
|
||||||
### Allow
|
|
||||||
- Allow config files to inherit from other config files
|
|
||||||
|
|
||||||
### Change
|
|
||||||
- Change config key inherit to inherits
|
|
||||||
|
|
||||||
### Get
|
|
||||||
- Get RBAC working for queries and mutations
|
|
||||||
|
|
||||||
### Optimize
|
|
||||||
- Optimize prepared statement flow for RBAC
|
|
||||||
|
|
||||||
### Preserve
|
|
||||||
- Preserve allow.list ordering on save
|
|
||||||
|
|
||||||
### Update
|
|
||||||
- Update filters section in guide
|
|
||||||
|
|
||||||
### Pull Requests
|
### Pull Requests
|
||||||
- Merge pull request [#11](https://github.com/dosco/super-graph/issues/11) from dosco/rbac
|
- Merge pull request [#11](https://github.com/dosco/super-graph/issues/11) from dosco/rbac
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.10.1"></a>
|
<a name="v0.10.1"></a>
|
||||||
## [v0.10.1] - 2019-10-06
|
## [v0.10.1] - 2019-10-06
|
||||||
### Add
|
|
||||||
- Add ability to set filters per operation / action
|
|
||||||
- Add upsert mutation
|
|
||||||
|
|
||||||
### Pull Requests
|
### Pull Requests
|
||||||
- Merge pull request [#10](https://github.com/dosco/super-graph/issues/10) from FourSigma/sm-examples-folder
|
- Merge pull request [#10](https://github.com/dosco/super-graph/issues/10) from FourSigma/sm-examples-folder
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.10"></a>
|
<a name="v0.10"></a>
|
||||||
## [v0.10] - 2019-10-04
|
## [v0.10] - 2019-10-04
|
||||||
### Fix
|
|
||||||
- Fix return values for bulk mutations and delete
|
|
||||||
- Fix issues with mutation SQL
|
|
||||||
- Fix broken demo app
|
|
||||||
- Fix typo in 'across'
|
|
||||||
|
|
||||||
### Remove
|
|
||||||
- Remove extra link from README
|
|
||||||
|
|
||||||
### Update
|
|
||||||
- Update docs, getting started guide and mutations
|
|
||||||
|
|
||||||
### Pull Requests
|
### Pull Requests
|
||||||
- Merge pull request [#6](https://github.com/dosco/super-graph/issues/6) from muesli/typo-fixes
|
- Merge pull request [#6](https://github.com/dosco/super-graph/issues/6) from muesli/typo-fixes
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.9"></a>
|
<a name="v0.9"></a>
|
||||||
## [v0.9] - 2019-10-01
|
## [v0.9] - 2019-10-01
|
||||||
### Fix
|
|
||||||
- Fix demo rails app broken build
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.8"></a>
|
<a name="v0.8"></a>
|
||||||
## [v0.8] - 2019-09-30
|
## [v0.8] - 2019-09-30
|
||||||
### Fix
|
|
||||||
- Fix invalid import bug
|
|
||||||
|
|
||||||
### Update
|
|
||||||
- Update documentation site
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.7"></a>
|
<a name="v0.7"></a>
|
||||||
## [v0.7] - 2019-09-29
|
## [v0.7] - 2019-09-29
|
||||||
### Failure
|
|
||||||
- Failure to prepare statements should be a warning
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
- Fix duplicte column bug
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.6"></a>
|
<a name="v0.6"></a>
|
||||||
## [v0.6] - 2019-09-29
|
## [v0.6] - 2019-09-29
|
||||||
### Add
|
|
||||||
- Add database setup commands
|
|
||||||
- Add binary compression back to Dockerfile
|
|
||||||
- Add initialization command to setup new apps
|
|
||||||
- Add migrate command
|
|
||||||
- Add database seeding capability
|
|
||||||
- Add session variable for user id
|
|
||||||
- Add delete mutation
|
|
||||||
- Add update mutation
|
|
||||||
- Add insert mutation with bulk insert
|
|
||||||
- Add GoTO Aug, 19 presentation
|
|
||||||
- Add support for prepared statements
|
|
||||||
- Add end-to-end benchmaking
|
|
||||||
- Add object pooling for parser expressions
|
|
||||||
- Add request / response debugging for remote joins
|
|
||||||
- Add a presentation about GraphQL
|
|
||||||
- Add validation for remote JSON
|
|
||||||
- Add tracing for API stitching
|
|
||||||
- Add REST API stitching
|
|
||||||
- Add SQL query cacheing
|
|
||||||
- Add support for GraphQL variables
|
|
||||||
- Add fuzz testing to qcode
|
|
||||||
- Add test for Rails Redis cookie store integration
|
|
||||||
- Add an install guide
|
|
||||||
|
|
||||||
### Change
|
|
||||||
- Change fuzz test name to qcode
|
|
||||||
- Change logo from PNG to SVG
|
|
||||||
|
|
||||||
### Enabke
|
|
||||||
- Enabke reload on config change
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
- Fix missing config name bug
|
|
||||||
- Fix new app templates
|
|
||||||
- Fix help message for migrate
|
|
||||||
- Fix session variable bug
|
|
||||||
- Fix test failures in `psql` and `serv`
|
|
||||||
- Fix demo docker services startup order
|
|
||||||
- Fix wrong value for false token bug. Reported by [@ThisIsMissEm](https://github.com/ThisIsMissEm)
|
|
||||||
- Fix allow.list file discovery bug
|
|
||||||
- Fix bug with allow list path
|
|
||||||
- Fix wrong value for use_allow_list in dev config
|
|
||||||
- Fix startup bug in demo script
|
|
||||||
- Fix url bug in allow list
|
|
||||||
- Fix bug [#676](https://github.com/dosco/super-graph/issues/676) found by fuzzer
|
|
||||||
- Fix race-condition in remote joins
|
|
||||||
- Fix cookie passing in web ui
|
|
||||||
- Fix bug with passing cookies in web ui
|
|
||||||
- Fix null pointer with invalid argument values
|
|
||||||
- Fix infinite loop bug in lexer
|
|
||||||
- Fix null pointer issue found by fuzz test
|
|
||||||
- Fix issue with fuzzbuzz config
|
|
||||||
- Fix demo to run as memory only
|
|
||||||
- Fix auth documentation
|
|
||||||
- Fix issue with web ui sizing
|
|
||||||
- Fix issue preventing docker-compose deploy
|
|
||||||
- Fix try demo documentation
|
|
||||||
|
|
||||||
### Futher
|
|
||||||
- Futher reduce allocations across hot paths
|
|
||||||
- Futher reduce allocations on the compiler hot path
|
|
||||||
- Futher optimize json parsing and editing performance
|
|
||||||
|
|
||||||
### Highlight
|
|
||||||
- Highlight top features better on the site
|
|
||||||
|
|
||||||
### Improve
|
|
||||||
- Improve readability of json parser code
|
|
||||||
- Improve the motivation section in the readme
|
|
||||||
- Improve the demo experience
|
|
||||||
|
|
||||||
### Make
|
|
||||||
- Make remote joins use parallel http requests
|
|
||||||
|
|
||||||
### Merge
|
|
||||||
- Merge branch 'master' into optimize-psql
|
|
||||||
|
|
||||||
### New
|
|
||||||
- New low allocation fast json parsing and editing library
|
|
||||||
|
|
||||||
### Optimize
|
|
||||||
- Optimize lexer and fix bugs
|
|
||||||
- Optimize the sql generator hot path
|
|
||||||
|
|
||||||
### Reduce
|
|
||||||
- Reduce alllocations done by the stack
|
|
||||||
- Reduce steps to run the demo
|
|
||||||
- Reduce allocations and improve perf over 50%
|
|
||||||
|
|
||||||
### Remove
|
|
||||||
- Remove unused packages
|
|
||||||
- Remove the 'hello' test app folder
|
|
||||||
- Remove other allocations in psql
|
|
||||||
|
|
||||||
### Use
|
|
||||||
- Use hash's as ids for table relationships
|
|
||||||
|
|
||||||
### Watch
|
|
||||||
- Watch and reload on config changes
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.5"></a>
|
<a name="v0.5"></a>
|
||||||
## [v0.5] - 2019-04-10
|
## [v0.5] - 2019-04-10
|
||||||
### Add
|
|
||||||
- Add supprt for new Rails 5.2 aes-256-gcm cookies
|
|
||||||
- Add query support for ts_rank and ts_headline
|
|
||||||
- Add full text search support using TSV indexes
|
|
||||||
- Add missing assets folder
|
|
||||||
- Add fetch by ID feature
|
|
||||||
- Add documentation
|
|
||||||
|
|
||||||
### Cleanup
|
|
||||||
- Cleanup and redesign config files
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
- Fix bug with auth config parsing
|
|
||||||
|
|
||||||
### Redesign
|
|
||||||
- Redesign config file architecture
|
|
||||||
|
|
||||||
### Reduce
|
|
||||||
- Reduce realloc of maps and slices
|
|
||||||
|
|
||||||
### Update
|
|
||||||
- Update docs with full-text search information
|
|
||||||
|
|
||||||
|
|
||||||
<a name="v0.4"></a>
|
<a name="v0.4"></a>
|
||||||
## [v0.4] - 2019-04-01
|
## [v0.4] - 2019-04-01
|
||||||
|
|
||||||
<a name="v0.3"></a>
|
<a name="v0.3"></a>
|
||||||
## [v0.3] - 2019-04-01
|
## [v0.3] - 2019-04-01
|
||||||
### Add
|
|
||||||
- Add SQL execution timing and tracing
|
|
||||||
- Add support for HAVING with aggregate queries
|
|
||||||
- Add aggregrate functions to GQL queries
|
|
||||||
- Add Auth0 JWT support
|
|
||||||
- Add React UI building to the docker build flow
|
|
||||||
- Add compiler profiling
|
|
||||||
- Add bechmarks for GQL to SQL compile
|
|
||||||
- Add tests for gql to sql compile
|
|
||||||
|
|
||||||
### Cleanup
|
|
||||||
- Cleanup Dockerfile
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
- Fix recurring packer issue docker hub builds
|
|
||||||
- Fix issue with asset packer breaking Docker builds
|
|
||||||
- Fix missing git package in Dockerfile
|
|
||||||
- Fix docker ignore values
|
|
||||||
- Fix image build failure on docker hub
|
|
||||||
- Fix build issue in Dockerfile
|
|
||||||
- Fix bugs and document the 'where' clause
|
|
||||||
- Fix perf issue with inflections
|
|
||||||
|
|
||||||
### Optimize
|
|
||||||
- Optimize docker image
|
|
||||||
|
|
||||||
### Pack
|
|
||||||
- Pack web UI with app into a single binary
|
|
||||||
|
|
||||||
### Upgrade
|
|
||||||
- Upgrade web UI packages
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.3"></a>
|
<a name="0.3"></a>
|
||||||
## 0.3 - 2019-03-24
|
## 0.3 - 2019-03-24
|
||||||
### First
|
|
||||||
- First commit
|
|
||||||
|
|
||||||
### Fix
|
[Unreleased]: https://github.com/dosco/super-graph/compare/v0.13.22...HEAD
|
||||||
- Fix license to MIT
|
[v0.13.22]: https://github.com/dosco/super-graph/compare/v0.13.21...v0.13.22
|
||||||
|
[v0.13.21]: https://github.com/dosco/super-graph/compare/v0.13.20...v0.13.21
|
||||||
|
[v0.13.20]: https://github.com/dosco/super-graph/compare/v0.13.19...v0.13.20
|
||||||
[Unreleased]: https://github.com/dosco/super-graph/compare/v0.12.6...HEAD
|
[v0.13.19]: https://github.com/dosco/super-graph/compare/v0.13.18...v0.13.19
|
||||||
|
[v0.13.18]: https://github.com/dosco/super-graph/compare/v0.13.17...v0.13.18
|
||||||
|
[v0.13.17]: https://github.com/dosco/super-graph/compare/v0.13.16...v0.13.17
|
||||||
|
[v0.13.16]: https://github.com/dosco/super-graph/compare/v0.13.15...v0.13.16
|
||||||
|
[v0.13.15]: https://github.com/dosco/super-graph/compare/v0.13.14...v0.13.15
|
||||||
|
[v0.13.14]: https://github.com/dosco/super-graph/compare/v0.13.13...v0.13.14
|
||||||
|
[v0.13.13]: https://github.com/dosco/super-graph/compare/v0.13.12...v0.13.13
|
||||||
|
[v0.13.12]: https://github.com/dosco/super-graph/compare/v0.13.11...v0.13.12
|
||||||
|
[v0.13.11]: https://github.com/dosco/super-graph/compare/v0.13.10...v0.13.11
|
||||||
|
[v0.13.10]: https://github.com/dosco/super-graph/compare/v0.13.9...v0.13.10
|
||||||
|
[v0.13.9]: https://github.com/dosco/super-graph/compare/v0.13.8...v0.13.9
|
||||||
|
[v0.13.8]: https://github.com/dosco/super-graph/compare/v0.13.7...v0.13.8
|
||||||
|
[v0.13.7]: https://github.com/dosco/super-graph/compare/v0.13.6...v0.13.7
|
||||||
|
[v0.13.6]: https://github.com/dosco/super-graph/compare/v0.13.5...v0.13.6
|
||||||
|
[v0.13.5]: https://github.com/dosco/super-graph/compare/v0.13.4...v0.13.5
|
||||||
|
[v0.13.4]: https://github.com/dosco/super-graph/compare/v0.13.3...v0.13.4
|
||||||
|
[v0.13.3]: https://github.com/dosco/super-graph/compare/v0.13.2...v0.13.3
|
||||||
|
[v0.13.2]: https://github.com/dosco/super-graph/compare/v0.13.1...v0.13.2
|
||||||
|
[v0.13.1]: https://github.com/dosco/super-graph/compare/v0.13.0...v0.13.1
|
||||||
|
[v0.13.0]: https://github.com/dosco/super-graph/compare/v0.12.49...v0.13.0
|
||||||
|
[v0.12.49]: https://github.com/dosco/super-graph/compare/v0.12.48...v0.12.49
|
||||||
|
[v0.12.48]: https://github.com/dosco/super-graph/compare/v0.12.47...v0.12.48
|
||||||
|
[v0.12.47]: https://github.com/dosco/super-graph/compare/v0.12.46...v0.12.47
|
||||||
|
[v0.12.46]: https://github.com/dosco/super-graph/compare/v0.12.45...v0.12.46
|
||||||
|
[v0.12.45]: https://github.com/dosco/super-graph/compare/v0.12.44...v0.12.45
|
||||||
|
[v0.12.44]: https://github.com/dosco/super-graph/compare/v0.12.43...v0.12.44
|
||||||
|
[v0.12.43]: https://github.com/dosco/super-graph/compare/v0.12.42...v0.12.43
|
||||||
|
[v0.12.42]: https://github.com/dosco/super-graph/compare/v0.12.41...v0.12.42
|
||||||
|
[v0.12.41]: https://github.com/dosco/super-graph/compare/v0.12.40...v0.12.41
|
||||||
|
[v0.12.40]: https://github.com/dosco/super-graph/compare/v0.12.39...v0.12.40
|
||||||
|
[v0.12.39]: https://github.com/dosco/super-graph/compare/v0.12.38...v0.12.39
|
||||||
|
[v0.12.38]: https://github.com/dosco/super-graph/compare/v0.12.37...v0.12.38
|
||||||
|
[v0.12.37]: https://github.com/dosco/super-graph/compare/v0.12.36...v0.12.37
|
||||||
|
[v0.12.36]: https://github.com/dosco/super-graph/compare/v0.12.35...v0.12.36
|
||||||
|
[v0.12.35]: https://github.com/dosco/super-graph/compare/v0.12.34...v0.12.35
|
||||||
|
[v0.12.34]: https://github.com/dosco/super-graph/compare/v0.12.33...v0.12.34
|
||||||
|
[v0.12.33]: https://github.com/dosco/super-graph/compare/v0.12.32...v0.12.33
|
||||||
|
[v0.12.32]: https://github.com/dosco/super-graph/compare/v0.12.31...v0.12.32
|
||||||
|
[v0.12.31]: https://github.com/dosco/super-graph/compare/v0.12.30...v0.12.31
|
||||||
|
[v0.12.30]: https://github.com/dosco/super-graph/compare/v0.12.29...v0.12.30
|
||||||
|
[v0.12.29]: https://github.com/dosco/super-graph/compare/v0.12.28...v0.12.29
|
||||||
|
[v0.12.28]: https://github.com/dosco/super-graph/compare/v0.12.27...v0.12.28
|
||||||
|
[v0.12.27]: https://github.com/dosco/super-graph/compare/v0.12.26...v0.12.27
|
||||||
|
[v0.12.26]: https://github.com/dosco/super-graph/compare/v0.12.25...v0.12.26
|
||||||
|
[v0.12.25]: https://github.com/dosco/super-graph/compare/v0.12.24...v0.12.25
|
||||||
|
[v0.12.24]: https://github.com/dosco/super-graph/compare/v0.12.23...v0.12.24
|
||||||
|
[v0.12.23]: https://github.com/dosco/super-graph/compare/v0.12.22...v0.12.23
|
||||||
|
[v0.12.22]: https://github.com/dosco/super-graph/compare/v0.12.21...v0.12.22
|
||||||
|
[v0.12.21]: https://github.com/dosco/super-graph/compare/v0.12.20...v0.12.21
|
||||||
|
[v0.12.20]: https://github.com/dosco/super-graph/compare/v0.12.19...v0.12.20
|
||||||
|
[v0.12.19]: https://github.com/dosco/super-graph/compare/v0.12.18...v0.12.19
|
||||||
|
[v0.12.18]: https://github.com/dosco/super-graph/compare/v0.12.17...v0.12.18
|
||||||
|
[v0.12.17]: https://github.com/dosco/super-graph/compare/v0.12.16...v0.12.17
|
||||||
|
[v0.12.16]: https://github.com/dosco/super-graph/compare/v0.12.15...v0.12.16
|
||||||
|
[v0.12.15]: https://github.com/dosco/super-graph/compare/v0.12.14...v0.12.15
|
||||||
|
[v0.12.14]: https://github.com/dosco/super-graph/compare/v0.12.13...v0.12.14
|
||||||
|
[v0.12.13]: https://github.com/dosco/super-graph/compare/v0.12.12...v0.12.13
|
||||||
|
[v0.12.12]: https://github.com/dosco/super-graph/compare/v0.12.11...v0.12.12
|
||||||
|
[v0.12.11]: https://github.com/dosco/super-graph/compare/v0.12.10...v0.12.11
|
||||||
|
[v0.12.10]: https://github.com/dosco/super-graph/compare/v0.12.9...v0.12.10
|
||||||
|
[v0.12.9]: https://github.com/dosco/super-graph/compare/v0.12.8...v0.12.9
|
||||||
|
[v0.12.8]: https://github.com/dosco/super-graph/compare/v0.12.7...v0.12.8
|
||||||
|
[v0.12.7]: https://github.com/dosco/super-graph/compare/v0.12.6...v0.12.7
|
||||||
[v0.12.6]: https://github.com/dosco/super-graph/compare/v0.12.5...v0.12.6
|
[v0.12.6]: https://github.com/dosco/super-graph/compare/v0.12.5...v0.12.6
|
||||||
[v0.12.5]: https://github.com/dosco/super-graph/compare/v0.12.4...v0.12.5
|
[v0.12.5]: https://github.com/dosco/super-graph/compare/v0.12.4...v0.12.5
|
||||||
[v0.12.4]: https://github.com/dosco/super-graph/compare/v0.12.3...v0.12.4
|
[v0.12.4]: https://github.com/dosco/super-graph/compare/v0.12.3...v0.12.4
|
||||||
|
4
Makefile
4
Makefile
@ -22,7 +22,7 @@ BUILD_FLAGS ?= -ldflags '-s -w -X ${lastCommitSHA}=${BUILD} -X "${lastCommitTime
|
|||||||
.PHONY: all build gen clean test run lint changlog release version help $(PLATFORMS)
|
.PHONY: all build gen clean test run lint changlog release version help $(PLATFORMS)
|
||||||
|
|
||||||
test:
|
test:
|
||||||
@go test -v ./...
|
@go test -v -short -race ./...
|
||||||
|
|
||||||
BIN_DIR := $(GOPATH)/bin
|
BIN_DIR := $(GOPATH)/bin
|
||||||
GORICE := $(BIN_DIR)/rice
|
GORICE := $(BIN_DIR)/rice
|
||||||
@ -39,7 +39,7 @@ $(WEB_BUILD_DIR):
|
|||||||
@exit 1
|
@exit 1
|
||||||
|
|
||||||
$(GITCHGLOG):
|
$(GITCHGLOG):
|
||||||
@GO111MODULE=off go get -u github.com/git-chglog/git-chglog/git-chglog
|
@GO111MODULE=off go get -u github.com/git-chglog/git-chglog/cmd/git-chglog
|
||||||
|
|
||||||
changelog: $(GITCHGLOG)
|
changelog: $(GITCHGLOG)
|
||||||
@git-chglog $(ARGS)
|
@git-chglog $(ARGS)
|
||||||
|
@ -3,6 +3,7 @@ package core
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"path"
|
"path"
|
||||||
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
@ -195,9 +196,13 @@ func newViper(configPath, configFile string) *viper.Viper {
|
|||||||
vi.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
|
vi.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
|
||||||
vi.AutomaticEnv()
|
vi.AutomaticEnv()
|
||||||
|
|
||||||
vi.SetConfigName(configFile)
|
if len(filepath.Ext(configFile)) != 0 {
|
||||||
vi.AddConfigPath(configPath)
|
vi.SetConfigFile(configFile)
|
||||||
vi.AddConfigPath("./config")
|
} else {
|
||||||
|
vi.SetConfigName(configFile)
|
||||||
|
vi.AddConfigPath(configPath)
|
||||||
|
vi.AddConfigPath("./config")
|
||||||
|
}
|
||||||
|
|
||||||
return vi
|
return vi
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,8 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/dosco/super-graph/jsn"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -230,6 +232,8 @@ func (al *List) Load() ([]Item, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (al *List) save(item Item) error {
|
func (al *List) save(item Item) error {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
|
||||||
item.Name = QueryName(item.Query)
|
item.Name = QueryName(item.Query)
|
||||||
item.key = strings.ToLower(item.Name)
|
item.key = strings.ToLower(item.Name)
|
||||||
|
|
||||||
@ -298,9 +302,16 @@ func (al *List) save(item Item) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(v.Vars) != 0 && !bytes.Equal(v.Vars, []byte("{}")) {
|
if len(v.Vars) != 0 && !bytes.Equal(v.Vars, []byte("{}")) {
|
||||||
vj, err := json.MarshalIndent(v.Vars, "", " ")
|
buf.Reset()
|
||||||
|
|
||||||
|
if err := jsn.Clear(&buf, v.Vars); err != nil {
|
||||||
|
return fmt.Errorf("failed to clean vars: %w", err)
|
||||||
|
}
|
||||||
|
vj := json.RawMessage(buf.Bytes())
|
||||||
|
|
||||||
|
vj, err = json.MarshalIndent(vj, "", " ")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to marshal vars: %v", err)
|
return fmt.Errorf("failed to marshal vars: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = f.WriteString(fmt.Sprintf("variables %s\n\n", vj))
|
_, err = f.WriteString(fmt.Sprintf("variables %s\n\n", vj))
|
||||||
|
@ -921,8 +921,6 @@ func (c *compilerContext) renderExp(ex *qcode.Exp, ti *DBTableInfo, skipNested b
|
|||||||
st.Push('(')
|
st.Push('(')
|
||||||
|
|
||||||
case qcode.OpNot:
|
case qcode.OpNot:
|
||||||
//fmt.Printf("1> %s %d %s %s\n", val.Op, len(val.Children), val.Children[0].Op, val.Children[1].Op)
|
|
||||||
|
|
||||||
st.Push(val.Children[0])
|
st.Push(val.Children[0])
|
||||||
st.Push(qcode.OpNot)
|
st.Push(qcode.OpNot)
|
||||||
|
|
||||||
|
@ -260,7 +260,7 @@ type DBFunction struct {
|
|||||||
|
|
||||||
type DBFuncParam struct {
|
type DBFuncParam struct {
|
||||||
ID int
|
ID int
|
||||||
Name string
|
Name sql.NullString
|
||||||
Type string
|
Type string
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -291,6 +291,7 @@ ORDER BY
|
|||||||
var funcs []DBFunction
|
var funcs []DBFunction
|
||||||
fm := make(map[string]int)
|
fm := make(map[string]int)
|
||||||
|
|
||||||
|
parameterIndex := 1
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
var fn, fid string
|
var fn, fid string
|
||||||
fp := DBFuncParam{}
|
fp := DBFuncParam{}
|
||||||
@ -300,12 +301,18 @@ ORDER BY
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !fp.Name.Valid {
|
||||||
|
fp.Name.String = string(parameterIndex)
|
||||||
|
fp.Name.Valid = true
|
||||||
|
}
|
||||||
|
|
||||||
if i, ok := fm[fid]; ok {
|
if i, ok := fm[fid]; ok {
|
||||||
funcs[i].Params = append(funcs[i].Params, fp)
|
funcs[i].Params = append(funcs[i].Params, fp)
|
||||||
} else {
|
} else {
|
||||||
funcs = append(funcs, DBFunction{Name: fn, Params: []DBFuncParam{fp}})
|
funcs = append(funcs, DBFunction{Name: fn, Params: []DBFuncParam{fp}})
|
||||||
fm[fid] = len(funcs) - 1
|
fm[fid] = len(funcs) - 1
|
||||||
}
|
}
|
||||||
|
parameterIndex++
|
||||||
}
|
}
|
||||||
|
|
||||||
return funcs, nil
|
return funcs, nil
|
||||||
|
17
core/internal/qcode/bench.9
Normal file
17
core/internal/qcode/bench.9
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
goos: darwin
|
||||||
|
goarch: amd64
|
||||||
|
pkg: github.com/dosco/super-graph/core/internal/qcode
|
||||||
|
BenchmarkQCompile
|
||||||
|
BenchmarkQCompile-16 129614 8649 ns/op 3756 B/op 28 allocs/op
|
||||||
|
BenchmarkQCompileP
|
||||||
|
BenchmarkQCompileP-16 487488 2525 ns/op 3792 B/op 28 allocs/op
|
||||||
|
BenchmarkParse
|
||||||
|
BenchmarkParse-16 127582 8731 ns/op 3902 B/op 18 allocs/op
|
||||||
|
BenchmarkParseP
|
||||||
|
BenchmarkParseP-16 561373 2223 ns/op 3903 B/op 18 allocs/op
|
||||||
|
BenchmarkSchemaParse
|
||||||
|
BenchmarkSchemaParse-16 209142 5523 ns/op 3968 B/op 57 allocs/op
|
||||||
|
BenchmarkSchemaParseP
|
||||||
|
BenchmarkSchemaParseP-16 716437 1734 ns/op 3968 B/op 57 allocs/op
|
||||||
|
PASS
|
||||||
|
ok github.com/dosco/super-graph/core/internal/qcode 8.483s
|
@ -602,7 +602,7 @@ func (t parserType) String() string {
|
|||||||
// nodePool.Put(n)
|
// nodePool.Put(n)
|
||||||
// freeList = append(freeList, Frees{n, loc})
|
// freeList = append(freeList, Frees{n, loc})
|
||||||
// } else {
|
// } else {
|
||||||
// fmt.Printf(">>>>(%d) RE_FREE %d %p %s %s\n", loc, freeList[j].loc, freeList[j].n, n.Name, n.Type)
|
// fmt.Printf("(%d) RE_FREE %d %p %s %s\n", loc, freeList[j].loc, freeList[j].n, n.Name, n.Type)
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ package qcode
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"github.com/chirino/graphql/schema"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -130,7 +131,7 @@ updateThread {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var gql = []byte(`
|
var gql = []byte(`
|
||||||
products(
|
{products(
|
||||||
# returns only 30 items
|
# returns only 30 items
|
||||||
limit: 30,
|
limit: 30,
|
||||||
|
|
||||||
@ -148,7 +149,7 @@ var gql = []byte(`
|
|||||||
id
|
id
|
||||||
name
|
name
|
||||||
price
|
price
|
||||||
}`)
|
}}`)
|
||||||
|
|
||||||
func BenchmarkQCompile(b *testing.B) {
|
func BenchmarkQCompile(b *testing.B) {
|
||||||
qcompile, _ := NewCompiler(Config{})
|
qcompile, _ := NewCompiler(Config{})
|
||||||
@ -181,3 +182,59 @@ func BenchmarkQCompileP(b *testing.B) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkParse(b *testing.B) {
|
||||||
|
|
||||||
|
b.ResetTimer()
|
||||||
|
b.ReportAllocs()
|
||||||
|
for n := 0; n < b.N; n++ {
|
||||||
|
_, err := Parse(gql)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
b.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkParseP(b *testing.B) {
|
||||||
|
b.ResetTimer()
|
||||||
|
b.ReportAllocs()
|
||||||
|
|
||||||
|
b.RunParallel(func(pb *testing.PB) {
|
||||||
|
for pb.Next() {
|
||||||
|
_, err := Parse(gql)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
b.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkSchemaParse(b *testing.B) {
|
||||||
|
|
||||||
|
b.ResetTimer()
|
||||||
|
b.ReportAllocs()
|
||||||
|
for n := 0; n < b.N; n++ {
|
||||||
|
doc := schema.QueryDocument{}
|
||||||
|
err := doc.Parse(string(gql))
|
||||||
|
if err != nil {
|
||||||
|
b.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkSchemaParseP(b *testing.B) {
|
||||||
|
b.ResetTimer()
|
||||||
|
b.ReportAllocs()
|
||||||
|
|
||||||
|
b.RunParallel(func(pb *testing.PB) {
|
||||||
|
for pb.Next() {
|
||||||
|
doc := schema.QueryDocument{}
|
||||||
|
err := doc.Parse(string(gql))
|
||||||
|
if err != nil {
|
||||||
|
b.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
@ -3,7 +3,7 @@ package core
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"crypto/sha1"
|
"crypto/sha256"
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"fmt"
|
"fmt"
|
||||||
@ -122,7 +122,7 @@ func (sg *SuperGraph) prepareStmt(item allow.Item) error {
|
|||||||
|
|
||||||
stmts, err := sg.buildRoleStmt(qb, vars, role.Name)
|
stmts, err := sg.buildRoleStmt(qb, vars, role.Name)
|
||||||
if err == psql.ErrAllTablesSkipped {
|
if err == psql.ErrAllTablesSkipped {
|
||||||
return nil
|
continue
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -251,7 +251,7 @@ func (sg *SuperGraph) initAllowList() error {
|
|||||||
|
|
||||||
// nolint: errcheck
|
// nolint: errcheck
|
||||||
func stmtHash(name string, role string) string {
|
func stmtHash(name string, role string) string {
|
||||||
h := sha1.New()
|
h := sha256.New()
|
||||||
io.WriteString(h, strings.ToLower(name))
|
io.WriteString(h, strings.ToLower(name))
|
||||||
io.WriteString(h, role)
|
io.WriteString(h, role)
|
||||||
return hex.EncodeToString(h.Sum(nil))
|
return hex.EncodeToString(h.Sum(nil))
|
||||||
|
@ -109,7 +109,7 @@ func cmdDBNew(cmd *cobra.Command, args []string) {
|
|||||||
|
|
||||||
// Write new migration
|
// Write new migration
|
||||||
mpath := filepath.Join(migrationsPath, mname)
|
mpath := filepath.Join(migrationsPath, mname)
|
||||||
mfile, err := os.OpenFile(mpath, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0666)
|
mfile, err := os.OpenFile(mpath, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0600)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("ERR %s", err)
|
log.Fatalf("ERR %s", err)
|
||||||
}
|
}
|
||||||
|
@ -92,17 +92,28 @@ func apiV1(w http.ResponseWriter, r *http.Request) {
|
|||||||
//nolint: errcheck
|
//nolint: errcheck
|
||||||
json.NewEncoder(w).Encode(res)
|
json.NewEncoder(w).Encode(res)
|
||||||
|
|
||||||
|
if doLog && logLevel >= LogLevelInfo {
|
||||||
|
zlog.Info("success",
|
||||||
|
zap.String("op", res.OperationName()),
|
||||||
|
zap.String("name", res.QueryName()),
|
||||||
|
zap.String("role", res.Role()),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
renderErr(w, err)
|
renderErr(w, err)
|
||||||
|
|
||||||
|
if doLog && logLevel >= LogLevelInfo {
|
||||||
|
zlog.Error("error",
|
||||||
|
zap.String("op", res.OperationName()),
|
||||||
|
zap.String("name", res.QueryName()),
|
||||||
|
zap.String("role", res.Role()),
|
||||||
|
zap.Error(err),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if doLog && logLevel >= LogLevelInfo {
|
|
||||||
zlog.Info("success",
|
|
||||||
zap.String("op", res.OperationName()),
|
|
||||||
zap.String("name", res.QueryName()),
|
|
||||||
zap.String("role", res.Role()),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//nolint: errcheck
|
//nolint: errcheck
|
||||||
|
@ -144,6 +144,7 @@ func routeHandler() (http.Handler, error) {
|
|||||||
|
|
||||||
fn := func(w http.ResponseWriter, r *http.Request) {
|
fn := func(w http.ResponseWriter, r *http.Request) {
|
||||||
w.Header().Set("Server", serverName)
|
w.Header().Set("Server", serverName)
|
||||||
|
w.Header().Set("Content-type", "application/json")
|
||||||
mux.ServeHTTP(w, r)
|
mux.ServeHTTP(w, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ package serv
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"crypto/sha1"
|
"crypto/sha256"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
@ -16,7 +16,7 @@ import (
|
|||||||
// nolint: errcheck
|
// nolint: errcheck
|
||||||
func gqlHash(b string, vars []byte, role string) string {
|
func gqlHash(b string, vars []byte, role string) string {
|
||||||
b = strings.TrimSpace(b)
|
b = strings.TrimSpace(b)
|
||||||
h := sha1.New()
|
h := sha256.New()
|
||||||
query := "query"
|
query := "query"
|
||||||
|
|
||||||
s, e := 0, 0
|
s, e := 0, 0
|
||||||
|
112
jsn/clear.go
Normal file
112
jsn/clear.go
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
package jsn
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Clear function wipes all scalar values from the json including those directly in an array
|
||||||
|
func Clear(w *bytes.Buffer, v []byte) error {
|
||||||
|
dec := json.NewDecoder(bytes.NewReader(v))
|
||||||
|
|
||||||
|
st := newIntStack()
|
||||||
|
isValue := false
|
||||||
|
inArray := false
|
||||||
|
n := 0
|
||||||
|
|
||||||
|
for {
|
||||||
|
var t json.Token
|
||||||
|
var err error
|
||||||
|
|
||||||
|
if t, err = dec.Token(); err == io.EOF {
|
||||||
|
break
|
||||||
|
} else if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
switch v1 := t.(type) {
|
||||||
|
case int:
|
||||||
|
if isValue && !inArray {
|
||||||
|
w.WriteByte('0')
|
||||||
|
isValue = false
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
|
||||||
|
case float64:
|
||||||
|
if isValue && !inArray {
|
||||||
|
w.WriteString(`0.0`)
|
||||||
|
isValue = false
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
|
||||||
|
case bool:
|
||||||
|
if isValue && !inArray {
|
||||||
|
w.WriteString(`false`)
|
||||||
|
isValue = false
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
|
||||||
|
case json.Number:
|
||||||
|
if isValue && !inArray {
|
||||||
|
w.WriteString(`0`)
|
||||||
|
isValue = false
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
|
||||||
|
case nil:
|
||||||
|
if isValue && !inArray {
|
||||||
|
w.WriteString(`null`)
|
||||||
|
isValue = false
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
|
||||||
|
case string:
|
||||||
|
if !isValue {
|
||||||
|
if n != 0 {
|
||||||
|
w.WriteByte(',')
|
||||||
|
}
|
||||||
|
|
||||||
|
io := int(dec.InputOffset())
|
||||||
|
w.Write(v[io-len(v1)-2 : io])
|
||||||
|
w.WriteString(`:`)
|
||||||
|
isValue = true
|
||||||
|
|
||||||
|
} else if !inArray {
|
||||||
|
w.WriteString(`""`)
|
||||||
|
isValue = false
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
|
||||||
|
case json.Delim:
|
||||||
|
switch t.(json.Delim) {
|
||||||
|
case '[':
|
||||||
|
st.Push(n)
|
||||||
|
inArray = true
|
||||||
|
n = 0
|
||||||
|
case ']':
|
||||||
|
n = st.Pop()
|
||||||
|
inArray = false
|
||||||
|
isValue = false
|
||||||
|
n++
|
||||||
|
case '{':
|
||||||
|
if n != 0 && !isValue {
|
||||||
|
w.WriteByte(',')
|
||||||
|
}
|
||||||
|
st.Push(n)
|
||||||
|
inArray = false
|
||||||
|
isValue = false
|
||||||
|
n = 0
|
||||||
|
case '}':
|
||||||
|
n = st.Pop()
|
||||||
|
isValue = false
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
w.WriteByte(v[dec.InputOffset()-1])
|
||||||
|
}
|
||||||
|
|
||||||
|
dec.More()
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
47
jsn/intstack.go
Normal file
47
jsn/intstack.go
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
package jsn
|
||||||
|
|
||||||
|
type intStack struct {
|
||||||
|
stA [20]int
|
||||||
|
st []int
|
||||||
|
top int
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a new intStack
|
||||||
|
func newIntStack() *intStack {
|
||||||
|
s := &intStack{top: -1}
|
||||||
|
s.st = s.stA[:0]
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the number of items in the intStack
|
||||||
|
func (s *intStack) Len() int {
|
||||||
|
return (s.top + 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// View the top item on the intStack
|
||||||
|
func (s *intStack) Peek() int {
|
||||||
|
if s.top == -1 {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
return s.st[s.top]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pop the top item of the intStack and return it
|
||||||
|
func (s *intStack) Pop() int {
|
||||||
|
if s.top == -1 {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
s.top--
|
||||||
|
return s.st[(s.top + 1)]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Push a value onto the top of the intStack
|
||||||
|
func (s *intStack) Push(value int) {
|
||||||
|
s.top++
|
||||||
|
if len(s.st) <= s.top {
|
||||||
|
s.st = append(s.st, value)
|
||||||
|
} else {
|
||||||
|
s.st[s.top] = value
|
||||||
|
}
|
||||||
|
}
|
@ -509,6 +509,34 @@ func TestKeys3(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestClear(t *testing.T) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
|
||||||
|
json := `{
|
||||||
|
"insert": {
|
||||||
|
"created_at": "now",
|
||||||
|
"test_1a": { "type1": "a", "type2": [{ "a": 2 }] },
|
||||||
|
"name": "Hello",
|
||||||
|
"updated_at": "now",
|
||||||
|
"description": "World"
|
||||||
|
},
|
||||||
|
"user": 123,
|
||||||
|
"tags": [1, 2, "what"]
|
||||||
|
}`
|
||||||
|
|
||||||
|
expected := `{"insert":{"created_at":"","test_1a":{"type1":"","type2":[{"a":0.0}]},"name":"","updated_at":"","description":""},"user":0.0,"tags":[]}`
|
||||||
|
|
||||||
|
err := Clear(&buf, []byte(json))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if buf.String() != expected {
|
||||||
|
t.Log(buf.String())
|
||||||
|
t.Error("Does not match expected json")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func BenchmarkGet(b *testing.B) {
|
func BenchmarkGet(b *testing.B) {
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ func Keys(b []byte) [][]byte {
|
|||||||
var k []byte
|
var k []byte
|
||||||
state := expectValue
|
state := expectValue
|
||||||
|
|
||||||
st := newStack()
|
st := newSkipInfoStack()
|
||||||
ae := 0
|
ae := 0
|
||||||
instr := false
|
instr := false
|
||||||
slash := 0
|
slash := 0
|
||||||
|
51
jsn/sistack.go
Normal file
51
jsn/sistack.go
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
package jsn
|
||||||
|
|
||||||
|
type skipInfo struct {
|
||||||
|
ss, se int
|
||||||
|
}
|
||||||
|
|
||||||
|
type siStack struct {
|
||||||
|
stA [20]skipInfo
|
||||||
|
st []skipInfo
|
||||||
|
top int
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a new siStack
|
||||||
|
func newSkipInfoStack() *siStack {
|
||||||
|
s := &siStack{top: -1}
|
||||||
|
s.st = s.stA[:0]
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the number of items in the siStack
|
||||||
|
func (s *siStack) Len() int {
|
||||||
|
return (s.top + 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// View the top item on the siStack
|
||||||
|
func (s *siStack) Peek() *skipInfo {
|
||||||
|
if s.top == -1 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &s.st[s.top]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pop the top item of the siStack and return it
|
||||||
|
func (s *siStack) Pop() *skipInfo {
|
||||||
|
if s.top == -1 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
s.top--
|
||||||
|
return &s.st[(s.top + 1)]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Push a value onto the top of the siStack
|
||||||
|
func (s *siStack) Push(value skipInfo) {
|
||||||
|
s.top++
|
||||||
|
if len(s.st) <= s.top {
|
||||||
|
s.st = append(s.st, value)
|
||||||
|
} else {
|
||||||
|
s.st[s.top] = value
|
||||||
|
}
|
||||||
|
}
|
51
jsn/stack.go
51
jsn/stack.go
@ -1,51 +0,0 @@
|
|||||||
package jsn
|
|
||||||
|
|
||||||
type skipInfo struct {
|
|
||||||
ss, se int
|
|
||||||
}
|
|
||||||
|
|
||||||
type stack struct {
|
|
||||||
stA [20]skipInfo
|
|
||||||
st []skipInfo
|
|
||||||
top int
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a new stack
|
|
||||||
func newStack() *stack {
|
|
||||||
s := &stack{top: -1}
|
|
||||||
s.st = s.stA[:0]
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the number of items in the stack
|
|
||||||
func (s *stack) Len() int {
|
|
||||||
return (s.top + 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// View the top item on the stack
|
|
||||||
func (s *stack) Peek() *skipInfo {
|
|
||||||
if s.top == -1 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return &s.st[s.top]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pop the top item of the stack and return it
|
|
||||||
func (s *stack) Pop() *skipInfo {
|
|
||||||
if s.top == -1 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
s.top--
|
|
||||||
return &s.st[(s.top + 1)]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Push a value onto the top of the stack
|
|
||||||
func (s *stack) Push(value skipInfo) {
|
|
||||||
s.top++
|
|
||||||
if len(s.st) <= s.top {
|
|
||||||
s.st = append(s.st, value)
|
|
||||||
} else {
|
|
||||||
s.st[s.top] = value
|
|
||||||
}
|
|
||||||
}
|
|
Reference in New Issue
Block a user