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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ef6448e22d9122edb34207112002802381c6f807a60a73150add0dfba415eff2
4
- data.tar.gz: f1db99febe43eb9943f96c344bbd77c2c3a42e6619225b9266980b6b2e3c486b
3
+ metadata.gz: 7d42d7f3082abaee0001f6a0506dd25ceca99d7c1b5426d85b4d36b9334ddf1c
4
+ data.tar.gz: 616e25180c79b3a2d922925ba996d1503821fa4ba0d16a6dd52ea549a697847e
5
5
  SHA512:
6
- metadata.gz: c4ea5bf5ac7fc108a1868cdffc4b12a7c916d34b4f93bc9c094f930a405dd27e989e60287d39ebe2ed136add74de86bd0849dcd47122e54489e5a02ddb9276ca
7
- data.tar.gz: d67e1cd6832b0c4bbc1ce2669ca145359b34e31ba5182392ff25d5b7e13b9bc639ae4822121821739b52bb7c0f2b829d06fb76c51cbd15b346db5f8a1488a26a
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.collect do |measure|
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{|s| s.dimension.class.identity || s.key }.uniq
120
+ slices.map(&:group_by_columns).uniq
121
121
  end
122
122
 
123
123
  def orderings
@@ -10,7 +10,7 @@ module Activecube::Query
10
10
  @selectors = selectors
11
11
  @modifications = modifications
12
12
 
13
- modifier_methods! if definition.class.modifiers
13
+ modifier_methods! if definition && definition.class.modifiers
14
14
  end
15
15
 
16
16
  def required_column_names
@@ -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','ne','gt','lt','gteq','lteq','in','not_in','between']
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, :ne
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, parent
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 identity = dimension.class.identity
57
- query = query.project(table[identity]).group(table[identity])
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
 
@@ -1,3 +1,3 @@
1
1
  module Activecube
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
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.3
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-02-24 00:00:00.000000000 Z
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