summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Helma <helma@in-silico.de>2009-08-27 12:52:08 +0200
committerChristoph Helma <helma@in-silico.de>2009-08-27 12:52:08 +0200
commit1c8d5c73c0e322f4594c365014990bf5f003e00a (patch)
tree85d377db68be8969bab07d97b2e9e749a9523b05
parent61646780607e3e43a581053038bb169efedd3e3d (diff)
improved redis data store
-rw-r--r--application.rb89
-rw-r--r--test/test.rb26
2 files changed, 65 insertions, 50 deletions
diff --git a/application.rb b/application.rb
index 2742218..26bb3c3 100644
--- a/application.rb
+++ b/application.rb
@@ -17,36 +17,35 @@ set :default_content, :yaml
helpers do
- def not_found?
- halt 404, "Dataset \"#{params[:name]}\" not found." unless @@redis.set_member? "datasets", sanitize_key(params[:name])
- end
-
- def sanitize_key(k)
- k.gsub(/\s|\n/,'_')
+ def create_dataset(uri)
+ @@redis.set_add "datasets", uri
end
- def name(uri)
- URI.decode File.basename(uri)
+ def add_feature(dataset_uri, compound_uri, feature_uri)
+ @@redis.set_add dataset_uri + '::compounds', compound_uri
+ @@redis.set_add dataset_uri + '::features', feature_uri
+ @@redis.set_add dataset_uri + '::' + compound_uri + '::features', feature_uri
+ @@redis.set_add dataset_uri + '::' + feature_uri + '::compounds', compound_uri
end
- def uri(name)
- uri = url_for("/", :full) + URI.escape(URI.unescape(name)) # avoid escaping escaped names
+ def delete_dataset(uri)
+ @@redis.set_members(uri + '::compounds').each do |compound_uri|
+ @@redis.delete uri + '::' + compound_uri
+ end
+ @@redis.delete uri + '::compounds'
+ @@redis.set_members(uri + '::features').each do |feature_uri|
+ @@redis.delete uri + '::' + feature_uri
+ end
+ @@redis.delete uri + '::features'
+ @@redis.set_delete "datasets", uri
end
- def add_feature(name, record)
- compound = record[0]
- feature = record[1]
- @@redis.set_add name + '::compounds', compound
- @@redis.set_add name + '::features', name + '::' + feature
- @@redis.set_add compound, name + '::' + feature
- @@redis.set_add feature, compound
+ def not_found?
+ halt 404, "Dataset \"#{params[:name]}\" not found." unless @@redis.set_member? "datasets", uri(params[:name])
end
- def delete_dataset(name)
- # stale features/compounds under compound and name::feature ??
- @@redis.delete name + '::compounds'
- @@redis.delete name + '::features'
- @@redis.set_delete "datasets", name
+ def uri(name)
+ uri = url_for("/", :full) + name.gsub(/\s|\n/,'_')
end
end
@@ -73,14 +72,15 @@ end
get '/:name/compounds' do
not_found?
- @@redis.set_members(URI.encode(params[:name]) + "::compounds").join("\n")
+ @@redis.set_members(uri(params[:name]) + "::compounds").join("\n")
end
get '/:name/features' do
not_found?
- @@redis.set_members(URI.encode(params[:name]) + "::features").join("\n")
+ @@redis.set_members(uri(params[:name]) + "::features").join("\n")
end
+=begin
get '/:name/:type/*/*/intersection' do
# CHECK/TEST
@@redis.set_intersect(params[:splat][0], params[:splat][1], URI.encode(params[:name]) + '/' + params[:type]).join("\n")
@@ -90,50 +90,53 @@ get '/:name/:type/*/*/union' do
# CHECK/TEST
@@redis.set_union(params[:splat][0], params[:splat][1], URI.encode(params[:name]) + '/' + params[:type]).join("\n")
end
+=end
get '/:name/*/features' do
- compound = URI.encode(params[:splat].first, /[^#{URI::PATTERN::UNRESERVED}]/)
- @@redis.set_intersect(params[:name] + '::features', compound ).join("\n")
- @@redis.set_intersect(params[:name] + '::features', compound ).join("\n")
+ not_found?
+ # re-escape smiles (Sinatra unescapes params and splats)
+ compound_uri = params[:splat].first.sub(%r{(http://[\w\.:]+/)(.*)$}) {|s| $1 + URI.escape($2, /[^#{URI::PATTERN::UNRESERVED}]/)}
+
+ #puts compound_uri
+ @@redis.set_members(uri(params[:name]) + '::' + compound_uri + '::features').join("\n")
end
get '/:name/*/compounds' do
- feature = params[:splat].first
- @@redis.set_intersect(feature, params[:name] + '::compounds').join("\n")
+ not_found?
+ @@redis.set_members(uri(params[:name]) + '::' + params[:splat].first + '::compounds').join("\n")
end
post '/?' do
#protected!
- name = sanitize_key params[:name]
- halt 403, "Dataset \"#{name}\" exists - please choose another name." if @@redis.set_member?("datasets", name)
+ uri = uri(params[:name])
+ halt 403, "Dataset \"#{name}\" exists - please choose another name." if @@redis.set_member?("datasets", uri)
- @@redis.set_add "datasets", name
+ @@redis.set_add "datasets", uri
if params[:file]
File.open(params[:file][:tempfile].path).each_line do |line|
record = line.chomp.split(/,\s*/)
- add_feature(name, record)
+ compound_uri = OpenTox::Compound.new(:smiles => record[0]).uri
+ feature_uri = OpenTox::Feature.new(:name => params[:name], :values => {:classification => record[1]}).uri
+ add_feature(uri, compound_uri, feature_uri)
end
end
- uri name
+ uri
end
put '/:name/?' do
#protected!
- pass if params[:finished]
not_found?
- name = sanitize_key params[:name]
- compound = params[:compound]
- feature = sanitize_key params[:feature]
- add_feature(name, [compound,feature])
- name + " sucessfully updated."
+ uri = uri(params[:name])
+ add_feature(uri, params[:compound_uri],params[:feature_uri])
+ uri + " sucessfully updated."
end
delete '/:name/?' do
# dangerous, because other datasets might refer to it
#protected!
not_found?
- name = sanitize_key params[:name]
- delete_dataset(name)
- "Successfully deleted dataset \"#{name}\"."
+ uri = uri(params[:name])
+ delete_dataset(uri)
+ "Successfully deleted dataset \"#{uri}\"."
end
diff --git a/test/test.rb b/test/test.rb
index dacc9d5..5c4b2e7 100644
--- a/test/test.rb
+++ b/test/test.rb
@@ -31,27 +31,29 @@ class DatasetsTest < Test::Unit::TestCase
end
def test_create_dataset_and_insert_data
- usmiles = OpenTox::Compound.new(:smiles => '[O-][N+](=O)C/C=C\C(=O)Cc1cc(C#N)ccc1').uid
- puts usmiles
name = "Test dataset"
+ smiles = '[O-][N+](=O)C/C=C\C(=O)Cc1cc(C#N)ccc1'
+ compound_uri = OpenTox::Compound.new(:smiles => smiles).uri
+ feature_uri = OpenTox::Feature.new(:name => name, :values => {:classification => "true"}).uri
post '/', :name => name
assert last_response.ok?
uri = last_response.body.chomp
get uri
assert last_response.ok?
assert last_response.body.include?("Test_dataset")
- put uri, :compound => usmiles, :feature => "true"
+ put uri, :compound_uri => compound_uri, :feature_uri => feature_uri
assert last_response.ok?
get uri + '/compounds'
assert last_response.ok?
- assert last_response.body.include?(usmiles)
+ assert_equal compound_uri, last_response.body
get uri + '/features'
assert last_response.ok?
assert last_response.body.include?("true")
- get uri + '/' + usmiles + '/features'
- puts last_response.body
+ assert_equal feature_uri, last_response.body
+ get uri + '/' + compound_uri + '/features'
assert last_response.ok?
assert last_response.body.include?("true")
+ assert_equal feature_uri, last_response.body
delete uri
assert last_response.ok?
get "/Test_dataset"
@@ -59,14 +61,25 @@ class DatasetsTest < Test::Unit::TestCase
end
def test_create_dataset_from_csv
+ smiles = 'CC(=O)Nc1scc(n1)c1ccc(o1)[N+](=O)[O-]'
+ compound_uri = OpenTox::Compound.new(:smiles => smiles).uri
post '/', :name => "Hamster Carcinogenicity", :file => Rack::Test::UploadedFile.new(File.join(File.dirname(__FILE__), "hamster_carcinogenicity.csv"))
uri = last_response.body
get uri
assert last_response.ok?
get uri + '/compounds'
assert last_response.ok?
+ assert last_response.body.include?(compound_uri)
+ get uri + '/' + compound_uri + '/features'
+ assert last_response.ok?
+ assert last_response.body.include?("Hamster%20Carcinogenicity/classification/true")
+ delete uri
+ assert last_response.ok?
+ get uri
+ assert !last_response.ok?
end
+=begin
def test_create_large_dataset_from_csv
post '/', :name => "Salmonella Mutagenicity", :file => Rack::Test::UploadedFile.new(File.join(File.dirname(__FILE__), "kazius.csv"))
uri = last_response.body
@@ -74,7 +87,6 @@ class DatasetsTest < Test::Unit::TestCase
assert last_response.ok?
end
-=begin
def test_unauthorized_create
post '/', :name => "Test dataset"
assert !last_response.ok?