Skip to content

Instantly share code, notes, and snippets.

@therealadam
Created January 24, 2011 01:12
Show Gist options
  • Save therealadam/792648 to your computer and use it in GitHub Desktop.
Save therealadam/792648 to your computer and use it in GitHub Desktop.
Cassandredis, a possibly ill-advised hack
# cassandredis.rb - It makes your Cassandra look like a Redis.
require "cassandra/0.7"
class Cassandredis
# Connect to a keyspace and column family.
def initialize(keyspace, cf)
@client = Cassandra.new(keyspace)
@cf = cf
end
# Add a value to a set.
def sadd(key, member)
client.insert(cf, "set:#{key}", {member => ''})
end
# Count the values in a set.
def scard(key)
# This bonks due to a problem in cassandra/0.7 ?
client.count_columns(cf, "set:#{key}")
end
# Determine if a given value is a member of a set
def sismember(key, member)
!client.exists?(cf, "set:#{key}", member).nil?
end
# Get all the members in a set
def smembers(key)
client.get(cf, "set:#{key}").keys
end
# Remove a member from a set
def srem(key, member)
client.remove(cf, "set:#{key}", member)
end
# Add multiple sets
def sunion(*keys)
client.
multi_get(cf, keys.map { |k| key_for(k) }).
inject([]) { |result, set|
result << set.last.keys
}.
flatten
end
protected
def client
@client
end
def cf
@cf
end
def key_for(k)
"set:#{k}"
end
end
gizmo = Cassandredis.new("Cassandredis", :Gizmo)
gizmo.sadd("beatles", "john")
gizmo.sadd("beatles", "paul")
gizmo.sadd("beatles", "george")
gizmo.sadd("beatles", "ringo")
# if gizmo.sismember("beatles", "john")
# puts "John is a Beatle."
# else
# puts "John is not a Beatle."
# end
# puts "Current Beatles: #{gizmo.smembers("beatles").inspect}"
#
# gizmo.srem("beatles", "john")
#
# puts "Current Beatles: #{gizmo.smembers("beatles").inspect}"
gizmo.sadd("stones", "mick")
gizmo.sadd("stones", "keif")
gizmo.sadd("stones", "ronnie")
gizmo.sadd("stones", "charlie")
p gizmo.sunion("beatles", "stones")
# puts "Beatles and Stones: #{gizmo.sunion("beatles", "stones").inspect}"
# p gizmo.scard("beatles")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment