forest_admin_datasource_active_record 1.0.0.pre.beta.21 → 1.0.0.pre.beta.23

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aace6865ce55eb722690ad3a410c31144c81a2ac7aa3f9db0d5dcb7d706e4544
4
- data.tar.gz: 1ced7531287ce44c3d834875980471ccfaab5a7f2ea401ab84405f9547da96c8
3
+ metadata.gz: 51b8d4407b45292ae0e56ff578709bec39e08d678e6b47a1fbc24d719f2f63f3
4
+ data.tar.gz: d56d1f01095082675496cab77136c0ff076f1159d2f8399494d9ce168e361337
5
5
  SHA512:
6
- metadata.gz: 9c6f07ba223bcbe79dac1bd5ab787378e4b68e9e0bc75576e67cc91d7d5f7de6cac8b2d60c94d66716b7140a93c8d5b19206336e0fa6efae8d419b93a07f0565
7
- data.tar.gz: fd9d4172f74352ff3226513a2bc7b59f04f26b10ba04948c6d5ee87f8cc73e9f14575fe657cb36ea1892a2d5239c893cb7e7d7fc86a5683b81c0edd959d691ca
6
+ metadata.gz: ea8ce626732ebaad40be56a418e45367c7c51093ad19059b2c5f24ca9a0d36f8879b4a998b07f41e903c8e2491ba2d42d2cfd0998cae9a1bf24bc31c8b8fd762
7
+ data.tar.gz: dbb0fac6f26019beb6802c0f254e6b919ad08e7e8bbb0026aaca500c22ca92f1bd0101ab2da33d0b37315f155c6ede874f6fb420ec8f684aa936bf53bfa64e85
@@ -33,5 +33,6 @@ admin work on any Ruby application."
33
33
  spec.require_paths = ["lib"]
34
34
 
35
35
  spec.add_dependency "activerecord", ">= 6.1"
36
+ spec.add_dependency "activesupport", ">= 6.1"
36
37
  spec.add_dependency "zeitwerk", "~> 2.3"
37
38
  end
@@ -20,15 +20,8 @@ module ForestAdminDatasourceActiveRecord
20
20
  query.all
21
21
  end
22
22
 
23
- def aggregate(_caller, _filter, aggregation, _limit = nil)
24
- field = aggregation.field || '*'
25
-
26
- [
27
- {
28
- value: @model.send(aggregation.operation.downcase, field),
29
- group: []
30
- }
31
- ]
23
+ def aggregate(_caller, filter, aggregation, limit = nil)
24
+ Utils::QueryAggregate.new(self, aggregation, filter, limit).get
32
25
  end
33
26
 
34
27
  def create(_caller, data)
@@ -27,7 +27,7 @@ module ForestAdminDatasourceActiveRecord
27
27
  return 'Enum'
28
28
  end
29
29
 
30
- is_array = (column.respond_to?(:array) && column.array == true)
30
+ is_array = column.respond_to?(:array) && column.array == true
31
31
  is_array ? "[#{TYPES[column.type]}]" : TYPES[column.type]
32
32
  end
33
33
 
@@ -37,7 +37,7 @@ module ForestAdminDatasourceActiveRecord
37
37
  if sti_column?(model, column)
38
38
  model.descendants.each { |sti_model| enum_values << sti_model.name }
39
39
  else
40
- model.defined_enums[column.name].each { |name, _value| enum_values << name }
40
+ model.defined_enums[column.name].each_key { |name| enum_values << name }
41
41
  end
42
42
  end
43
43
  enum_values
@@ -9,13 +9,13 @@ module ForestAdminDatasourceActiveRecord
9
9
  @projection = projection
10
10
  @filter = filter
11
11
  @arel_table = @collection.model.arel_table
12
+ @select = []
12
13
  end
13
14
 
14
15
  def build
15
- @query = select
16
- @query = apply_filter
17
-
18
- @query
16
+ build_select
17
+ apply_filter
18
+ apply_select
19
19
  end
20
20
 
21
21
  def apply_filter
@@ -71,19 +71,30 @@ module ForestAdminDatasourceActiveRecord
71
71
  @query
72
72
  end
73
73
 
74
- def select
74
+ def build_select
75
75
  unless @projection.nil?
76
- query_select = @projection.columns.map { |field| "#{@collection.model.table_name}.#{field}" }
77
- @projection.relations.each do |relation, _fields|
76
+ @select += @projection.columns.map { |field| "#{@collection.model.table_name}.#{field}" }
77
+ @projection.relations.each_key do |relation|
78
78
  relation_schema = @collection.fields[relation]
