bitfields 0.5.0 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Readme.md +13 -13
- data/lib/bitfields.rb +6 -0
- data/lib/bitfields/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 08330b3abc50142d13e76b375850bf801e726a62
|
4
|
+
data.tar.gz: 7e8000377a4d47a4c58efeb407f49ab416878e47
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83a8a21cc1fb2507d5985c3b88eb88c61a0cfe91d75e18536eab8626bd864d2a8d658e75a2b64b547e9ba81c74dfa7c701f9cfaf4c17671ab147fb50a4c80bc8
|
7
|
+
data.tar.gz: 217bd3fca492ccdfac286537c5f228bb08c9ecacdbe6ce6dc1c0e767ca4ae1d4976b392a74eed737907e9c3d12cefd61331a3ce67240080a190d3a7ca5c8aebc
|
data/Readme.md
CHANGED
@@ -7,17 +7,17 @@ class User < ActiveRecord::Base
|
|
7
7
|
bitfield :my_bits, 1 => :seller, 2 => :insane, 4 => :stupid
|
8
8
|
end
|
9
9
|
|
10
|
-
user = User.new(:
|
10
|
+
user = User.new(foo: true, insane: true)
|
11
11
|
user.seller == true
|
12
12
|
user.stupid? == false
|
13
13
|
user.my_bits == 3
|
14
14
|
```
|
15
15
|
|
16
|
-
- records
|
17
|
-
- adds scopes `User.
|
18
|
-
- builds sql `User.bitfield_sql(:
|
19
|
-
- builds index-using sql with `bitfield ...
|
20
|
-
- builds update sql `User.set_bitfield_sql(:
|
16
|
+
- records bitfield_changes `user.bitfield_changes == {foo: [false, true]}` (also `foo_was` / `foo_change` / `foo_changed?`)
|
17
|
+
- adds scopes `User.foo.stupid.first` (deactivate with `bitfield ..., scopes: false`)
|
18
|
+
- builds sql `User.bitfield_sql(insane: true, stupid: false) == '(users.my_bits & 3) = 1'`
|
19
|
+
- builds index-using sql with `bitfield ... , query_mode: :in_list` and `User.bitfield_sql(insane: true, stupid: false) == 'users.my_bits IN (2, 3)'` (2 and 1+2), often slower than :bit_operator sql especially for high number of bits
|
20
|
+
- builds update sql `User.set_bitfield_sql(insane: true, stupid: false) == 'my_bits = (my_bits | 6) - 4'`
|
21
21
|
- **faster sql than any other bitfield lib** through combination of multiple bits into a single sql statement
|
22
22
|
- gives access to bits `User.bitfields[:my_bits][:stupid] == 4`
|
23
23
|
|
@@ -32,9 +32,9 @@ gem install bitfields
|
|
32
32
|
ALWAYS set a default, bitfield queries will not work for NULL
|
33
33
|
|
34
34
|
```ruby
|
35
|
-
t.integer :my_bits, :
|
35
|
+
t.integer :my_bits, default: 0, null: false
|
36
36
|
# OR
|
37
|
-
add_column :users, :my_bits, :integer, :
|
37
|
+
add_column :users, :my_bits, :integer, default: 0, null: false
|
38
38
|
```
|
39
39
|
|
40
40
|
Examples
|
@@ -42,13 +42,13 @@ Examples
|
|
42
42
|
Update all users
|
43
43
|
|
44
44
|
```ruby
|
45
|
-
User.seller.not_stupid.update_all(User.set_bitfield_sql(:
|
45
|
+
User.seller.not_stupid.update_all(User.set_bitfield_sql(seller: true, insane: true))
|
46
46
|
```
|
47
47
|
|
48
48
|
Delete the shop when a user is no longer a seller
|
49
49
|
|
50
50
|
```ruby
|
51
|
-
before_save :delete_shop, :
|
51
|
+
before_save :delete_shop, if: -> { |u| u.seller_change == [true, false]}
|
52
52
|
```
|
53
53
|
|
54
54
|
TIPS
|
@@ -56,14 +56,14 @@ TIPS
|
|
56
56
|
- [Upgrading] in version 0.2.2 the first field(when not given as hash) used bit 2 -> add a bogus field in first position
|
57
57
|
- [Defaults] afaik it is not possible to have some bits true by default (without monkeypatching AR/see [tests](https://github.com/grosser/bitfields/commit/2170dc546e2c4f1187089909a80e8602631d0796)) -> choose a good naming like `xxx_on` / `xxx_off` to use the default 'false'
|
58
58
|
- Never do: "#{bitfield_sql(...)} AND #{bitfield_sql(...)}", merge both into one hash
|
59
|
-
- bit_operator is faster in most cases, use :
|
59
|
+
- bit_operator is faster in most cases, use query_mode: :in_list sparingly
|
60
60
|
- Standard mysql integer is 4 byte -> 32 bitfields
|
61
61
|
- If you are lazy or bad at math you can also do `bitfields :bits, :foo, :bar, :baz`
|
62
62
|
- If you are want more readability and reduce clutter you can do `bitfields 2**0 => :foo, 2**1 => :bar, 2**32 => :baz`
|
63
63
|
|
64
64
|
Query-mode Benchmark
|
65
65
|
=========
|
66
|
-
The
|
66
|
+
The `query_mode: :in_list` is slower for most queries and scales mierably with the number of bits.<br/>
|
67
67
|
*Stay with the default query-mode*. Only use :in_list if your edge-case shows better performance.
|
68
68
|
|
69
69
|
![performance](http://chart.apis.google.com/chart?chtt=bit-operator+vs+IN+--+with+index&chd=s:CEGIKNPRUW,DEHJLOQSVX,CFHKMPSYXZ,DHJMPSVYbe,DHLPRVZbfi,FKOUZeinsx,FLQWbglqw2,HNTZfkqw19,BDEGHJLMOP,BDEGIKLNOQ,BDFGIKLNPQ,BDFGILMNPR,BDFHJKMOQR,BDFHJLMOQS,BDFHJLNPRT,BDFHJLNPRT&chxt=x,y&chxl=0:|100K|200K|300K|400K|500K|600K|700K|800K|900K|1000K|1:|0|1441.671ms&cht=lc&chs=600x500&chdl=2bits+%28in%29|3bits+%28in%29|4bits+%28in%29|6bits+%28in%29|8bits+%28in%29|10bits+%28in%29|12bits+%28in%29|14bits+%28in%29|2bits+%28bit%29|3bits+%28bit%29|4bits+%28bit%29|6bits+%28bit%29|8bits+%28bit%29|10bits+%28bit%29|12bits+%28bit%29|14bits+%28bit%29&chco=0000ff,0000ee,0000dd,0000cc,0000bb,0000aa,000099,000088,ff0000,ee0000,dd0000,cc0000,bb0000,aa0000,990000,880000)
|
@@ -83,7 +83,7 @@ end
|
|
83
83
|
|
84
84
|
TODO
|
85
85
|
====
|
86
|
-
- convenient named scope `User.with_bitfields(:
|
86
|
+
- convenient named scope `User.with_bitfields(xxx: true, yyy: false)`
|
87
87
|
|
88
88
|
Authors
|
89
89
|
=======
|
data/lib/bitfields.rb
CHANGED
@@ -84,6 +84,12 @@ module Bitfields
|
|
84
84
|
define_method(bit_name) { bitfield_value(bit_name) }
|
85
85
|
define_method("#{bit_name}?") { bitfield_value(bit_name) }
|
86
86
|
define_method("#{bit_name}=") { |value| set_bitfield_value(bit_name, value) }
|
87
|
+
define_method("#{bit_name}_was") { bitfield_value_was(bit_name) }
|
88
|
+
define_method("#{bit_name}_changed?") { bitfield_value_was(bit_name) != bitfield_value(bit_name) }
|
89
|
+
define_method("#{bit_name}_change") do
|
90
|
+
values = [bitfield_value_was(bit_name), bitfield_value(bit_name)]
|
91
|
+
values unless values[0] == values[1]
|
92
|
+
end
|
87
93
|
|
88
94
|
if options[:scopes] != false
|
89
95
|
scope bit_name, bitfield_scope_options(bit_name => true)
|
data/lib/bitfields/version.rb
CHANGED