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 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