activecube 0.1.5 → 0.1.6

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: dc592d6e33b4c77abc5a2dc0e5bbed62434af3a16403872d8d12540e5a9d7b31
4
- data.tar.gz: 69ec2c856c6dab1a6100ebac782995ee1f53fbc776282032f626d6e0334da195
3
+ metadata.gz: 369247513801c454ee5bddd94d9d16b5e76a09a564b1461fd6910aeff50f512f
4
+ data.tar.gz: eb104eb20d315005026cde81d06d465aa68d4d450f0c27450afb44e6c6aa8d3d
5
5
  SHA512:
6
- metadata.gz: 6fd7d10f47d6c23baa720925fd6ed40f0372627b5ec4def3566671feb1025199c9c419c34edaf43a0f019423599d56ca53bbfd44906fcd2accf944aa8128f476
7
- data.tar.gz: fa8ef0205dafa5350b6e6319b9437cb03b824f9c98050ae48791a6faeee4959a414adda98688a67392446b9f432c56a33ee85aebab3cd08d358ee69d30dd2299
6
+ metadata.gz: f69aa684221fa54d01d8010816b895aa625a5454f02f4571757aec758dcb574121eca001bd7a6dbf2eac2579e6197829bafd8e983218af975868f15cff54c277
7
+ data.tar.gz: 91edb538973ff684ef2bc0eaeeee508176396802d3e48179b18644e084fc744793dbf3fa0f71f2a2b77f018d59b503b12727ad7e76e8f0374f13caaf0644f1f1
data/Gemfile.lock CHANGED
@@ -9,7 +9,7 @@ GIT
9
9
  PATH
10
10
  remote: .
11
11
  specs:
12
- activecube (0.1.4)
12
+ activecube (0.1.5)
13
13
  activerecord (>= 5.2)
14
14
 
15
15
  GEM
data/lib/activecube.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "activecube/version"
2
2
  require 'activecube/active_record_extension'
3
3
 
4
+ require 'activecube/input_argument_error'
4
5
  require 'activecube/base'
5
6
  require 'activecube/dimension'
6
7
  require 'activecube/metric'
@@ -13,19 +13,19 @@ module Activecube
13
13
 
14
14
  def [] key
15
15
  v = super key
16
- v.nil? ? nil : @entry_class.new(@cube, key, v)
16
+ v.nil? ? nil : @entry_class.new(@cube, key, v.new)
17
17
  end
18
18
 
19
19
  end
20
20
 
21
- attr_reader :dimensions, :metrics, :selectors, :tables
21
+ attr_reader :dimensions, :metrics, :selectors, :models
22
22
 
23
23
  def inspect
24
24
  name +
25
25
  (@dimensions && " Dimensions: #{@dimensions.keys.join(',')}")+
26
26
  (@metrics && " Metrics: #{@metrics.keys.join(',')}")+
27
27
  (@selectors && " Selectors: #{@selectors.keys.join(',')}")+
28
- (@tables && " Tables: #{@tables.map(&:name).join(',')}")
28
+ (@models && " Models: #{@models.map(&:name).join(',')}")
29
29
  end
30
30
 
31
31
  private
@@ -43,13 +43,13 @@ module Activecube
43
43
  end
44
44
 
45
45
  def table *args
46
- store_definition_array! 'table', (@tables ||= []), [*args].flatten.map{|t| Processor::Table.new t }
46
+ store_definition_array! 'model', (@models ||= []), [*args].flatten.map{|t| t }
47
47
  end
48
48
 
49
49
  def store_definition_map! name, map, data
50
50
  data.each_pair do |key, class_def|
51
51
  raise DefinitionError, "#{key} already defined for #{name}" if map.has_key?(key)
52
- map[key] = class_def.new
52
+ map[key] = class_def
53
53
  end
54
54
  end
55
55
 
@@ -42,7 +42,7 @@ module Activecube
42
42
 
43
43
  def field *args
