diff --git a/src/luduverse/db.clj b/src/luduverse/db.clj index c89ec40..e52e223 100644 --- a/src/luduverse/db.clj +++ b/src/luduverse/db.clj @@ -10,8 +10,8 @@ (defentity entries (database db) - (belongs-to competitions) - (belongs-to users) + (belongs-to competitions {:fk :competition_id}) + (belongs-to users {:fk :user_id}) (has-many sources)) (defentity competitions diff --git a/src/luduverse/models/entry.clj b/src/luduverse/models/entry.clj index 7033655..4ff9d29 100644 --- a/src/luduverse/models/entry.clj +++ b/src/luduverse/models/entry.clj @@ -8,9 +8,15 @@ (defn all [] (select entries)) +(defn by-id [entry-id] + (first (select entries + (with competitions) + (with users) + (where {:id entry-id})))) + (defn by-ld-uid [ld-uid] (first (select entries - (where {:ld_uid ld-uid})))) + (where {:ld_uid ld-uid})))) (defn exists? [ld-uid] (not (empty? (select entries diff --git a/src/luduverse/search.clj b/src/luduverse/search.clj index e69de29..f530f49 100644 --- a/src/luduverse/search.clj +++ b/src/luduverse/search.clj @@ -0,0 +1,51 @@ +(ns luduverse.search + (:require [clojurewerkz.elastisch.rest :as el] + [clojurewerkz.elastisch.rest.index :as eli] + [clojurewerkz.elastisch.rest.document :as eld] + [clojurewerkz.elastisch.rest.response :as elresp] + [clojurewerkz.elastisch.query :as elq] + + [clojure.pprint :as pp] + [luduverse.models.entry :as entry])) + +(def connection (atom (el/connect "http://localhost:9200"))) + +(defn recreate-index [] + (eli/delete @connection "luduverse") + (eli/create @connection "luduverse" + :mappings {"entry" {:properties {:query {:type "string"} + :ld_uid {:type "integer" :store "yes"} + :id {:type "integer" :store "yes"} + :title {:type "string" :store "yes"} + :description {:type "string"} + :type {:type "string" :store "yes"} + :username {:type "string" :store "yes"} + :theme {:type "string" :store "yes"}}}})) + +(defn store [entry-id] + (let [data (entry/by-id entry-id) + query-string (str (:ld_uid data) " " (:title data) " " (:username data) " " (:type data) " " (:theme data) " " (:description data))] + (eld/create @connection "luduverse" "entry" {:query query-string + :ld_uid (:ld_uid data) + :id (:id data) + :title (:title data) + :description (:description data) + :type (:type data) + :username (:username data) + :theme (:theme data)}))) + +(defn store-all [] + ; TODO: Delete all entries before + (doseq [e (entry/all)] + (store (:id e)))) + +(defn search [term] + (let [res (eld/search @connection "luduverse" "entry" + :query (elq/query-string :query term) + :sort {:title "desc"} + :from 0 + :size 50) + number-of-hits (elresp/total-hits res) + hits (elresp/hits-from res)] + {:hit-count number-of-hits + :results hits}))