diff --git a/Gemfile b/Gemfile index 70a42ed8baba2aec561d0532c7fd0f359793e343..1039b92c5f9861d60d2bc52222bf0b9db8c93f34 100644 --- a/Gemfile +++ b/Gemfile @@ -91,4 +91,8 @@ gem 'rack-mini-profiler' gem 'bullet' # docs -gem 'rdoc' \ No newline at end of file +gem 'rdoc' + +#JavaScript runtime +gem 'execjs' +gem 'therubyracer' \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index d45fc6d948b56a4b6fbeabe55ed88e300cbc2e80..3dbd0d2954efd3227c785199a2a06bfd44613b73 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -127,6 +127,7 @@ GEM railties (>= 3.1.0) turbolinks json (1.8.3) + libv8 (3.16.14.7) locastyle (0.0.1) loofah (2.0.3) nokogiri (>= 1.5.9) @@ -190,6 +191,7 @@ GEM parser (~> 2.2.0.pre.7) rainbow (>= 1.99, < 3.0) unparser (~> 0.2.2) + ref (1.0.5) responders (2.1.0) railties (>= 4.2.0, < 5) rest-client (1.8.0) @@ -235,6 +237,9 @@ GEM activesupport (>= 3.0) sprockets (>= 2.8, < 4.0) sqlite3 (1.3.10) + therubyracer (0.12.2) + libv8 (~> 3.16.14.0) + ref thor (0.19.1) thread_safe (0.3.5) tilt (2.0.1) @@ -285,6 +290,7 @@ DEPENDENCIES devise devise_token_auth dspace_rest_client (~> 1.1.0) + execjs gruff jbuilder (~> 2.0) jquery-rails @@ -308,6 +314,7 @@ DEPENDENCIES shoulda-callback-matchers (~> 1.1.1) spring sqlite3 + therubyracer turbolinks uglifier (>= 1.3.0) web-console (~> 2.0) diff --git a/app/models/learning_object.rb b/app/models/learning_object.rb index 7725479c52ebd507b815b4a6d22c47edf51b3fec..dc7102aeed95b1528c014d30bb4b3c0fd8088851 100644 --- a/app/models/learning_object.rb +++ b/app/models/learning_object.rb @@ -11,10 +11,15 @@ class LearningObject end def get_metadata_value_of key - values = @metadata.select { |v| v["key"] == key } - unless values.empty? - return values.first["value"] + get_metadata_values_of(key).first + end + + def get_metadata_values_of key + values = [] + @metadata.each do |m| + values << m["value"] if m["key"] == key end + values end private diff --git a/app/repositories/orient_db/base.rb b/app/repositories/orient_db/base.rb index b31c12f792f739ec3fae406ba229541d258fe6bd..684778a943b922aa255986ae43ab7b5b73c4aaeb 100644 --- a/app/repositories/orient_db/base.rb +++ b/app/repositories/orient_db/base.rb @@ -25,7 +25,7 @@ class OrientDb::Base end def all_after(after_id,limit=-1) - objects_hash = connection.query "SELECT FROM #{odb_class} WHERE @rid > #{bigger_than}", :limit => limit + objects_hash = connection.query "SELECT FROM #{odb_class} WHERE @rid > #{after_id}", :limit => limit objects = build_objects(objects_hash) || [] end @@ -34,7 +34,6 @@ class OrientDb::Base hash.each do |h| objects << build_object(h) end - objects end diff --git a/app/repositories/orient_db/learning_object_repository.rb b/app/repositories/orient_db/learning_object_repository.rb index e05078398b61f793b45d7e4b30beeddf517110d2..acfa39f7b7abfed834836963a7938b12feeed636 100644 --- a/app/repositories/orient_db/learning_object_repository.rb +++ b/app/repositories/orient_db/learning_object_repository.rb @@ -2,10 +2,6 @@ module OrientDb class LearningObjectRepository < Base include OrientDb::Methods::EdgeMethods - def odb_class - "LearningObject" - end - def increment_views(learning_object) #learning_object.views = learning_object.views + 1 #save learning_object @@ -29,20 +25,24 @@ module OrientDb def create(learning_object) hash = build_hash(learning_object) - learning_object.id = connection.create_document(hash) + result = connection.create_document(hash) + learning_object.id = result["@rid"] learning_object end - def get_subjects(id) - result = connection.query "SELECT expand(out('IsAbout')) FROM #{id}" + def get_subjects(learning_object) + result = connection.query "SELECT expand(out('IsAbout')) FROM #{learning_object.id}" Portalmec::Application.repository.for(:subject).build_objects(result) end def update_relations(learning_object) + edges = [] learning_object.subjects.each do |s| unless edge_exists?("IsAbout", learning_object.id, s.id) - create_edge("IsAbout", learning_object.id, s.id) + edges << create_edge("IsAbout", learning_object.id, s.id) + end end + edges end # Usage: @@ -86,26 +86,24 @@ module OrientDb end def build_object(args={}) - lo = LearningObject.new(:id => args["@rid"], - :id_dspace => args["id_dspace"], - :title => args["title"], - :metadata => args) - lo.likes = count_likes lo - lo.views = count_views lo + lo = nil + unless args.nil? + lo = LearningObject.new(:id => args["@rid"], + :id_dspace => args["id_dspace"], + :name => args["name"], + :metadata => args["metadata"]) + lo.likes = args.has_key?("in_Likes") ? args["in_Likes"].size : 0 + lo.views = args.has_key?("in_Views") ? args["in_Views"].size : 0 + end lo end - def build_objects(hash=[]) - learning_objects = [] - hash.each do |h| - learning_objects << build_object(h) - end + private - learning_objects + def odb_class + "LearningObject" end - private - def count_likes(learning_object) get_in_edges_count "Likes", learning_object.id end diff --git a/app/repositories/orient_db/subject_repository.rb b/app/repositories/orient_db/subject_repository.rb index ff78b360360cff92fee66eb65c806a640ba0352f..6e8e36afd9fb96fceaf15b81daea1dcc3be0a73c 100644 --- a/app/repositories/orient_db/subject_repository.rb +++ b/app/repositories/orient_db/subject_repository.rb @@ -3,30 +3,27 @@ module OrientDb def find_by_name(name) result = select_by_property(odb_class, "name", name) - result.first + build_object(result.first) end def create(subject) - subject.id = connection.create_document(build_hash(subject)) + result = connection.create_document(build_hash(subject)) + subject.id = result["@rid"] subject end def build_object(args={}) - subject = Subject.new(:id => args["@rid"]) - args.each do |var, val| - var_name = "@"+var - if subject.respond_to?(var) - subject.instance_variable_set(var_name, val) + subject = nil + unless args.nil? + subject = Subject.new(:id => args["@rid"]) + args.each do |var, val| + var_name = "@"+var + if subject.respond_to?(var) + subject.instance_variable_set(var_name, val) + end end end - end - - def build_objects(hash=[]) - subjects = [] - hash.each do |h| - subjects << build_subject(h) - end - subjects + subject end def build_hash(object) diff --git a/config/initializers/repositories/dspace.rb b/config/initializers/repositories/dspace.rb index 0324df5606b357ec124134e4f91a664d5ad27abb..48a75aab0f7308207fba630d98dd22130408b31c 100644 --- a/config/initializers/repositories/dspace.rb +++ b/config/initializers/repositories/dspace.rb @@ -1,10 +1,10 @@ require 'yaml' def set_dspace_config(host, port, rest, solr) - Dspace::Config.host = config['host'] - Dspace::Config.port = config['port'] - Dspace::Config.rest_webapp_name = env_config['rest_webapp_name'] - Dspace::Config.solr_webapp_name = env_config['solr_webapp_name'] + Dspace::Config.host = host + Dspace::Config.port = port + Dspace::Config.rest_webapp_name = rest + Dspace::Config.solr_webapp_name = solr end @@ -15,4 +15,4 @@ else config = dspace_configs.fetch(Rails.env) set_dspace_config config['host'], config['port'], config['rest_webapp_name'], config['solr_webapp_name'] -end +end \ No newline at end of file diff --git a/config/orientdb.yml b/config/orientdb.yml index 88e5d0367003e3f9b48b614ec04f7c910eb54769..b87506bb88309668349e5f619dea1863652c67b6 100644 --- a/config/orientdb.yml +++ b/config/orientdb.yml @@ -1,6 +1,6 @@ development: &development host: localhost - database: portalmec + database: PortalMEC username: admin password: admin port: 2480 diff --git a/lib/orient_db/methods/edge_methods.rb b/lib/orient_db/methods/edge_methods.rb index a2915afc716b120b3877eadfcdf2ad21dea40a39..9a2ea5b2b144e34d05fc6e4e623b2c358bdac188 100644 --- a/lib/orient_db/methods/edge_methods.rb +++ b/lib/orient_db/methods/edge_methods.rb @@ -11,8 +11,8 @@ module OrientDb end def edge_exists?(edge_class, from_id, to_id) - edge = connection.query sprintf("SELECT outE('%s') FROM %s WHERE out('%s') CONTAINS %s", edge_class, from_id, to_id) - edge.empty? + edge = connection.query sprintf("SELECT outE('%s') FROM %s WHERE out('%s') CONTAINS %s", edge_class, from_id, edge_class, to_id) + !edge.empty? end end diff --git a/lib/orient_db/methods/generic_methods.rb b/lib/orient_db/methods/generic_methods.rb index ecb170a47b1a437673f94b5a297799d2f8777939..fe39c0f59a86e6f4bd672ef4186c2dfc632feee6 100644 --- a/lib/orient_db/methods/generic_methods.rb +++ b/lib/orient_db/methods/generic_methods.rb @@ -7,7 +7,7 @@ module OrientDb end def select_by_property(from, prop_name, prop_value) - connection.query sprintf("SELECT FROM %s WHERE %s = %s", from, prop_name, prop_value) + connection.query sprintf("SELECT FROM %s WHERE %s = '%s'", from, prop_name, prop_value) end end diff --git a/lib/tasks/orientdb.rake b/lib/tasks/orientdb.rake index adffd53a4d86758645eb24f13853d4ddd08a5212..c7a61c5bb4ef70b64b4c4d66934774f80f29b752 100644 --- a/lib/tasks/orientdb.rake +++ b/lib/tasks/orientdb.rake @@ -15,17 +15,17 @@ namespace :orientdb do subject_repo = Portalmec::Application.repository.for(:subject) # Quantity of LearningObjects fetched on each iteration - limit = 1000 + limit = 100 # Start point from where LearningObjects will be fetched - last_id = "#-1:-1" + last_id = "#20:74000" # "#-1:-1" # loop do - puts " --> importing LearningObjects after #{@offset}" + puts " --> creating relations for LearningObjects after #{last_id}" begin # Get items from dspace (from offset to offset+limit) learning_objects = lo_repo.all_after(last_id,limit) - puts learning_objects + # puts "learning_objects = "+learning_objects.to_s rescue # Sleeps for a while to wait database's recovery sleep(30.seconds) @@ -36,19 +36,21 @@ namespace :orientdb do break if learning_objects.empty? learning_objects.each do |lo| - subject_name = lo.get_metadata_value_of("dc_subject_category") - subject = subject_repo.find_by_name(subject_name) - puts subject - if subject.nil? - subject = Subject.new(:name => subject_name) - subject_repo.create(subject) - lo.subjects << subject - - lo_repo.update_relations(lo) + subjects = lo.get_metadata_values_of("dc.subject.category") + subjects.each do |subject_name| + subject = subject_repo.find_by_name(subject_name) + if subject.nil? + subject = Subject.new(:name => subject_name) + subject_repo.create(subject) + end + lo.subjects << subject + end + p lo_repo.update_relations(lo) end # Change last id, to get new LearningObjects on next iteration last_id = learning_objects.last.id + end end end end \ No newline at end of file