From a13994a0f3a81b18419961b14c2d4ca7bb7e9577 Mon Sep 17 00:00:00 2001
From: Mauricio Giacomini Girardello <mauriciogiacomini4@gmail.com>
Date: Mon, 16 Nov 2015 09:47:37 -0200
Subject: [PATCH] refactoring learning object repository: move sanitize, count
 and social responsabilities for methods classes

---
 app/repositories/orient_db/base.rb            |  34 ++--
 .../orient_db/learning_object_repository.rb   | 169 ++----------------
 2 files changed, 29 insertions(+), 174 deletions(-)

diff --git a/app/repositories/orient_db/base.rb b/app/repositories/orient_db/base.rb
index 71ee00eec..d26abd828 100644
--- a/app/repositories/orient_db/base.rb
+++ b/app/repositories/orient_db/base.rb
@@ -1,5 +1,6 @@
 class OrientDb::Base
   include OrientDb::Methods::FinderMethods
+  include OrientDb::Methods::SanitazableMethods
 
   def initialize(orientdb_connection)
     @connection = orientdb_connection
@@ -37,14 +38,6 @@ class OrientDb::Base
     object
   end
 
-  def build_objects(hash=[])
-    objects = []
-    hash.each do |h|
-      objects << build_object(h)
-    end
-    objects
-  end
-
   def update_property(object, property, value)
     if accepted_properties.include? property
       connection.command "UPDATE #{odb_class} SET #{property}='#{value}', last_modified='#{Time.now()}' WHERE @rid = #{object.id}"
@@ -66,15 +59,12 @@ class OrientDb::Base
     hash
   end
 
-  def sanitize_orientdb_vars(var)
-    var.to_s.gsub(/\A@/, "")
-  end
-
-  def sanitize_orientdb_values(val)
-    if val.respond_to? "strftime"
-      val = val.strftime("%Y-%m-%d %H:%M:%S")
+  def build_objects(hash=[])
+    objects = []
+    hash.each do |h|
+      objects << build_object(h)
     end
-    val
+    objects
   end
 
   def build_object(args={})
@@ -83,12 +73,12 @@ class OrientDb::Base
 
   protected
 
-    def accepted_properties
-      raise NoMethodError, "You must implement this method"
-    end
+  def accepted_properties
+    raise NoMethodError, "You must implement this method"
+  end
 
-    def odb_class
-      raise NoMethodError, "You must implement this method"
-    end
+  def odb_class
+    raise NoMethodError, "You must implement this method"
+  end
 
 end
diff --git a/app/repositories/orient_db/learning_object_repository.rb b/app/repositories/orient_db/learning_object_repository.rb
index dbf0b7536..17e2e20b9 100644
--- a/app/repositories/orient_db/learning_object_repository.rb
+++ b/app/repositories/orient_db/learning_object_repository.rb
@@ -1,106 +1,10 @@
 module OrientDb
   class LearningObjectRepository < Base
+    include OrientDb::Methods::SocialMethods
     include OrientDb::Methods::EdgeMethods
+    include OrientDb::Methods::CountableMethods
     include RepositoriesProxy
 
