believer 0.1.2 → 0.1.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/README.md +130 -0
- data/lib/believer/columns.rb +22 -0
- data/lib/believer/environment.rb +23 -4
- data/lib/believer/environment/rails_env.rb +7 -10
- data/lib/believer/version.rb +1 -1
- data/spec/support/test_classes.rb +2 -1
- metadata +1 -1
data/README.md
CHANGED
@@ -1,2 +1,132 @@
|
|
1
|
+
# CQL3 Object Relational Mapping
|
2
|
+
Believer is an Object Relational Mapping library for CQL3
|
3
|
+
|
4
|
+
## Installation
|
5
|
+
gem install believer
|
6
|
+
|
7
|
+
## Inspiration
|
8
|
+
The Believer library is heavily inspired by ActiveRecord. Most patterns used in this library should be pretty familiar for ActiveRecord users.
|
9
|
+
|
10
|
+
## Usage
|
11
|
+
|
12
|
+
### Define your class
|
13
|
+
An example:
|
14
|
+
|
15
|
+
require 'believer'
|
16
|
+
|
17
|
+
class Artist < Believer::Base
|
18
|
+
column :name
|
19
|
+
column :label
|
20
|
+
|
21
|
+
primary_key :name
|
22
|
+
end
|
23
|
+
|
24
|
+
class Album < Believer::Base
|
25
|
+
column :artist
|
26
|
+
column :name
|
27
|
+
column :release_date, :type => :timestamp
|
28
|
+
|
29
|
+
primary_key :artist, :name
|
30
|
+
end
|
31
|
+
|
32
|
+
class Song < Believer::Base
|
33
|
+
column :artist
|
34
|
+
column :album
|
35
|
+
column :name
|
36
|
+
column :track_number, :type => :integer
|
37
|
+
|
38
|
+
primary_key :artist, :album, :name
|
39
|
+
end
|
40
|
+
|
41
|
+
#### The Believer::Base class
|
42
|
+
This is the class you should extend from.
|
43
|
+
|
44
|
+
#### The column class method
|
45
|
+
Defines the mapping between a Ruby object attribute and a Cassandra column. Also defines a getter and setter attribute with the same name.
|
46
|
+
The second argument is a Hash, which support the following keys:
|
47
|
+
* type: the data type. Supported are: :string, :integer, :float, :timestamp
|
48
|
+
|
49
|
+
|
50
|
+
#### The primary_key class method
|
51
|
+
Sets the primary key columns of the class.
|
52
|
+
In a situation where you're only querying data, you don't need to set this.
|
53
|
+
However, if you rely on object equality somewhere in your application, it is advisable to set the primary key, as the primary key values are used in the Believer::Base.eql? method.
|
54
|
+
|
55
|
+
### Query your class
|
56
|
+
The following methods can be used to query class instances.
|
57
|
+
* where: specify query filters
|
58
|
+
* select: specify which fields to load. Using none defaults to all fields being loaded.
|
59
|
+
* limit: limit the number of results to a maximum
|
60
|
+
* order: specify the order of the results
|
61
|
+
|
62
|
+
All methods are chainable, meaning you can
|
63
|
+
|
64
|
+
#### The where method
|
65
|
+
Use the where method to specify filters on the result set. These filters correspond to the expressions in the WHERE clause of a Cassandra query.
|
66
|
+
|
67
|
+
# Using a hash
|
68
|
+
Artist.where(:name => 'James Brown')
|
69
|
+
|
70
|
+
# Using a hash mapping key to an array of possible values. Maps to the CQL IN operator
|
71
|
+
Artist.where(:name => ['Coldplay', 'Depeche Mode', 'Eurythmics'])
|
72
|
+
|
73
|
+
# Using string with interpolation
|
74
|
+
Artist.where('name = ?', 'Foreigner')
|
75
|
+
|
76
|
+
#### The select method
|
77
|
+
Using the select method you can define the columns loaded in a query. These fields correspond to the expressions in the SELECT clause of a Cassandra query.
|
78
|
+
This might be handy in the case you have a table with a lot of columns, but only need a few.
|
79
|
+
|
80
|
+
# Select a single field
|
81
|
+
Artist.select(:name)
|
82
|
+
|
83
|
+
# Select a multiple fields
|
84
|
+
Artist.select(:name, :label)
|
85
|
+
|
86
|
+
#### The limit method
|
87
|
+
Limits the amount of records returned to the specified maximum
|
88
|
+
|
89
|
+
# Yield at most 20 class instances
|
90
|
+
Artist.limit(20)
|
91
|
+
|
92
|
+
#### The order method
|
93
|
+
Order the results in using the specified column
|
94
|
+
|
95
|
+
# Order ascending by name
|
96
|
+
Album.order(:name)
|
97
|
+
Album.order(:name, :asc)
|
98
|
+
|
99
|
+
# Order descending by name
|
100
|
+
Album.order(:name, :desc)
|
101
|
+
|
102
|
+
#### Method chaining
|
103
|
+
All query methods can be chained.
|
104
|
+
This is done by creating and returning a clone of the receiver. The clone is the receiver of the query method.
|
105
|
+
|
106
|
+
# 'Echoes'....
|
107
|
+
Song.where(:artist => 'Pink Floyd').where(:album => 'Meddle').order(:track_number, :desc).limit(1)
|
108
|
+
|
109
|
+
### Configuration
|
110
|
+
If using Rails, place a believer.yml file in the configuration directory of your application.
|
111
|
+
The file structure starts with the the environment name, followed by the connection configuration.
|
112
|
+
This is the client connection configuration passed to the cql-rb gem.
|
113
|
+
|
114
|
+
development:
|
115
|
+
host: 127.0.0.1
|
116
|
+
port: 9042
|
117
|
+
keyspace: my_keyspace
|
118
|
+
|
119
|
+
staging:
|
120
|
+
host: 'staging.mynetwork.local'
|
121
|
+
port: 9042
|
122
|
+
keyspace: my_keyspace
|
123
|
+
credentials:
|
124
|
+
username: john
|
125
|
+
password: $FDFD%@#&*
|
126
|
+
|
127
|
+
|
128
|
+
In other cases, you will have to programatically set the environment:
|
129
|
+
|
130
|
+
Believer::Base.environment = Believer::Environment::BaseEnv.new(:host => '127.0.0.1', :keyspace => 'mykeyspace')
|
1
131
|
|
2
132
|
|
data/lib/believer/columns.rb
CHANGED
@@ -20,6 +20,28 @@ module Believer
|
|
20
20
|
end
|
21
21
|
|
22
22
|
class Column
|
23
|
+
#TYPES = {
|
24
|
+
# :ascii strings US-ASCII character string
|
25
|
+
#bigint integers 64-bit signed long
|
26
|
+
#blob blobs Arbitrary bytes (no validation), expressed as hexadecimal
|
27
|
+
#boolean booleans true or false
|
28
|
+
#counter integers Distributed counter value (64-bit long)
|
29
|
+
#decimal integers, floats Variable-precision decimal
|
30
|
+
#double integers 64-bit IEEE-754 floating point
|
31
|
+
#float integers, floats 32-bit IEEE-754 floating point
|
32
|
+
#inet strings IP address string in IPv4 or IPv6 format*
|
33
|
+
# int integers 32-bit signed integer
|
34
|
+
#list n/a A collection of one or more ordered elements
|
35
|
+
#map n/a A JSON-style array of literals: { literal : literal, literal : literal ... }
|
36
|
+
#set n/a A collection of one or more elements
|
37
|
+
#text strings UTF-8 encoded string
|
38
|
+
#timestamp integers, strings Date plus time, encoded as 8 bytes since epoch
|
39
|
+
#uuid uuids A UUID in standard UUID format
|
40
|
+
#timeuuid uuids Type 1 UUID only (CQL 3)
|
41
|
+
#varchar strings UTF-8 encoded string
|
42
|
+
#varint integers Arbitrary-precision integer
|
43
|
+
#}
|
44
|
+
#
|
23
45
|
CQL_COL_TYPES = {
|
24
46
|
:integer => 'INT',
|
25
47
|
:string => 'VARCHAR',
|
data/lib/believer/environment.rb
CHANGED
@@ -7,8 +7,11 @@ module Believer
|
|
7
7
|
module ClassMethods
|
8
8
|
|
9
9
|
def environment
|
10
|
+
|
10
11
|
if @environment.nil?
|
11
|
-
if
|
12
|
+
if self.superclass.respond_to?(:environment)
|
13
|
+
@environment = self.superclass.environment
|
14
|
+
elsif defined?(::Rails)
|
12
15
|
@environment = ::Believer::Environment::RailsEnv.new
|
13
16
|
end
|
14
17
|
end
|
@@ -26,6 +29,22 @@ module Believer
|
|
26
29
|
# {:host => '127.0.0.1'}
|
27
30
|
#end
|
28
31
|
|
32
|
+
def initialize(config = nil)
|
33
|
+
@configuration = config.dup unless config.nil?
|
34
|
+
end
|
35
|
+
|
36
|
+
def configuration
|
37
|
+
@configuration ||= load_configuration
|
38
|
+
end
|
39
|
+
|
40
|
+
def configuration=(config)
|
41
|
+
@configuration = config
|
42
|
+
end
|
43
|
+
|
44
|
+
def connection_configuration
|
45
|
+
@connection_configuration ||= configuration.reject_if {|k, v| k == :pool}
|
46
|
+
end
|
47
|
+
|
29
48
|
def create_connection(options = {})
|
30
49
|
cc = connection_configuration
|
31
50
|
|
@@ -33,20 +52,20 @@ module Believer
|
|
33
52
|
connection = Cql::Client.connect(cc)
|
34
53
|
connection.use(cc[:keyspace])
|
35
54
|
else
|
36
|
-
connection = Cql::Client.connect(cc.delete_if {|k,v|k
|
55
|
+
connection = Cql::Client.connect(cc.delete_if {|k,v|k == :keyspace})
|
37
56
|
end
|
38
57
|
connection
|
39
58
|
end
|
40
59
|
|
41
60
|
def create_keyspace(connection = nil)
|
42
61
|
conn = connection || create_connection
|
43
|
-
ks_def = <<-
|
62
|
+
ks_def = <<-KS_DEF
|
44
63
|
CREATE KEYSPACE #{connection_configuration[:keyspace]}
|
45
64
|
WITH replication = {
|
46
65
|
'class': 'SimpleStrategy',
|
47
66
|
'replication_factor': 1
|
48
67
|
}
|
49
|
-
|
68
|
+
KS_DEF
|
50
69
|
|
51
70
|
conn.execute(ks_def)
|
52
71
|
end
|
@@ -3,16 +3,13 @@ module Believer
|
|
3
3
|
module Environment
|
4
4
|
class RailsEnv < Believer::Environment::BaseEnv
|
5
5
|
|
6
|
-
def
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
@connection_configuration[:logger] = Rails.logger
|
14
|
-
end
|
15
|
-
@connection_configuration
|
6
|
+
def load_configuration
|
7
|
+
config_file = Rails.root + "config/believer.yml"
|
8
|
+
config = YAML::load(File.open(config_file.to_s))
|
9
|
+
env_config = config[Rails.env]
|
10
|
+
env_config = {}.merge(env_config).symbolize_keys
|
11
|
+
env_config[:logger] = Rails.logger
|
12
|
+
env_config
|
16
13
|
end
|
17
14
|
end
|
18
15
|
end
|
data/lib/believer/version.rb
CHANGED
@@ -51,8 +51,9 @@ module Test
|
|
51
51
|
@env ||= Environment.new
|
52
52
|
end
|
53
53
|
|
54
|
+
Believer::Base.environment = test_environment
|
54
55
|
CLASSES = [Processor, Computer, Event, Person]
|
55
|
-
CLASSES.each {|cl| cl.environment = test_environment}
|
56
|
+
#CLASSES.each {|cl| cl.environment = test_environment}
|
56
57
|
|
57
58
|
def self.classes
|
58
59
|
CLASSES
|