activecube 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|