graphql-groups 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -10
- data/graphql-groups.gemspec +5 -3
- data/lib/graphql/groups/result_transformer.rb +2 -6
- data/lib/graphql/groups/version.rb +3 -1
- metadata +3 -7
- data/.github/workflows/build.yml +0 -28
- data/benchmark/benchmark.jpg +0 -0
- data/benchmark/benchmark.rb +0 -101
- data/benchmark/benchmark_schema.rb +0 -53
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: bc6f31b4fca864cefe1967ddd17af2a65a782f53378f6b4c3bc5d7fb76a7819a
|
|
4
|
+
data.tar.gz: e64200c1a65480d32cdfb2826615e3ce8d26ae6fa61677e17a95a187c1b2063c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 697fab7612389337ab019a3820cffbf91546ac5ddf026903448b6f5eb6815f0c468225aebe10d3febcee88dcfd174903fa487ae6f83361ed91ec605c43b0e94a
|
|
7
|
+
data.tar.gz: 4c99e4cbe13c9fa4e80a7a8c7b0958c2127675ba1e94f501b280160f8b231eda19f1ffaf9dcdfbcb0304d3721d66d416833696c8cf2074cf1092b15010766867
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
graphql-groups (0.1.
|
|
4
|
+
graphql-groups (0.1.4)
|
|
5
5
|
graphql (~> 1, > 1.9)
|
|
6
6
|
|
|
7
7
|
GEM
|
|
@@ -36,8 +36,6 @@ GEM
|
|
|
36
36
|
http (> 0.8, < 3.0)
|
|
37
37
|
multi_json (~> 1)
|
|
38
38
|
graphql (1.11.1)
|
|
39
|
-
groupdate (5.1.0)
|
|
40
|
-
activesupport (>= 5)
|
|
41
39
|
gruff (0.10.0)
|
|
42
40
|
histogram
|
|
43
41
|
rmagick
|
|
@@ -91,15 +89,12 @@ GEM
|
|
|
91
89
|
parser (>= 2.7.0.1)
|
|
92
90
|
rubocop-rspec (1.42.0)
|
|
93
91
|
rubocop (>= 0.87.0)
|
|
94
|
-
ruby-prof (1.4.1)
|
|
95
92
|
ruby-progressbar (1.10.1)
|
|
96
93
|
simplecov (0.18.5)
|
|
97
94
|
docile (~> 1.1)
|
|
98
95
|
simplecov-html (~> 0.11)
|
|
99
96
|
simplecov-html (0.12.2)
|
|
100
97
|
sqlite3 (1.4.2)
|
|
101
|
-
stackprof (0.2.15)
|
|
102
|
-
test-prof (0.12.0)
|
|
103
98
|
thread_safe (0.3.6)
|
|
104
99
|
tzinfo (1.2.7)
|
|
105
100
|
thread_safe (~> 0.1)
|
|
@@ -119,17 +114,13 @@ DEPENDENCIES
|
|
|
119
114
|
database_cleaner-active_record (~> 1.8)
|
|
120
115
|
gqli (~> 1.0)
|
|
121
116
|
graphql-groups!
|
|
122
|
-
groupdate
|
|
123
117
|
gruff (~> 0.10)
|
|
124
118
|
rake (~> 13.0)
|
|
125
119
|
rspec (~> 3.0)
|
|
126
120
|
rubocop (~> 0.88)
|
|
127
121
|
rubocop-rspec (~> 1.42)
|
|
128
|
-
ruby-prof
|
|
129
122
|
simplecov (~> 0.18.5)
|
|
130
123
|
sqlite3 (~> 1.4.2)
|
|
131
|
-
stackprof
|
|
132
|
-
test-prof
|
|
133
124
|
|
|
134
125
|
BUNDLED WITH
|
|
135
126
|
2.1.4
|
data/graphql-groups.gemspec
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
lib = File.expand_path('lib', __dir__)
|
|
2
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
5
|
require 'graphql/groups/version'
|
|
@@ -11,7 +13,7 @@ Gem::Specification.new do |spec|
|
|
|
11
13
|
spec.summary = 'Create flexible and fast aggregation queries with graphql-ruby'
|
|
12
14
|
spec.description = <<~HEREDOC
|
|
13
15
|
GraphQL Groups makes it easy to add aggregation queries to your GraphQL schema. It combines a simple, flexible
|
|
14
|
-
schema definition with high performance
|
|
16
|
+
schema definition with high performance
|
|
15
17
|
HEREDOC
|
|
16
18
|
spec.homepage = 'https://github.com/hschne/graphql-groups'
|
|
17
19
|
spec.license = 'MIT'
|
|
@@ -22,8 +24,8 @@ Gem::Specification.new do |spec|
|
|
|
22
24
|
|
|
23
25
|
# Specify which files should be added to the gem when it is released.
|
|
24
26
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
|
25
|
-
spec.files = Dir.chdir(File.expand_path(
|
|
26
|
-
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
|
27
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
|
28
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|benchmark|.github)/}) }
|
|
27
29
|
end
|
|
28
30
|
spec.bindir = 'exe'
|
|
29
31
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
@@ -68,13 +68,9 @@ module GraphQL
|
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
def merge(hashes)
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
inner = hash[root_key]
|
|
74
|
-
inner_key = inner.keys.first
|
|
75
|
-
object[inner_key] = inner.values.first
|
|
71
|
+
hashes.each_with_object({}) do |hash, object|
|
|
72
|
+
object.deep_merge!(hash)
|
|
76
73
|
end
|
|
77
|
-
{ root_key => result }
|
|
78
74
|
end
|
|
79
75
|
|
|
80
76
|
def build_keys(key, keys)
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: graphql-groups
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Hans-Jörg Schnedlitz
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2020-08-
|
|
11
|
+
date: 2020-08-26 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activerecord
|
|
@@ -199,14 +199,13 @@ dependencies:
|
|
|
199
199
|
- !ruby/object:Gem::Version
|
|
200
200
|
version: '1.9'
|
|
201
201
|
description: "GraphQL Groups makes it easy to add aggregation queries to your GraphQL
|
|
202
|
-
schema. It combines a simple, flexible \nschema definition with high performance
|
|
202
|
+
schema. It combines a simple, flexible \nschema definition with high performance\n"
|
|
203
203
|
email:
|
|
204
204
|
- hans.schnedlitz@gmail.com
|
|
205
205
|
executables: []
|
|
206
206
|
extensions: []
|
|
207
207
|
extra_rdoc_files: []
|
|
208
208
|
files:
|
|
209
|
-
- ".github/workflows/build.yml"
|
|
210
209
|
- ".gitignore"
|
|
211
210
|
- ".rspec"
|
|
212
211
|
- ".rubocop.yml"
|
|
@@ -219,9 +218,6 @@ files:
|
|
|
219
218
|
- Meister.png
|
|
220
219
|
- README.md
|
|
221
220
|
- Rakefile
|
|
222
|
-
- benchmark/benchmark.jpg
|
|
223
|
-
- benchmark/benchmark.rb
|
|
224
|
-
- benchmark/benchmark_schema.rb
|
|
225
221
|
- bin/console
|
|
226
222
|
- bin/setup
|
|
227
223
|
- graphql-groups.gemspec
|
data/.github/workflows/build.yml
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
name: Build
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [ master ]
|
|
6
|
-
pull_request:
|
|
7
|
-
branches: [ master ]
|
|
8
|
-
|
|
9
|
-
jobs:
|
|
10
|
-
test:
|
|
11
|
-
runs-on: ubuntu-latest
|
|
12
|
-
steps:
|
|
13
|
-
- uses: actions/checkout@v2
|
|
14
|
-
- name: Set up Ruby
|
|
15
|
-
uses: ruby/setup-ruby@v1
|
|
16
|
-
with:
|
|
17
|
-
ruby-version: 2.6.5
|
|
18
|
-
- name: Install dependencies
|
|
19
|
-
run: bundle install
|
|
20
|
-
- name: Run tests
|
|
21
|
-
run: bundle exec rspec
|
|
22
|
-
- name: Report coverage
|
|
23
|
-
uses: paambaati/codeclimate-action@v2.6.0
|
|
24
|
-
env:
|
|
25
|
-
CC_TEST_REPORTER_ID: ${{secrets.CC_TEST_REPORTER_ID}}
|
|
26
|
-
with:
|
|
27
|
-
# Coverage is already generated in test step, need to run anything again
|
|
28
|
-
coverageCommand: echo '' > /dev/null
|
data/benchmark/benchmark.jpg
DELETED
|
Binary file
|
data/benchmark/benchmark.rb
DELETED
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'graphql/groups'
|
|
4
|
-
|
|
5
|
-
require 'database_cleaner/active_record'
|
|
6
|
-
require 'gqli/dsl'
|
|
7
|
-
require 'benchmark/ips'
|
|
8
|
-
require 'gruff'
|
|
9
|
-
|
|
10
|
-
require_relative '../spec/graphql/support/test_schema/db'
|
|
11
|
-
require_relative '../spec/graphql/support/test_schema/models'
|
|
12
|
-
require_relative 'benchmark_schema'
|
|
13
|
-
|
|
14
|
-
class Compare
|
|
15
|
-
def run
|
|
16
|
-
puts 'Generating reports...'
|
|
17
|
-
datasets = perform_runs
|
|
18
|
-
labels = { 0 => '10', 1 => '100', 2 => '1000', 3 => '10000' }
|
|
19
|
-
puts 'Generating graph...'
|
|
20
|
-
graph = graph(labels, datasets)
|
|
21
|
-
graph.write('benchmark/benchmark.jpg')
|
|
22
|
-
puts 'Done!'
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
private
|
|
26
|
-
|
|
27
|
-
def perform_runs
|
|
28
|
-
runs = [10, 100, 1000, 10_000]
|
|
29
|
-
runs.map { |count| single_run(count) }
|
|
30
|
-
.map(&:data)
|
|
31
|
-
.map { |data| { groups: data.first[:ips], group_by: data.second[:ips] } }
|
|
32
|
-
.each_with_object({ groups: [], group_by: [] }) do |item, object|
|
|
33
|
-
object[:groups].push(item[:groups])
|
|
34
|
-
object[:group_by].push(item[:group_by])
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def graph(labels, datasets)
|
|
39
|
-
g = Gruff::Bar.new(800)
|
|
40
|
-
g.title = 'graphql-groups vs group_by'
|
|
41
|
-
g.theme = Gruff::Themes::THIRTYSEVEN_SIGNALS
|
|
42
|
-
g.labels = labels
|
|
43
|
-
g.x_axis_label = 'records'
|
|
44
|
-
g.y_axis_label = 'iterations/second'
|
|
45
|
-
datasets.each do |data|
|
|
46
|
-
g.data(data[0], data[1])
|
|
47
|
-
end
|
|
48
|
-
g
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def single_run(count)
|
|
52
|
-
DatabaseCleaner.strategy = :transaction
|
|
53
|
-
DatabaseCleaner.start
|
|
54
|
-
seed(count)
|
|
55
|
-
report = run_benchmark
|
|
56
|
-
DatabaseCleaner.clean
|
|
57
|
-
report
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def seed(count)
|
|
61
|
-
names = %w[Ada Alice Bob Bruce]
|
|
62
|
-
count.times { Author.create(name: names.sample) }
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def groups_query
|
|
66
|
-
GQLi::DSL.query {
|
|
67
|
-
fastGroups {
|
|
68
|
-
name {
|
|
69
|
-
key
|
|
70
|
-
count
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}.to_gql
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
def naive_query
|
|
77
|
-
GQLi::DSL.query {
|
|
78
|
-
slowGroups {
|
|
79
|
-
name {
|
|
80
|
-
key
|
|
81
|
-
count
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}.to_gql
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def run_benchmark
|
|
88
|
-
Benchmark.ips(quiet: true) do |x|
|
|
89
|
-
# Configure the number of seconds used during
|
|
90
|
-
# the warmup phase (default 2) and calculation phase (default 5)
|
|
91
|
-
x.config(time: 2, warmup: 1)
|
|
92
|
-
|
|
93
|
-
x.report('groups') { PerformanceSchema.execute(groups_query) }
|
|
94
|
-
|
|
95
|
-
x.report('group-by') { PerformanceSchema.execute(naive_query) }
|
|
96
|
-
|
|
97
|
-
# Compare the iterations per second of the various reports!
|
|
98
|
-
x.compare!
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
end
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'graphql'
|
|
4
|
-
require 'graphql/groups'
|
|
5
|
-
|
|
6
|
-
class BaseType < GraphQL::Schema::Object; end
|
|
7
|
-
|
|
8
|
-
class AuthorGroupType < GraphQL::Groups::Schema::GroupType
|
|
9
|
-
scope { Author.all }
|
|
10
|
-
|
|
11
|
-
by :name
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
class SlowAuthorGroupResultType < GraphQL::Schema::Object
|
|
15
|
-
field :key, String, null: false
|
|
16
|
-
field :count, Integer, null: false
|
|
17
|
-
|
|
18
|
-
def key
|
|
19
|
-
object[0]
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def count
|
|
23
|
-
object[1].size
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
class SlowAuthorGroupType < GraphQL::Schema::Object
|
|
28
|
-
field :name, [SlowAuthorGroupResultType], null: false
|
|
29
|
-
|
|
30
|
-
def name
|
|
31
|
-
object.group_by(&:name)
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
class QueryType < BaseType
|
|
36
|
-
include GraphQL::Groups
|
|
37
|
-
|
|
38
|
-
group :fast_groups, AuthorGroupType, camelize: true
|
|
39
|
-
|
|
40
|
-
field :slow_groups, SlowAuthorGroupType, null: false, camelize: true
|
|
41
|
-
|
|
42
|
-
def slow_groups
|
|
43
|
-
Author.all
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
class PerformanceSchema < GraphQL::Schema
|
|
48
|
-
query QueryType
|
|
49
|
-
|
|
50
|
-
def self.resolve_type(_type, obj, _ctx)
|
|
51
|
-
"#{obj.class.name}Type"
|
|
52
|
-
end
|
|
53
|
-
end
|