Intro to Cassandra and CassandraObject
-
Upload
nzkoz -
Category
Technology
-
view
5.465 -
download
1
description
Transcript of Intro to Cassandra and CassandraObject
![Page 2: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/2.jpg)
Intro to Me
![Page 3: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/3.jpg)
![Page 4: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/4.jpg)
![Page 5: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/5.jpg)
![Page 6: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/6.jpg)
![Page 7: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/7.jpg)
I Don’t Have To Scale
![Page 8: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/8.jpg)
Intro to Cassandra
![Page 9: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/9.jpg)
![Page 10: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/10.jpg)
Distributed
![Page 11: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/11.jpg)
Fault Tolerant
![Page 12: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/12.jpg)
Elastic
![Page 13: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/13.jpg)
The Ring
C
A
B
D
E
F
![Page 14: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/14.jpg)
The Ring
C
A
B
D
E
F
![Page 15: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/15.jpg)
The Ring
C
A
B
D
E
F
![Page 16: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/16.jpg)
The Ring
C
A
B
D
E
F
![Page 17: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/17.jpg)
The Ring
C
A
B
D
E
F
![Page 18: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/18.jpg)
The Ring
C
A
B
D
E
F
![Page 19: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/19.jpg)
The Ring
C
A
B
D
E
F
![Page 20: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/20.jpg)
The Ring
C
A
B
D
E
F
someKey
RandomPartitioner OrderPreservingPartitionerMD5(key) key
![Page 21: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/21.jpg)
Replication Factor
RF = 2
C
A
B
D
E
F
someKey
![Page 22: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/22.jpg)
Replication Factor
C
A
B
D
E
F
someKey
RF = 3
![Page 23: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/23.jpg)
Consistency Level
C
A
B
D
E
F
GET 'someKey'
ConsistencyLevel.ONE
![Page 24: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/24.jpg)
Consistency Level
C
A
B
D
E
F
GET 'someKey'
ConsistencyLevel.ONE
![Page 25: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/25.jpg)
Consistency Level
C
A
B
D
E
F
GET 'someKey'
ConsistencyLevel.ONE
![Page 26: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/26.jpg)
Consistency Level
C
A
B
D
E
F
GET 'someKey'
ConsistencyLevel.ONE
![Page 27: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/27.jpg)
Consistency Level
C
A
B
D
E
F
GET 'someKey'
ConsistencyLevel.QUORUM
![Page 28: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/28.jpg)
Consistency Level
C
A
B
D
E
F
GET 'someKey'
ConsistencyLevel.QUORUM
![Page 29: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/29.jpg)
Consistency Level
C
A
B
D
E
F
GET 'someKey'
ConsistencyLevel.QUORUM
![Page 30: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/30.jpg)
Consistency Level
C
A
B
D
E
F
GET 'someKey'
ConsistencyLevel.ALL
![Page 31: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/31.jpg)
Consistency Level
C
A
B
D
E
F
GET 'someKey'
ConsistencyLevel.ALL
![Page 32: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/32.jpg)
Consistency Level
C
A
B
D
E
F
GET 'someKey'
ConsistencyLevel.ALL
![Page 33: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/33.jpg)
Consistency Level
C
A
B
D
E
F
GET 'someKey'
ConsistencyLevel.ALL
![Page 34: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/34.jpg)
Fault Tolerance
C
A
DEAD
D
E
F
GET 'someKey'
ConsistencyLevel.QUORUM
![Page 35: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/35.jpg)
Fault Tolerance
C
A
DEAD
D
E
F
GET 'someKey'
ConsistencyLevel.QUORUM
![Page 36: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/36.jpg)
Fault Tolerance
C
A
D
E
F
GET 'someKey'
![Page 37: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/37.jpg)
Elastic
C
A
B
D
E
F
NEW
![Page 38: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/38.jpg)
Elastic
C
A
B
D
E
F
NEW
![Page 39: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/39.jpg)
Data Model
![Page 40: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/40.jpg)
Key Value Store
someKey Some Value
![Page 41: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/41.jpg)
Column Store
![Page 42: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/42.jpg)
Column
![Page 43: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/43.jpg)
Column
firstName Michael
![Page 44: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/44.jpg)
Row (Column Family)
firstName Michael
lastName KoziarskisomeKey
![Page 45: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/45.jpg)
Row (Super Column Family)
firstName Michael
lastName KoziarskisomeSubColumn
firstName Kate
lastName KoziarskiotherSubColumn
someKey
![Page 46: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/46.jpg)
JSON
![Page 47: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/47.jpg)
Column
{ 'name': 'first_name', 'value': 'Michael', 'timestamp': 1276040575}
![Page 48: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/48.jpg)
Column
{ 'first_name': "Michael"}
![Page 49: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/49.jpg)
Users["koz"] = { 'first_name': 'Michael', 'last_name': 'Koziarski'}
Column Family
![Page 50: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/50.jpg)
Users["koz"] = { 'first_name': 'Michael', 'last_name': 'Koziarski'}
Column Family
![Page 51: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/51.jpg)
Users["koz"] = { 'first_name': 'Michael', 'last_name': 'Koziarski'}
Column Family
![Page 52: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/52.jpg)
Users["koz"] = { 'first_name': 'Michael', 'last_name': 'Koziarski'}
Column Family
![Page 53: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/53.jpg)
UserAddresses["koz"] = { "home" : { "suburb": "Berhampore" "city": "Wellington", "country": "New Zealand" }, "office" : { "suburb": "CBD" "city": "Wellington", "country": "New Zealand" }}
Super Column Family
![Page 54: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/54.jpg)
Don’t let the name fool you
![Page 55: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/55.jpg)
One to Many
Timeline["nzkoz"] = { uuid_one: "http://twitter.com/chadfowler/status/15740739666", uuid_two: "http://twitter.com/dhh/status/15740689762", uuid_three: "http://twitter.com/glv/status/15740546908"}
<ColumnFamily CompareWith="TimeUUIDType" Name="Timeline"/>
![Page 56: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/56.jpg)
Modeling
![Page 57: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/57.jpg)
Schema Driven Modeling
![Page 58: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/58.jpg)
Start with your Data
![Page 59: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/59.jpg)
Model
firstNamelastNamedateOfBirth
User
![Page 60: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/60.jpg)
Figure out the Queries
![Page 61: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/61.jpg)
Query
SELECT firstName, lastName FROM `users`WHERE dateOfBirth < '1992-‐06-‐09'
![Page 62: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/62.jpg)
Query
SELECT dateOfBirthFROM `users`WHERE firstName = 'Michael' AND lastName = 'Koziarski'
![Page 63: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/63.jpg)
Query
SELECT firstName, lastName FROM `users`WHERE YEAR(dateOfBirth) = 1980
![Page 64: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/64.jpg)
Query
SELECT COUNT(DISTINCT firstName)FROM `users`WHERE dateOfBirth < '1992-‐06-‐09'
![Page 65: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/65.jpg)
Cassandra Limitations
![Page 66: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/66.jpg)
No WHERE
![Page 67: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/67.jpg)
No WHERE
Kinda
![Page 68: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/68.jpg)
No ORDER
![Page 69: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/69.jpg)
No ORDER
Kinda
![Page 70: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/70.jpg)
No COUNT
![Page 71: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/71.jpg)
No COUNTKinda
![Page 72: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/72.jpg)
No SUM
![Page 73: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/73.jpg)
Query DrivenModeling
![Page 74: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/74.jpg)
Start with the Queries
![Page 75: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/75.jpg)
Populate a data model which enables them
![Page 76: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/76.jpg)
Modeling Example
![Page 77: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/77.jpg)
Users
Users["koz"] = { 'first_name': "Michael", 'last_name': "Koziarski"}
![Page 78: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/78.jpg)
Users
Users["koz"] = { 'first_name': "Michael", 'last_name': "Koziarski"}
connection.get(:Users, "koz")
![Page 79: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/79.jpg)
Koziarski Family
UsersByLastName["koziarski"] = { uuid_one: "koz" uuid_two: "kate"}
![Page 80: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/80.jpg)
Koziarski Family
UsersByLastName["koziarski"] = { uuid_one: "koz" uuid_two: "kate"}
connection.get(:UsersByLastName, "koziarski").values.map do |key| connection.get(:Users, key)end
![Page 81: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/81.jpg)
Share my BirthdayUsersByDOB["1980-‐08-‐15"] = { uuid_one: "koz"}
![Page 82: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/82.jpg)
Share my BirthdayUsersByDOB["1980-‐08-‐15"] = { uuid_one: "koz"}
connection.get(:UsersByDOB, "1980-‐08-‐15")
![Page 83: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/83.jpg)
Users Born in 1980UsersByDOB["1980-‐08-‐15"] = { uuid_one: "koz"}
![Page 84: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/84.jpg)
Users Born in 1980UsersByDOB["1980-‐08-‐15"] = { uuid_one: "koz"}
connection.get_range(:UsersByDOB, :start=>"1980", :finish=>"1981")
![Page 85: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/85.jpg)
Users Born in 1980UsersByDOB["1980-‐08-‐15"] = { uuid_one: "koz"}
connection.get_range(:UsersByDOB, :start=>"1980", :finish=>"1981")
Only with OrderPreservingPartitioner
![Page 86: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/86.jpg)
A Column Family per Query
![Page 87: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/87.jpg)
Do you really need Cassandra?
![Page 88: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/88.jpg)
CassandraObject
![Page 89: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/89.jpg)
class Customer < CassandraObject::Base attribute :first_name, :type => :string attribute :last_name, :type => :string attribute :date_of_birth, :type => :date attribute :signed_up_at, :type => :time_with_zone
validate :should_be_cool
key :uuid
index :date_of_birth
association :invoices, :unique=>false, :inverse_of=>:customer
private
def should_be_cool unless ["Michael", "Anika", "Evan", "James"].include?(first_name) errors.add(:first_name, "must be that of a cool person") end endend
![Page 90: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/90.jpg)
Motivations
![Page 91: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/91.jpg)
Prove ActiveModel
![Page 92: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/92.jpg)
Learn Cassandra
![Page 93: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/93.jpg)
Have a fun Side Project
![Page 94: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/94.jpg)
Solve my Scaling Problems
![Page 95: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/95.jpg)
Solve my Scaling Problems
![Page 96: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/96.jpg)
Mostly AR Compatible
![Page 97: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/97.jpg)
Not Compatible
def index @people = @customer.people.order(params[:order]). limit(params[:limit]). where(...)end
![Page 98: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/98.jpg)
Compatible
def create @person = Customer.new params[:customer] if @person.save redirect_to @person else render :action=>'new' endend
![Page 99: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/99.jpg)
Compatible
<%= form_for(@customer) do |customer| %> <%= customer.error_messages %> <%= customer.text_field :first_name %> <%= customer.submit "Save" %><% end %>
![Page 100: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/100.jpg)
Walkthrough
![Page 101: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/101.jpg)
class Customer < CassandraObject::Base attribute :first_name, :type => :string attribute :last_name, :type => :string attribute :date_of_birth, :type => :date attribute :signed_up_at, :type => :time_with_zone
validate :should_be_cool
key :uuid
index :date_of_birth
association :invoices, :unique=>false, :inverse_of=>:customer
private
def should_be_cool unless ["Michael", "Anika", "Evan", "James"].include?(first_name) errors.add(:first_name, "must be that of a cool person") end endend
![Page 102: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/102.jpg)
class Invoice < CassandraObject::Base attribute :number, :type=>:integer attribute :total, :type=>:float attribute :gst_number, :type=>:string
# indexes can have a single entry also. index :number, :unique=>true
# bi-‐directional associations with read-‐repair support. association :customer, :unique=>true, :inverse_of=>:invoices
# Read migration support migrate 1 do |attrs| attrs["total"] ||= rand(2000) / 100.0 end
migrate 2 do |attrs| attrs["gst_number"] = "66-‐666-‐666" end
key :natural, :attributes => :numberend
![Page 103: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/103.jpg)
Attributes
attribute :first_name, :type => :stringattribute :last_name, :type => :stringattribute :date_of_birth, :type => :dateattribute :signed_up_at, :type => :time_with_zoneattribute :number, :type => :integerattribute :total, :type => :floatattribute :gst_number, :type => :string
![Page 104: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/104.jpg)
Attributes
@customer.first_name = "Michael"@customer.attributes= {:first_name=>"Michael"}
attribute :first_name, :type => :string
![Page 105: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/105.jpg)
Validationsvalidate :should_be_cool
def should_be_cool unless ["Michael", "Anika", "Evan", "James"].include?(first_name) errors.add(:first_name, "must be that of a cool person") endend
![Page 106: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/106.jpg)
Validationsvalidate :should_be_cool
def should_be_cool unless ["Michael", "Anika", "Evan", "James"].include?(first_name) errors.add(:first_name, "must be that of a cool person") endend
@customer.first_name = "Marcel"@customer.valid? # => false
![Page 107: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/107.jpg)
Validations
validates_confirmation_of :tosvalidates_format_of :gst_number, :with=> /.../validates_length_of :first_name, :max=>123
![Page 108: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/108.jpg)
Keys
![Page 109: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/109.jpg)
Key Selection Matters
![Page 110: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/110.jpg)
Key Selection Matters
UsersByDOB["1980-‐08-‐15"] = { uuid_one: "koz"}
connection.get_range(:UsersByDOB, :start=>"1980", :finish=>"1981")
![Page 111: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/111.jpg)
Keys
key :uuid
![Page 112: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/112.jpg)
Keys
key :uuid
"bf1ba5da-‐735a-‐11df-‐8b47-‐377649cf993b"
![Page 113: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/113.jpg)
Keys
key :natural, :attributes => :number
![Page 114: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/114.jpg)
Custom Key Factories
key RedisKeyFactory.new(REDIS_CONNECTION, "customer_key")
![Page 115: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/115.jpg)
Custom Key Factoriesclass RedisKeyFactory def initialize(connection, key) @connection, @key = connection, key end def next_key(object) @connection.incr(@key) end # Parse should create a new key object from the 'to_param' format def parse(string) string.to_i end # create should create a new key object from the cassandra format. def create(string) string.to_i end end
![Page 116: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/116.jpg)
Migrations
![Page 117: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/117.jpg)
Migrationsclass AddLicenseNameToArticle < ActiveRecord::Migration def self.up add_column :articles, :license_name, :string, :default=>"Exclusive"
execute "UPDATE articles SET license_name = 'Exclusive' WHERE price_first IS NOT NULL" execute "UPDATE articles SET license_name = 'Syndicated' WHERE price_first IS NULL" end
def self.down remove_column :articles, :license_name endend
![Page 118: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/118.jpg)
Migrations
{ 'price_first': 45, 'schema_version': 0}
![Page 119: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/119.jpg)
Migrationsclass Article < CassandraObject::Base attribute :price_first, :type=>:float attribute :license_name, :type=>:string
migrate 1 do |attrs| if attrs[:price_first] attrs[:license_name] = "Exclusive" else attrs[:license_name] = "Syndicated" end endend
![Page 120: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/120.jpg)
Migrationsclass Article < CassandraObject::Base attribute :price_first, :type=>:float attribute :license_name, :type=>:string
migrate 1 do |attrs| if attrs[:price_first] attrs[:license_name] = "Exclusive" else attrs[:license_name] = "Syndicated" end endend
@article = Article.get("some-‐old-‐story")@article.license_name # => "Exclusive"
![Page 121: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/121.jpg)
Migrations
{ 'price_first': 45, 'schema_version': 1, 'license_name': 'Exclusive'}
![Page 122: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/122.jpg)
Indexes
![Page 123: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/123.jpg)
Indexesclass Article < CassandraObject::Base attribute :slug, :type=>:string key :uuid index :slug, :unique=>trueend
connection.insert(:ArticlesBySlug, @article.slug, {UUID.new => @article.key})
![Page 124: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/124.jpg)
Indexesclass Article < CassandraObject::Base attribute :slug, :type=>:string key :uuid index :slug, :unique=>trueend
@article = Article.find_by_slug("some-‐slug")
connection.insert(:ArticlesBySlug, @article.slug, {UUID.new => @article.key})
![Page 125: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/125.jpg)
Indexes
class Article < CassandraObject::Base attribute :publication_date, :type=>:date key :uuid index :publication_date, :unique=>falseend
connection.insert(:ArticlesByPublicationDate, @article.publication_date,
{UUID.new => @article.key})
![Page 126: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/126.jpg)
Indexes
class Article < CassandraObject::Base attribute :publication_date, :type=>:date key :uuid index :publication_date, :unique=>falseend
connection.insert(:ArticlesByPublicationDate, @article.publication_date,
{UUID.new => @article.key})
@article = Article.find_all_by_publication_date(Date.today -‐ 1)
![Page 127: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/127.jpg)
Indexes
class Article < CassandraObject::Base attribute :publication_date, :type=>:date key :uuid index :publication_date, :unique=>falseend
connection.insert(:ArticlesByPublicationDate, @article.publication_date,
{UUID.new => @article.key})
@article = Article.find_all_by_publication_date(Date.today -‐ 1)
![Page 128: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/128.jpg)
Read-Repairresults = []connection.get(:ArticlesByPublicationDate, date).each do |(uuid, key)| article = Article.get(uuid) if article.publication_date != date connection.delete(:ArticlesByPublicationDate, date, uuid) else results << article endendresults
![Page 129: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/129.jpg)
Associations
![Page 130: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/130.jpg)
Associationsclass Invoice < CassandraObject::Base association :customer, :unique=>true, :inverse_of=>:invoicesend
class Customer < CassandraObject::Base association :invoices, :unique=>false, :inverse_of=>:customerend
@customer.invoices.create! params[:invoice]
@invoice.customer
![Page 131: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/131.jpg)
Project Status
![Page 132: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/132.jpg)
Very Beta
![Page 133: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/133.jpg)
In Flux
![Page 134: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/134.jpg)
Taking Patches
![Page 135: Intro to Cassandra and CassandraObject](https://reader036.fdocuments.net/reader036/viewer/2022062615/5481d0ea5906b50a058b45c3/html5/thumbnails/135.jpg)
Thanks!Michael Koziarski
http://github.com/NZKoz/cassandra_objecthttp://cassandra.apache.org/