79
- if relation_schema.type == 'OneToOne'
80
- query_select.push("#{@collection.model.table_name}.#{relation_schema.origin_key_target}")
81
- else
82
- query_select.push("#{@collection.model.table_name}.#{relation_schema.foreign_key}")
83
- end
79
+ @select << if relation_schema.type == 'OneToOne'
80
+ "#{@collection.model.table_name}.#{relation_schema.origin_key_target}"
81
+ else
82
+ "#{@collection.model.table_name}.#{relation_schema.foreign_key}"
83
+ end
84
84
  end
85
85
 
86
- @query = @query.select(query_select.join(', '))
86
+ # @query = @query.select(query_select.join(', '))
87
+ # @query = @query.eager_load(@projection.relations.keys.map(&:to_sym))
88
+ # # TODO: replace eager_load by joins because eager_load select ALL columns of relation
89
+ # # @query = @query.joins(@projection.relations.keys.map(&:to_sym))
90
+ end
91
+
92
+ @query
93
+ end
94
+
95
+ def apply_select
96
+ unless @projection.nil?
97
+ @query = @query.select(@select.join(', '))
87
98
  @query = @query.eager_load(@projection.relations.keys.map(&:to_sym))
88
99
  # TODO: replace eager_load by joins because eager_load select ALL columns of relation
89
100
  # @query = @query.joins(@projection.relations.keys.map(&:to_sym))
@@ -0,0 +1,49 @@
1
+ module ForestAdminDatasourceActiveRecord
2
+ module Utils
3
+ class QueryAggregate < Query
4
+ include ForestAdminDatasourceToolkit::Components::Query::ConditionTree
5
+ include ForestAdminDatasourceToolkit::Components::Query
6
+
7
+ def initialize(collection, aggregation, filter = nil, limit = nil)
8
+ super(collection, ForestAdminDatasourceToolkit::Components::Query::Projection.new, filter)
9
+ @aggregation = aggregation
10
+ @limit = limit
11
+ @operation = aggregation.operation.downcase
12
+ @field = aggregation.field.nil? ? '*' : format_field(aggregation.field)
13
+ end
14
+
15
+ def get
16
+ group_fields = []
17
+ @aggregation.groups.each do |group|
18
+ field = format_field(group[:field])
19
+ if group[:operation]
20
+ @select << "DATE_TRUNC('#{group[:operation].downcase}', #{field}) AS \"#{group[:field]}\""
21
+ group_fields << "DATE_TRUNC('#{group[:operation].downcase}', #{field})"
22
+ else
23
+ @select << "#{field} AS \"#{group[:field]}\""
24
+ group_fields << field
25
+ end
26
+ end
27
+
28
+ @select << "#{@operation}(#{@field}) AS #{@operation}"
29
+ @query = @query.order("#{@operation} DESC")
30
+ @query = @query.limit(@limit) if @limit
31
+ @query = @query.group(group_fields.join(','))
32
+ build
33
+
34
+ compute_result_aggregate(@query)
35
+ end
36
+
37
+ def compute_result_aggregate(rows)
38
+ rows.map do |row|
39
+ {
40
+ value: row.send(@operation.to_sym),
41
+ group: @aggregation.groups.each_with_object({}) do |group, memo|
42
+ memo[group[:field]] = row.send(group[:field].to_sym)
43
+ end
44
+ }
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -1,3 +1,3 @@
1
1
  module ForestAdminDatasourceActiveRecord
2
- VERSION = "1.0.0-beta.21"
2
+ VERSION = "1.0.0-beta.23"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: forest_admin_datasource_active_record
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.pre.beta.21
4
+ version: 1.0.0.pre.beta.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthieu
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2023-11-20 00:00:00.000000000 Z
12
+ date: 2023-12-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -25,6 +25,20 @@ dependencies:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  version: '6.1'
28
+ - !ruby/object:Gem::Dependency
29
+ name: activesupport
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '6.1'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '6.1'
28
42
  - !ruby/object:Gem::Dependency
29
43
  name: zeitwerk
30
44
  requirement: !ruby/object:Gem::Requirement
@@ -60,6 +74,7 @@ files:
60
74
  - lib/forest_admin_datasource_active_record/parser/relation.rb
61
75
  - lib/forest_admin_datasource_active_record/parser/validation.rb
62
76
  - lib/forest_admin_datasource_active_record/utils/query.rb
77
+ - lib/forest_admin_datasource_active_record/utils/query_aggregate.rb
63
78
  - lib/forest_admin_datasource_active_record/version.rb
64
79
  - sig/forest_admin_datasource_active_record.rbs
65
80
  - sig/forest_admin_datasource_active_record/collection.rbs