44
44
  name = args.first.to_sym
45
- (@fields ||= {} )[name] = Field.build( name, args.second )
45
+ (@fields ||= {} )[name] = args.second
46
46
  end
47
47
 
48
48
  end
@@ -11,7 +11,7 @@ module Activecube
11
11
  elsif arg.kind_of?(Class) && arg < Field
12
12
  arg.new name
13
13
  else
14
- raise ArgumentError, "Unexpected field #{name} definition with #{arg.class.name}"
14
+ raise Activecube::InputArgumentError, "Unexpected field #{name} definition with #{arg.class.name}"
15
15
  end
16
16
  end
17
17
 
@@ -21,7 +21,7 @@ module Activecube
21
21
  end
22
22
 
23
23
  def expression _model, _arel_table, _slice, _cube_query
24
- raise ArgumentError, "String expression expected for #{name} field, instead #{definition.class.name} is found" unless definition.kind_of?(String)
24
+ raise Activecube::InputArgumentError, "String expression expected for #{name} field, instead #{definition.class.name} is found" unless definition.kind_of?(String)
25
25
  definition
26
26
  end
27
27
 
@@ -0,0 +1,4 @@
1
+ module Activecube
2
+ class InputArgumentError < ::ArgumentError
3
+ end
4
+ end
@@ -51,7 +51,7 @@ module Activecube::Processor
51
51
  end
52
52
 
53
53
  def ranked_tables
54
- tables = cube_query.cube.tables.select{|table| table.matches? cube_query, []}
54
+ tables = cube_query.tables.select{|table| table.matches? cube_query, []}
55
55
  measures = cube_query.measures.empty? ?
56
56
  [Activecube::Query::MeasureNothing.new(cube_query.cube)] :
57
57
  cube_query.measures
@@ -10,11 +10,11 @@ module Activecube::Query
10
10
  arg
11
11
  elsif arg.kind_of? Hash
12
12
  arg.collect{|pair|
13
- raise ArgumentError, "Unexpected #{pair.second.class.name} to use for #{def_class} as #{arg}[#{pair.first}]" unless pair.second.kind_of?(def_class)
13
+ raise Activecube::InputArgumentError, "Unexpected #{pair.second.class.name} to use for #{def_class} as #{arg}[#{pair.first}]" unless pair.second.kind_of?(def_class)
14
14
  pair.second.alias! pair.first
15
15
  }
16
16
  else
17
- raise ArgumentError, "Unexpected #{arg.class} to use for #{def_class} as #{arg}"
17
+ raise Activecube::InputArgumentError, "Unexpected #{arg.class} to use for #{def_class} as #{arg}"
18
18
  end
19
19
  }.flatten
20
20
  self
@@ -14,13 +14,14 @@ module Activecube::Query
14
14
 
15
15
  include ChainAppender
16
16
 
17
- attr_reader :cube, :slices, :measures, :selectors, :options
18
- def initialize cube, slices = [], measures = [], selectors = [], options = []
17
+ attr_reader :cube, :slices, :measures, :selectors, :options, :tables
18
+ def initialize cube, slices = [], measures = [], selectors = [], options = [], model_tables = nil
19
19
  @cube = cube
20
20
  @slices = slices
21
21
  @measures = measures
22
22
  @selectors = selectors
23
23
  @options = options
24
+ @tables = model_tables || cube.models.map{|m| Activecube::Processor::Table.new m}
24
25
  end
25
26
 
26
27
  def slice *args
@@ -113,7 +114,7 @@ module Activecube::Query
113
114
 
114
115
  return self if (reduced_measures == self.measures) && (reduced_selectors == self.selectors)
115
116
 
116
- CubeQuery.new cube, slices, reduced_measures, reduced_selectors, other_options
117
+ CubeQuery.new cube, slices, reduced_measures, reduced_selectors, other_options, tables
117
118
  end
118
119
 
119
120
  def join_fields
