diff --git a/src/clj/auto_ap/datomic/transactions.clj b/src/clj/auto_ap/datomic/transactions.clj index 06131634..c3d05590 100644 --- a/src/clj/auto_ap/datomic/transactions.clj +++ b/src/clj/auto_ap/datomic/transactions.clj @@ -4,6 +4,14 @@ [auto-ap.graphql.utils :refer [limited-clients]] [clj-time.coerce :as c])) +(defn sort-fn [args] + (cond + (= "client" (:sort-by args)) + #(-> % :transaction/client :client/name) + + :else + (keyword "transaction" (:sort-by args)))) + (defn add-arg [query name value where & rest] (let [query (-> query (update :args conj value) @@ -11,11 +19,23 @@ (update-in [:query :where] conj where))] (reduce #(update-in %1 [:query :where] conj %2) query rest))) +(defn apply-sort [args results ] + (cond->> results + (:sort-by args) (sort-by (sort-fn args)) + (= (:asc args) false) (reverse))) -(defn raw-graphql [args] +(defn apply-pagination [args results] + (->> results + (drop (:start args 0)) + (take (:count args 100)))) + +(defn raw-graphql-ids [args] (->> (d/query - (cond-> {:query {:find ['(pull ?e [* {:transaction/client [:client/name :db/id] - :transaction/bank-account [:bank-account/name :bank-account/yodlee-account-id]}])] + (cond-> {:query {:find [['pull '?e (into [:db/id] (condp = (:sort-by args) + "client" [{:transaction/client [:client/name]}] + nil [] + [(keyword "transaction" (:sort-by args))])) + ]] :in ['$] :where ['[?e :transaction/id]]} :args [(d/db (d/connect uri))]} @@ -28,27 +48,38 @@ '[?e :transaction/client ?c] '[?c :client/original-id ?original-id]))) (map first) + (map #(update % :transaction/date c/from-date)) + (map #(update % :transaction/post-date c/from-date)))) + +(defn graphql-results [ids args] + (->> (d/query + (cond-> {:query {:find ['(pull ?xx [* {:transaction/client [:client/name :db/id] + :transaction/bank-account [:bank-account/name :bank-account/yodlee-account-id]}])] + :in ['$] + :where []} + :args [(d/db (d/connect uri))]} + + true (add-arg '[?xx ...] (set (map :db/id ids)) + '[?xx]))) + (map first) (map #(update % :transaction/date c/from-date)) (map #(update % :transaction/post-date c/from-date)))) -(defn sort-fn [args] - (cond - (= "client" (:sort-by args)) - #(-> % :transaction/client :client/name) - :else - (keyword "transaction" (:sort-by args)))) (defn get-graphql [args] - (let [results (raw-graphql args)] - (cond->> results - (:sort-by args) (sort-by (sort-fn args)) - (= (:asc args) false) (reverse) - true (drop (:start args 0)) - true (take (:count args 100))))) + + (let [ids-to-retrieve (->> (raw-graphql-ids args) + (apply-sort args)) + matching-count (count ids-to-retrieve) + ids-to-retrieve (apply-pagination args ids-to-retrieve )] + + [(graphql-results ids-to-retrieve args) + matching-count] + #_(time (->> (graphql-results ids-to-retrieve args) + (apply-sort args))))) (defn count-graphql [args] - - (->> (raw-graphql args) + (->> (raw-graphql-ids args) (count))) diff --git a/src/clj/auto_ap/graphql/transactions.clj b/src/clj/auto_ap/graphql/transactions.clj index 1be5c7bc..089da9d0 100644 --- a/src/clj/auto_ap/graphql/transactions.clj +++ b/src/clj/auto_ap/graphql/transactions.clj @@ -10,10 +10,8 @@ (defn get-transaction-page [context args value] (println "TRANSACTION PAGE") (let [args (assoc args :id (:id context)) - transactions (map - ->graphql - (d-transactions/get-graphql (doto (<-graphql args) println))) - transactions-count (d-transactions/count-graphql (<-graphql args))] + [transactions transactions-count] (time (d-transactions/get-graphql (<-graphql args))) + transactions (map ->graphql transactions)] [{:transactions transactions :total transactions-count :count (count transactions)