activecube 0.1.5 → 0.1.6

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