aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGabriel A. Giovanini <mail@gabrielgio.me>2018-02-18 16:41:25 -0300
committerGabriel A. Giovanini <mail@gabrielgio.me>2018-02-18 16:41:25 -0300
commit48bd546122842012a65572fa436fe58cfd965ca7 (patch)
treed5e7f8accdd635ebc220cd6010ccb00280a0e145 /src
parent7f492fb132b44917f2293b8435924de4524d3053 (diff)
downloadqueue-api-48bd546122842012a65572fa436fe58cfd965ca7.tar.gz
queue-api-48bd546122842012a65572fa436fe58cfd965ca7.tar.bz2
queue-api-48bd546122842012a65572fa436fe58cfd965ca7.zip
Adds more features and more tests
Diffstat (limited to 'src')
-rw-r--r--src/clj/queue_api/db/core.clj89
-rw-r--r--src/clj/queue_api/routes/services.clj4
2 files changed, 63 insertions, 30 deletions
diff --git a/src/clj/queue_api/db/core.clj b/src/clj/queue_api/db/core.clj
index 63446d8..40e6188 100644
--- a/src/clj/queue_api/db/core.clj
+++ b/src/clj/queue_api/db/core.clj
@@ -16,26 +16,21 @@
(defn add-agent
"Add an agent into the database"
[{:keys [id name primary-skillset secondary-skillset]}]
- (d/transact! queue-api.db.core/conn [{:agent/id id
- :agent/name name
- :agent/primary-skillset primary-skillset
- :agent/secondary-skillset secondary-skillset}]))
+ (d/transact! queue-api.db.core/conn
+ [{:agent/id id
+ :agent/name name
+ :agent/primary-skillset primary-skillset
+ :agent/secondary-skillset secondary-skillset}]))
(defn add-job
"Add a job into the database"
[{:keys [id type urgent]}]
- (d/transact! queue-api.db.core/conn [{:job/id id
- :job/type type
- :job/urgent urgent
- :job/date (time/now)
- :job/status :unassigned}]))
-
-(defn request-job [id]
- {:job_request {:job_id "Dummy" :agent_id "Dummy"}})
-
-(defn get-agent [id]
- [{:type "Dummy"
- :jobs -2}])
+ (d/transact! queue-api.db.core/conn
+ [{:job/id id
+ :job/type type
+ :job/urgent urgent
+ :job/date (time/now)
+ :job/status :unassigned}]))
(defn agent-jobs
"Get a job that has a agent bounded with given `id` and a status of `s`"
@@ -51,25 +46,26 @@
(map #(d/entity @conn [:job/id (first %)]) q)))
(defn q-job
- "Fetch job and order by date
- `u`: if it is flagged urgent
- `s` status of the job
- `t` type of the job"
- [u s t]
+ "Fetch job and sort by date
+ `u`: urgent flag
+ `s`: status of the job
+ `ts`: types of the job"
+ [u s & ts]
(let [q (->> (d/q '[:find ?d ?id
- :in $ ?u ?s ?t
+ :in $ ?u ?s ?ts
:where
[?e :job/date ?d]
[?e :job/id ?id]
[?e :job/urgent ?u]
[?e :job/status ?s]
- [?e :job/type ?t]]
- @conn u s t)
+ [?e :job/type ?t]
+ [(clojure.string/includes? ?ts ?t)]]
+ @conn u s ts)
(sort-by first))]
(map #(d/entity @conn [:job/id (last %)]) q)))
(defn q-status
- "Query job filtering only by status"
+ "Query job filtering only by `s`"
[s]
(d/q '[:find ?id :in $ ?status
:where
@@ -77,9 +73,46 @@
[?e :job/id ?id]]
@conn s))
+(defn sum-agent
+ "Get how many jobs a agent (`id`) has performed aggregated by type"
+ [id]
+ (let [jobs (agent-jobs id :completed)]
+ (->> (reduce (fn [l r]
+ (let [t (:job/type r)]
+ (if (nil? (get l t))
+ (conj l {t 1})
+ (conj l {t (inc (get l t))})))) {} jobs)
+ (map (fn [x]
+ {:type (first x)
+ :jobs (last x)})))))
+
(defn sum-queue
"Count all job aggregated by type"
[]
- {:completed (map #(first %) (q-status :completed))
- :processing (map #(first %) (q-status :processing))
- :unassigned (map #(first %) (q-status :unassigned))}) \ No newline at end of file
+ {:completed (map first (q-status :completed))
+ :processing (map first (q-status :processing))
+ :unassigned (map first (q-status :unassigned))})
+
+(defn q-skillset
+ "First query for :unassigned jobs with skillset of `s` and flagged as urgent
+ if nothing was found query for not urgent ones."
+ [s]
+ (let [ju (q-job true :unassigned s)]
+ (if (not (empty? ju))
+ (first ju)
+ (let [jn (q-job false :unassigned s)]
+ (if (not (empty? jn))
+ (first jn))))))
+
+(defn request-job
+ "Get the fittest job for a agent `id`."
+ [id]
+ (let [a (d/entity @conn [:agent/id id])]
+ (if (not (nil? a))
+ (let [p (q-skillset (:primary-skillset a))]
+ (if (not (nil? p))
+ p
+ (q-skillset (:secondary-skillset a)))))))
+
+(defn dequeue-job [id]
+ ) \ No newline at end of file
diff --git a/src/clj/queue_api/routes/services.clj b/src/clj/queue_api/routes/services.clj
index 7e9fc98..d432517 100644
--- a/src/clj/queue_api/routes/services.clj
+++ b/src/clj/queue_api/routes/services.clj
@@ -26,7 +26,7 @@
:return [{:type String :jobs s/Int}]
:body-params [agent_id :- String]
:summary "Get summary of an agent"
- (ok (db/get-agent agent_id))))
+ (ok (db/sum-agent agent_id))))
(context "/job" []
:tags ["job"]
@@ -41,7 +41,7 @@
:return {:job_request {:job_id String :agent_id String}}
:body-params [agent_id :- String]
:summary "Request a job to a given agent"
- (ok (db/request-job agent_id))))
+ (ok (db/dequeue-job agent_id))))
(context "/queue" []
:tags ["queue"]