@@ -50,7 +50,7 @@ module Activecube::Query
50
50
 
51
51
  OPERATORS.each do |method|
52
52
  define_method(method) do |*args|
53
- raise ArgumentError, "Selector for #{method} already set" if operator
53
+ raise Activecube::InputArgumentError, "Selector for #{method} already set" if operator
54
54
  if ARRAY_OPERATORS.include? method
55
55
  @operator = Operator.new(method, args.flatten)
56
56
  elsif method=='between'
@@ -59,10 +59,10 @@ module Activecube::Query
59
59
  elsif args.kind_of?(Array) && (arg = args.flatten).count==2
60
60
  @operator = Operator.new(method, arg[0]..arg[1])
61
61
  else
62
- raise ArgumentError, "Unexpected size of arguments for #{method}, must be Range or Array of 2"
62
+ raise Activecube::InputArgumentError, "Unexpected size of arguments for #{method}, must be Range or Array of 2"
63
63
  end
64
64
  else
65
- raise ArgumentError, "Unexpected size of arguments for #{method}" unless args.size==1
65
+ raise Activecube::InputArgumentError, "Unexpected size of arguments for #{method}" unless args.size==1
66
66
  @operator = Operator.new(method, args.first)
67
67
  end
68
68
  self
@@ -24,13 +24,13 @@ module Activecube::Query
24
24
 
25
25
  key = arg.to_sym
26
26
 
27
- child = if definition.kind_of? Activecube::Dimension
28
- definition.class.fields && definition.class.fields[key]
27
+ child = if definition.kind_of?(Activecube::Dimension) && definition.class.fields && (fdef = definition.class.fields[key])
28
+ Activecube::Field.build key, fdef
29
29
  elsif definition.kind_of?(Activecube::Field) && (hash = definition.definition).kind_of?(Hash)
30
- hash[key]
30
+ Activecube::Field.build key, hash[key]
31
31
  end
32
32
 
33
- raise ArgumentError, "Field #{key} is not defined for #{definition}" unless child
33
+ raise Activecube::InputArgumentError, "Field #{key} is not defined for #{definition}" unless child
34
34
 
35
35
  if child.kind_of?(Class) && child <= Activecube::Field
36
36
  child = child.new key
@@ -12,7 +12,7 @@ module Activecube
12
12
  end
13
13
 
14
14
  def connected_to database: nil, role: nil, &block
15
- raise ArgumentError, "Must pass block to method" unless block_given?
15
+ raise Activecube::InputArgumentError, "Must pass block to method" unless block_given?
16
16
  super_model.connected_to(database: database, role: role) do
17
17
  @database = database
18
18
  @role = role
@@ -24,10 +24,10 @@ module Activecube
24
24
 
25
25
 
26
26
  def super_model
27
- raise ArgumentError, "No tables specified for cube #{name}" if tables.count==0
27
+ raise Activecube::InputArgumentError, "No tables specified for cube #{name}" if models.count==0
28
28
 
29
- tables.collect{ |t|
30
- t.model.ancestors.select{|c| c < ActiveRecord::Base }
29
+ models.collect{ |t|
30
+ t.ancestors.select{|c| c < ActiveRecord::Base }
31
31
  }.transpose.select{|c|
32
32
  c.uniq.count==1
33
33
  }.last.first
@@ -1,3 +1,3 @@
1
1
  module Activecube
2
- VERSION = "0.1.5"
2
+ VERSION = "0.1.6"
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.5
4
+ version: 0.1.6
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-03-04 00:00:00.000000000 Z
11
+ date: 2020-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -96,6 +96,7 @@ files:
96
96
  - lib/activecube/definition_methods.rb
97
97
  - lib/activecube/dimension.rb
98
98
  - lib/activecube/field.rb
99
+ - lib/activecube/input_argument_error.rb
99
100
  - lib/activecube/metric.rb
100
101
  - lib/activecube/modifier.rb
101
102
  - lib/activecube/processor/composer.rb