activecube 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/lib/activecube/definition_methods.rb +2 -2
- data/lib/activecube/processor/composer.rb +5 -1
- data/lib/activecube/query/cube_query.rb +2 -2
- data/lib/activecube/query/measure.rb +1 -1
- data/lib/activecube/query/measure_nothing.rb +23 -0
- data/lib/activecube/query/selector.rb +2 -2
- data/lib/activecube/query/slice.rb +29 -9
- data/lib/activecube/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7d42d7f3082abaee0001f6a0506dd25ceca99d7c1b5426d85b4d36b9334ddf1c
|
4
|
+
data.tar.gz: 616e25180c79b3a2d922925ba996d1503821fa4ba0d16a6dd52ea549a697847e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 67ed87f68ef39228ecda9881ba7b8f909c63afd92b6ba6cdc41e1053ccdd7974b7846421d530cd7ec21eb89ffbcaa1439f92892a9a347f3ed36ec655e5b1f140
|
7
|
+
data.tar.gz: 5b81d7c9ac459a01d9761a2f55a86c57efc5a030275b731c96c421579650c3fc282c464231733e177683b85f39b45152405fbef8f30c990bdc742cd3cd8b33ab
|
@@ -9,8 +9,8 @@ module Activecube
|
|
9
9
|
attr_reader :column_names
|
10
10
|
|
11
11
|
def column_name
|
12
|
-
raise "Not defined column for a metric #{self.name}" if column_names.empty?
|
13
|
-
raise "Defined more than one column for a metric #{self.name}" if column_names.count>1
|
12
|
+
raise "Not defined column for a a dimension or metric #{self.name}" if column_names.empty?
|
13
|
+
raise "Defined more than one column for a dimension or metric #{self.name}" if column_names.count>1
|
14
14
|
column_names.first
|
15
15
|
end
|
16
16
|
|
@@ -2,6 +2,7 @@ require 'activecube/processor/index'
|
|
2
2
|
require 'activecube/processor/measure_tables'
|
3
3
|
require 'activecube/processor/optimizer'
|
4
4
|
require 'activecube/processor/table'
|
5
|
+
require 'activecube/query/measure_nothing'
|
5
6
|
|
6
7
|
module Activecube::Processor
|
7
8
|
class Composer
|
@@ -51,7 +52,10 @@ module Activecube::Processor
|
|
51
52
|
|
52
53
|
def ranked_tables
|
53
54
|
tables = cube_query.cube.tables.select{|table| table.matches? cube_query, []}
|
54
|
-
cube_query.measures.
|
55
|
+
measures = cube_query.measures.empty? ?
|
56
|
+
[Activecube::Query::MeasureNothing.new(cube_query.cube)] :
|
57
|
+
cube_query.measures
|
58
|
+
measures.collect do |measure|
|
55
59
|
by = MeasureTables.new measure
|
56
60
|
tables.each{|table|
|
57
61
|
next unless table.measures? measure
|
@@ -83,7 +83,7 @@ module Activecube::Query
|
|
83
83
|
end
|
84
84
|
|
85
85
|
def selector_column_names measures = self.measures
|
86
|
-
(measures.map(&:selectors) + selectors).flatten.map(&:required_column_names).flatten.uniq
|
86
|
+
(measures.map(&:selectors) + slices.map(&:selectors) + selectors).flatten.map(&:required_column_names).flatten.uniq
|
87
87
|
end
|
88
88
|
|
89
89
|
def reduced other_measures, other_options
|
@@ -117,7 +117,7 @@ module Activecube::Query
|
|
117
117
|
end
|
118
118
|
|
119
119
|
def join_fields
|
120
|
-
slices.map
|
120
|
+
slices.map(&:group_by_columns).uniq
|
121
121
|
end
|
122
122
|
|
123
123
|
def orderings
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'activecube/query/measure'
|
2
|
+
|
3
|
+
module Activecube::Query
|
4
|
+
class MeasureNothing < Measure
|
5
|
+
|
6
|
+
def initialize cube
|
7
|
+
super cube, nil , nil
|
8
|
+
end
|
9
|
+
|
10
|
+
def required_column_names
|
11
|
+
[]
|
12
|
+
end
|
13
|
+
|
14
|
+
def append_query _model, _cube_query, _table, query
|
15
|
+
query
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
"Measure nothing, used for queries where no metrics defined"
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Activecube::Query
|
2
2
|
class Selector < Item
|
3
3
|
|
4
|
-
OPERATORS = ['eq','
|
4
|
+
OPERATORS = ['eq','not_eq','gt','lt','gteq','lteq','in','not_in','between']
|
5
5
|
ARRAY_OPERATORS = ['in','not_in']
|
6
6
|
|
7
7
|
class Operator
|
@@ -64,7 +64,7 @@ module Activecube::Query
|
|
64
64
|
alias_method :since, :gteq
|
65
65
|
alias_method :till, :lteq
|
66
66
|
alias_method :is, :eq
|
67
|
-
alias_method :not, :
|
67
|
+
alias_method :not, :not_eq
|
68
68
|
alias_method :after, :gt
|
69
69
|
alias_method :before, :lt
|
70
70
|
|
@@ -1,11 +1,13 @@
|
|
1
1
|
module Activecube::Query
|
2
2
|
class Slice < Item
|
3
3
|
|
4
|
-
attr_reader :dimension, :parent
|
5
|
-
def initialize cube, key, definition, parent = nil
|
4
|
+
attr_reader :dimension, :parent, :selectors
|
5
|
+
def initialize cube, key, definition, parent = nil, selectors = []
|
6
6
|
super cube, key, definition
|
7
7
|
@dimension = parent ? parent.dimension : definition
|
8
8
|
@parent = parent
|
9
|
+
|
10
|
+
@selectors = selectors
|
9
11
|
|
10
12
|
if parent
|
11
13
|
raise "Unexpected class #{definition.class.name}" unless definition.kind_of?(Activecube::Field)
|
@@ -15,7 +17,7 @@ module Activecube::Query
|
|
15
17
|
end
|
16
18
|
|
17
19
|
def required_column_names
|
18
|
-
dimension.class.column_names || []
|
20
|
+
((dimension.class.column_names || []) + selectors.map(&:required_column_names) ).flatten.uniq
|
19
21
|
end
|
20
22
|
|
21
23
|
def [] arg
|
@@ -23,12 +25,12 @@ module Activecube::Query
|
|
23
25
|
key = arg.to_sym
|
24
26
|
|
25
27
|
child = if definition.kind_of? Activecube::Dimension
|
26
|
-
definition.class.fields[key]
|
28
|
+
definition.class.fields && definition.class.fields[key]
|
27
29
|
elsif definition.kind_of?(Activecube::Field) && (hash = definition.definition).kind_of?(Hash)
|
28
30
|
hash[key]
|
29
31
|
end
|
30
32
|
|
31
|
-
raise "Field #{key} is not defined for #{definition}" unless child
|
33
|
+
raise ArgumentError, "Field #{key} is not defined for #{definition}" unless child
|
32
34
|
|
33
35
|
if child.kind_of?(Class) && child <= Activecube::Field
|
34
36
|
child = child.new key
|
@@ -41,20 +43,34 @@ module Activecube::Query
|
|
41
43
|
end
|
42
44
|
|
43
45
|
def alias! new_key
|
44
|
-
self.class.new cube, new_key, definition,
|
46
|
+
self.class.new cube, new_key, definition, parent, selectors
|
47
|
+
end
|
48
|
+
|
49
|
+
def when *args
|
50
|
+
append *args, @selectors, Selector, cube.selectors
|
51
|
+
end
|
52
|
+
|
53
|
+
def group_by_columns
|
54
|
+
if dimension.class.identity
|
55
|
+
([dimension.class.identity] + dimension.class.column_names).uniq
|
56
|
+
else
|
57
|
+
[key]
|
58
|
+
end
|
45
59
|
end
|
46
60
|
|
47
61
|
def append_query model, cube_query, table, query
|
48
62
|
|
49
63
|
attr_alias = "`#{key.to_s}`"
|
50
|
-
expr = parent ?
|
64
|
+
expr = (parent || definition.respond_to?(:expression)) ?
|
51
65
|
Arel.sql(definition.expression( model, table, self, cube_query) ) :
|
52
66
|
table[dimension.class.column_name]
|
53
67
|
|
54
68
|
query = query.project(expr.as(attr_alias))
|
55
69
|
|
56
|
-
if
|
57
|
-
|
70
|
+
if dimension.class.identity
|
71
|
+
group_by_columns.each do |column|
|
72
|
+
query = query.project(table[column]).group(table[column])
|
73
|
+
end
|
58
74
|
else
|
59
75
|
query = query.group(attr_alias)
|
60
76
|
end
|
@@ -63,6 +79,10 @@ module Activecube::Query
|
|
63
79
|
query = query.order(attr_alias)
|
64
80
|
end
|
65
81
|
|
82
|
+
selectors.each do |selector|
|
83
|
+
selector.append_query model, cube_query, table, query
|
84
|
+
end
|
85
|
+
|
66
86
|
query
|
67
87
|
end
|
68
88
|
|
data/lib/activecube/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activecube
|
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
|
- Aleksey Studnev
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-03-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -108,6 +108,7 @@ files:
|
|
108
108
|
- lib/activecube/query/item.rb
|
109
109
|
- lib/activecube/query/limit.rb
|
110
110
|
- lib/activecube/query/measure.rb
|
111
|
+
- lib/activecube/query/measure_nothing.rb
|
111
112
|
- lib/activecube/query/modification.rb
|
112
113
|
- lib/activecube/query/or_selector.rb
|
113
114
|
- lib/activecube/query/ordering.rb
|