-
-    ##
-    # Call this methods for increment the views number of a +learning_object+
-    # You are creating the 'views' relation between an +user+ and +learning_object+
-    # This relation is created only once.
-    #
-    # Nothing is returned
-    def increment_views(user, learning_object)
-      values = {date: sanitize_orientdb_values(Time.now)}
-
-      # If doesn't exist edges from user and learning object, create it and increment attribute
-      if !edge_exists? "Views", user.rid, learning_object.id
-        create_and_set_edge "Views", user.rid, learning_object.id, values
-        learning_object.views = learning_object.views + 1
-        # If exists, update the date property of view
-      else
-        edge = get_edges "Views", "in", learning_object.id
-        edge = edge.first
-
-        puts edge
-        set_values_edge edge["@rid"], values
-      end
-    end
-
-    def download(user, learning_object)
-      download_edge_class = 'Downloads'
-      values = {date: sanitize_orientdb_values(Time.now)}
-
-      create_and_set_edge download_edge_class, user.rid, learning_object.id, values
-      learning_object.downloads = learning_object.downloads + 1
-    end
-
-    ##
-    # Call this method checks if the +user+ has a like relation with +learning_object+
-    # This methods returns a boolean
-    def liked?(user, learning_object)
-      edge_exists? 'Likes', user.rid, learning_object.id
-    end
-
-    ##
-    # Call this method to create a 'like' relation between an user and a learning object.
-    # If the user already has the like relation, then nothing happens.
-    #
-    # If you want raise an exeception, use the LearningObjectRepository::like! method.
-    #
-    # Usage:
-    #   repository.for(:learning_objects).like current_user, @learning_object
-    def like(user, learning_object)
-      like_edge_class = 'Likes'
-
-      # If not liked, like and set date
-      if !liked? user, learning_object
-        # The properties of edge. In this case, only date for edge 'Likes'
-        values = {date: sanitize_orientdb_values(Time.now)}
-
-        create_and_set_edge like_edge_class, user.rid, learning_object.id, values
-        learning_object.likes = learning_object.likes + 1
-      end
-    end
-
-    ##
-    # Call this method to create a 'like' relation between an user and a learning object.
-    # If the +user+ already liked the +learning_object+ throw an exception.
-    def like!(user, learning_object)
-      if liked? user, learning_object
-        raise 'The user already likes this object.'
-      end
-      like user, learning_object
-    end
-
-    ##
-    # This methods destroy a 'like' relation between +user+ and +learning_object+
-    # If the +user+ hasn't liked the +learning_object+ nothing happens
-    # If you want raise an exeception, use the LearningObjectRepository::dislike! method.
-    def dislike(user, learning_object)
-      like_edge_class = 'Likes'
-      if liked? user, learning_object
-        destroy_edge like_edge_class, user.rid, learning_object.id
-        learning_object.likes = learning_object.likes - 1
-        true
-      end
-    end
-
-    ##
-    # This methods destroy a 'like' relation between +user+ and +learning_object+
-    # If the +user+ hasn't liked the +learning_object+ throw an exception.
-    def dislike!(user, learning_object)
-      if liked? user, learning_object
-        dislike user, learning_object
-      end
-      raise 'The user hasn`t likes this object.'
-    end
-
-    #it could perhaps be in the GenericMethods, if we'd like to extend to User counting.
-    def get_number_of_non_visualised
-      (connection.query("SELECT COUNT(*) FROM LearningObject WHERE in('Views').size() = 0"))[0]["COUNT"].to_i
-    end
-
     #get the ten most visualised. It's probably making too many useless accesses to orientDB...
     def get_most_visualised
       result = connection.query("SELECT FROM (SELECT @rid,in('Views').size() AS views FROM LearningObject) ORDER BY views DESC LIMIT 10")
@@ -132,6 +36,7 @@ module OrientDb
       build_object result.first
     end
 
+    #all method returns all learning objects of an user
     def all(user)
       build_objects(get_edges_end('PublishedBy', 'out', user.rid) || [])
     end
@@ -205,20 +110,7 @@ module OrientDb
       # get results in cache or search
       Rails.cache.fetch(cache_key, expires_in: 10.minutes) do
         qry = params[:query]
-
-        order = params[:order]
-        order = case order
-                  when 'author'
-                    'author'
-                  when 'publicationasc'
-                    'published_at'
-                  when 'publicationdesc'
-                    'published_at DESC'
-                  when 'title'
-                    'name ASC'
-                  else
-                    'score DESC'
-                end
+        order = order_by(params[:order])
 
         query = "SELECT FROM LearningObject WHERE [name, description, author] LUCENE '#{qry}'"
         query += " AND out('IsAbout') CONTAINS (name in ['" + params[:subject].join("','") + "'])" unless params[:subject].blank?
@@ -270,50 +162,23 @@ module OrientDb
       qry
     end
 
-    def count_all
-      Rails.cache.fetch('learning_object/count_all', expires_in: 6.hours) do
-        result = connection.query 'SELECT COUNT(*) as count FROM LearningObject', limit: 1
-        result[0]["count"]
-      end
-    end
-
-    def count_likes(learning_object)
-      get_in_edges_count "Likes", learning_object.id
-    end
-
-    def count_views(learning_object)
-      get_in_edges_count "Views", learning_object.id
-    end
-
-    def count_downloads(learning_object)
-      get_in_edges_count "Downloads", learning_object.id
-    end
-
-    def max_likes
-      Rails.cache.fetch('max_likes', expires_in: 6.hours) do
-        get_max_from_edge("Likes", "in")
-      end
-    end
-
-    def max_views
-      Rails.cache.fetch('max_views', expires_in: 6.hours) do
-        get_max_from_edge("Views", "in")
-      end
-    end
+    private
 
-    def max_downloads
-      Rails.cache.fetch('max_downloads', expires_in: 6.hours) do
-        get_max_from_edge("Downloads", "in")
+    def order_by(order)
+      case order
+        when 'author'
+          'author'
+        when 'publicationasc'
+          'published_at'
+        when 'publicationdesc'
+          'published_at DESC'
+        when 'title'
+          'name ASC'
+        else
+          'score DESC'
       end
     end
 
-    def get_max_from_edge(edge_class, type)
-      max = connection.command "SELECT max(#{type}('#{edge_class}').size()) FROM LearningObject"
-      max["result"][0]["max"]
-    end
-
-    private
-
     def accepted_properties
       ['thumbnail', 'score']
     end
-- 
GitLab