metrix_db 0.0.2 → 0.0.3

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.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- metrix_db (0.0.1)
4
+ metrix_db (0.0.2)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
data/README.md CHANGED
@@ -14,7 +14,7 @@ Usage
14
14
 
15
15
  class MyDB
16
16
  include MetrixDB
17
- field :col1
17
+ field :col1, :uniq => false
18
18
  field :col2
19
19
  dataset [[1,2],[3,4]]
20
20
  end
@@ -25,6 +25,14 @@ Usage
25
25
  * Set dataset, dataset is the real data of one DB
26
26
 
27
27
 
28
+ Field
29
+ -----
30
+
31
+ Options for field definition
32
+
33
+ `uniq`: Check if column is unique. Default value is true.
34
+
35
+
28
36
  Query
29
37
  -----
30
38
 
@@ -1,3 +1,3 @@
1
1
  module MetrixDb
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/metrix_db.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  module MetrixDB
2
+ class UniqueFieldError < Exception; end
3
+
2
4
  def self.included(base)
3
5
  base.extend ClassMethods
4
6
  base.send(:include, InstanceMethods)
@@ -11,9 +13,14 @@ module MetrixDB
11
13
  end
12
14
 
13
15
  module ClassMethods
14
- def field(name)
16
+ def field(name, options = {})
17
+ default_options = {:uniq => true}
18
+ options = default_options.merge(options)
15
19
  @fields ||= {}
16
- @fields[name.to_sym] = @fields.size
20
+ index = @fields.size
21
+ @fields[name.to_sym] = index
22
+ @uniq_fields ||= {}
23
+ @uniq_fields[index] = name.to_s if options[:uniq]
17
24
  define_method "#{name}" do
18
25
  @data[self.class.fields[name.to_sym]]
19
26
  end
@@ -25,9 +32,21 @@ module MetrixDB
25
32
 
26
33
  def dataset(_dataset)
27
34
  @dataset = _dataset
35
+ check_uniq_fields(_dataset)
36
+ end
37
+
38
+ def check_uniq_fields(_dataset)
39
+ return unless @uniq_fields
40
+ @uniq_fields.each_pair do |index, field_name|
41
+ col_data = _dataset.map {|data| data[index]}
42
+ if col_data.uniq!
43
+ raise UniqueFieldError.new("Field '#{field_name}' is not unique")
44
+ end
45
+ end
28
46
  end
29
47
 
30
48
  def where(conditions={})
49
+ return nil if @dataset.nil? || @fields.nil?
31
50
  @dataset.each do |data|
32
51
  conditions.each_pair do |k, v|
33
52
  return self.new(data) if data[@fields[k.to_sym]] == v
@@ -28,4 +28,23 @@ describe MetrixDB do
28
28
  ins.field2.should == 2
29
29
  end
30
30
  end
31
+
32
+ context "unique field" do
33
+ it "should raise exception if field is unique" do
34
+ lambda { @class = Class.new {
35
+ include MetrixDB
36
+ field :field
37
+ dataset [[1],[1]]
38
+ }}.should raise_error MetrixDB::UniqueFieldError, "Field 'field' is not unique"
39
+ end
40
+
41
+ it "should not raise exception if field is not unique" do
42
+ lambda { @class = Class.new {
43
+ include MetrixDB
44
+ field :field, :uniq => false
45
+ dataset [[1],[1]]
46
+ }}.should_not raise_error
47
+ end
48
+
49
+ end
31
50
  end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe MetrixDB do
4
4
  context ".where" do
5
5
  before do
6
- dataset = [[1,2],[2,3]]
6
+ dataset = [[1,2],[2,3]]
7
7
  @dataset = dataset
8
8
  @class = Class.new do
9
9
  include MetrixDB
@@ -38,6 +38,7 @@ describe MetrixDB do
38
38
  inst.col1.should == 1
39
39
  inst.col2.should == 2
40
40
  end
41
+
41
42
  end
42
43
  end
43
44
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metrix_db
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Allen Wei