summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormguetlein <martin.guetlein@gmail.com>2011-05-09 14:06:48 +0200
committermguetlein <martin.guetlein@gmail.com>2011-05-09 14:06:48 +0200
commite09012e01aa865900184bee186933b11f6fa1d3f (patch)
treeed0fcc50302f127492092d3bd795904828e8d005
parent02220bab22c0ea60394b71dfba536284ada17eb8 (diff)
fix search via param functionality for validation, add corresponding unit-tests
-rw-r--r--lib/ohm_util.rb39
-rwxr-xr-xreport/environment.rb3
-rwxr-xr-xreport/report_persistance.rb13
-rw-r--r--test/unit_test.rb58
-rwxr-xr-xvalidation/validation_application.rb14
5 files changed, 97 insertions, 30 deletions
diff --git a/lib/ohm_util.rb b/lib/ohm_util.rb
new file mode 100644
index 0000000..21d7978
--- /dev/null
+++ b/lib/ohm_util.rb
@@ -0,0 +1,39 @@
+
+module Lib
+ module OhmUtil
+
+ def self.check_params(model, params)
+ prop_names = model.attributes.collect{|p| p.to_s}
+ params.keys.each do |k|
+ key = k.to_s
+ if (key == "subjectid")
+ params.delete(k)
+ else
+ unless prop_names.include?(key)
+ key = key.from_rdf_format
+ unless prop_names.include?(key)
+ key = key+"_uri"
+ unless prop_names.include?(key)
+ key = key+"s"
+ unless prop_names.include?(key)
+ raise OpenTox::BadRequestError.new "no attribute found: '"+k.to_s+"'"
+ end
+ end
+ end
+ end
+ params[key.to_sym] = params.delete(k)
+ end
+ end
+ params
+ end
+
+ def self.find(model, filter_params)
+ if (filter_params.size==0)
+ model.all
+ else
+ model.find(check_params(model,filter_params))
+ end
+ end
+
+ end
+end \ No newline at end of file
diff --git a/report/environment.rb b/report/environment.rb
index aa8ab56..4729dc8 100755
--- a/report/environment.rb
+++ b/report/environment.rb
@@ -12,8 +12,7 @@ module Reports
end
require "lib/ot_predictions.rb"
-#require "lib/active_record_setup.rb"
-#require "lib/data_mapper_util.rb"
+require "lib/ohm_util.rb"
require "report/plot_factory.rb"
require "report/xml_report.rb"
diff --git a/report/report_persistance.rb b/report/report_persistance.rb
index 9097fa3..113c81b 100755
--- a/report/report_persistance.rb
+++ b/report/report_persistance.rb
@@ -198,6 +198,8 @@ module Reports
attribute :algorithm_uris
index :report_type
+ index :validation_uris
+ index :crossvalidation_uris
attr_accessor :subjectid
@@ -250,16 +252,7 @@ module Reports
def list_reports(type, filter_params={})
LOGGER.debug "find reports for params: "+filter_params.inspect
- # unfortunately, datamapper does not allow searching in Objects
- # do filtering for list = Object params manually
- list_params = {}
- [:validation_uris, :crossvalidation_uris, :algorithm_uris, :model_uris].each do |l|
- list_params[l] = filter_params.delete(l) if filter_params.has_key?(l)
- end
- reports = ReportData.find( :report_type => type )
- list_params.each do |k,v|
- reports = reports.collect{|x| x}.delete_if{ |r| !r.send(k).include?(v) }
- end
+ reports = Lib::OhmUtil.find( ReportData, filter_params )
reports.collect{ |r| r.id }
end
diff --git a/test/unit_test.rb b/test/unit_test.rb
index 2462984..5984f42 100644
--- a/test/unit_test.rb
+++ b/test/unit_test.rb
@@ -44,38 +44,55 @@ class ValidationTest < Test::Unit::TestCase
puts "AA disabled"
@@subjectid = nil
end
-
+
+ @@data = []
files = { File.new("data/hamster_carcinogenicity.mini.csv") => :crossvalidation,
File.new("data/EPAFHM.mini.csv") => :crossvalidation,
File.new("data/hamster_carcinogenicity.csv") => :validation,
File.new("data/EPAFHM.csv") => :validation,
# File.new("data/StJudes-HepG2-testset_Class.csv") => :crossvalidation
}
- @@data = []
files.each do |file,type|
@@data << { :type => type,
:data => ValidationExamples::Util.upload_dataset(file, @@subjectid),
:feat => ValidationExamples::Util.prediction_feature_for_file(file),
- :file => file}
+ :info => file.path, :delete => true}
end
+# @@data << { :type => :crossvalidation,
+# :data => "http://apps.ideaconsult.net:8080/ambit2/dataset/9?max=50",
+# :feat => "http://apps.ideaconsult.net:8080/ambit2/feature/21573",
+# :info => "http://apps.ideaconsult.net:8080/ambit2/dataset/9?max=50" }
+# @@data << { :type => :validation,
+# :data => "http://apps.ideaconsult.net:8080/ambit2/dataset/272?max=50",
+# :feat => "http://apps.ideaconsult.net:8080/ambit2/feature/26221",
+# :info => "http://apps.ideaconsult.net:8080/ambit2/dataset/272?max=50" }
end
def global_teardown
puts "delete and logout"
- @@data.each{|data| OpenTox::Dataset.find(data[:data],@@subjectid).delete(@@subjectid)}
+ @@data.each{|data| OpenTox::Dataset.find(data[:data],@@subjectid).delete(@@subjectid) if data[:delete]}
@@vs.each{|v| v.delete(@@subjectid)} if defined?@@vs
@@cvs.each{|cv| cv.delete(@@subjectid)} if defined?@@cvs
@@reports.each{|report| report.delete(@@subjectid)} if defined?@@reports
@@qmrfReports.each{|qmrfReport| qmrfReport.delete(@@subjectid)} if defined?@@qmrfReports
OpenTox::Authorization.logout(@@subjectid) if AA_SERVER
end
+
+ def test_validation_list
+ puts "test_validation_list"
+ list = OpenTox::Validation.list
+ assert list.is_a?(Array)
+ list.each do |l|
+ assert l.uri?
+ end
+ end
def test_training_test_split
@@vs = []
@@data.each do |data|
if data[:type]==:validation
- puts "test_training_test_split "+data[:file].path.to_s
+ puts "test_training_test_split "+data[:info].to_s
p = {
:dataset_uri => data[:data],
:algorithm_uri => File.join(CONFIG[:services]["opentox-algorithm"],"lazar"),
@@ -100,6 +117,11 @@ class ValidationTest < Test::Unit::TestCase
end
v = OpenTox::Validation.find(v.uri, @@subjectid)
assert v.uri.uri?
+
+ model = v.metadata[OT.model]
+ assert model.uri?
+ v_list = OpenTox::Validation.list( {:model => model} )
+ assert v_list.size==1 and v_list.include?(v.uri)
@@vs << v
end
end
@@ -118,6 +140,8 @@ class ValidationTest < Test::Unit::TestCase
OpenTox::CrossvalidationReport.create(v.uri)
end
end
+ report = OpenTox::ValidationReport.find_for_validation(v.uri,@@subjectid)
+ assert report==nil,"report already exists for validation\nreport: "+(report ? report.uri.to_s : "")+"\nvalidation: "+v.uri.to_s
report = OpenTox::ValidationReport.create(v.uri,@@subjectid)
assert report.uri.uri?
if @@subjectid
@@ -134,7 +158,16 @@ class ValidationTest < Test::Unit::TestCase
@@reports << report2
end
end
-
+
+ def test_crossvalidation_list
+ puts "test_crossvalidation_list"
+ list = OpenTox::Crossvalidation.list
+ assert list.is_a?(Array)
+ list.each do |l|
+ assert l.uri?
+ end
+ end
+
def test_crossvalidation
#assert_rest_call_error OpenTox::NotFoundError do
@@ -143,7 +176,7 @@ class ValidationTest < Test::Unit::TestCase
@@cvs = []
@@data.each do |data|
if data[:type]==:crossvalidation
- puts "test_crossvalidation "+data[:file].path.to_s
+ puts "test_crossvalidation "+data[:info].to_s
p = {
:dataset_uri => data[:data],
:algorithm_uri => File.join(CONFIG[:services]["opentox-algorithm"],"lazar"),
@@ -174,6 +207,16 @@ class ValidationTest < Test::Unit::TestCase
end
summary = cv.summary(@@subjectid)
assert_kind_of Hash,summary
+
+ algorithm = cv.metadata[OT.algorithm]
+ assert algorithm.uri?
+ cv_list = OpenTox::Crossvalidation.list( {:algorithm => algorithm} )
+ assert cv_list.include?(cv.uri)
+ cv_list.each do |cv_uri|
+ alg = OpenTox::Crossvalidation.find(cv_uri).metadata[OT.algorithm]
+ assert alg==algorithm,"wrong algorithm for filtered crossvalidation, should be: '"+algorithm.to_s+"', is: '"+alg.to_s+"'"
+ end
+
@@cvs << cv
end
end
@@ -195,6 +238,7 @@ class ValidationTest < Test::Unit::TestCase
OpenTox::CrossvalidationReport.create(cv.uri)
end
end
+ assert OpenTox::ValidationReport.find_for_validation(cv.uri,@@subjectid)==nil
report = OpenTox::CrossvalidationReport.create(cv.uri,@@subjectid)
assert report.uri.uri?
if @@subjectid
diff --git a/validation/validation_application.rb b/validation/validation_application.rb
index 4ef05a9..2bd2fea 100755
--- a/validation/validation_application.rb
+++ b/validation/validation_application.rb
@@ -9,11 +9,7 @@ require 'validation/validation_service.rb'
get '/crossvalidation/?' do
LOGGER.info "list all crossvalidations"
- #uri_list = Validation::Crossvalidation.all.collect{ |cv| cv.crossvalidation_uri }.join("\n")+"\n"
- #uri_list = Lib::DataMapperUtil.all(Validation::Crossvalidation,params).collect{ |cv| cv.crossvalidation_uri }.join("\n")+"\n"
- uri_list = Validation::Crossvalidation.all.collect{|cv| cv.crossvalidation_uri}.join("\n") + "\n"
-
- #uri_list = Validation::Crossvalidation.find_like(params).collect{ |cv| cv.crossvalidation_uri }.join("\n")+"\n"
+ uri_list = Lib::OhmUtil.find( Validation::Crossvalidation, params ).collect{|v| v.crossvalidation_uri}.join("\n") + "\n"
if request.env['HTTP_ACCEPT'] =~ /text\/html/
related_links =
"Single validations: "+url_for("/",:full)+"\n"+
@@ -134,7 +130,7 @@ get '/crossvalidation/:id/statistics' do
# LOGGER.debug vals.collect{|v| v.validation_uri}.join("\n")
# LOGGER.debug vals.size
# LOGGER.debug vals.class
-
+ raise "could not load all validations for crossvalidation" if vals.include?(nil)
v = Lib::MergeObjects.merge_array_objects( vals )
v.created_at = nil
#v.id = nil
@@ -213,11 +209,7 @@ end
get '/?' do
LOGGER.info "list all validations, params: "+params.inspect
- #uri_list = Validation::Validation.find_like(params).collect{ |v| v.validation_uri }.join("\n")+"\n"
- #uri_list = Validation::Validation.all(params).collect{ |v| v.validation_uri }.join("\n")+"\n"
- #uri_list = Lib::DataMapperUtil.all(Validation::Validation,params).collect{ |v| v.validation_uri }.join("\n")+"\n"
- uri_list = Validation::Validation.all.collect{|v| v.validation_uri}.join("\n") + "\n"
-
+ uri_list = Lib::OhmUtil.find( Validation::Validation, params ).collect{|v| v.validation_uri}.join("\n") + "\n"
if request.env['HTTP_ACCEPT'] =~ /text\/html/
related_links =
"To perform a validation:\n"+