(cloud) Made search work consistently

This commit is contained in:
2023-05-04 21:02:03 -07:00
parent e42fe2189c
commit 4e7e19da97
12 changed files with 308 additions and 186 deletions

View File

@@ -1,21 +1,136 @@
(ns auto-ap.solr
(:require [clojure.data.json :as json]
[clj-http.client :as client]
[config.core :refer [env]]))
(:require
[auto-ap.datomic :refer [conn]]
[clj-http.client :as client]
[clojure.data.json :as json]
[config.core :refer [env]]
[datomic.api :as dc]
[clj-time.coerce :as c]
[auto-ap.time :as atime]
[clojure.string :as str]))
(def solr-uri (:solr-uri env))
(defn fmt-amount [a]
(with-precision 2
(some-> a
bigdec
(.setScale 2 java.math.RoundingMode/HALF_UP)
(double))))
(defmulti datomic->solr (fn [d]
(let [entity (dc/pull (dc/db conn) '[:transaction/date :invoice/date :payment/date :journal-entry/date] d)]
(cond (:transaction/date entity)
"transaction"
(:invoice/date entity)
"invoice"
(:payment/date entity)
"payment"
(:journal-entry/date entity)
"journal-entry"
:else
(throw (ex-info "Trying to index unknown entity"
{:id d}))))))
(defmethod datomic->solr "transaction" [d]
(let [i (dc/pull (dc/db conn) '[:db/id :transaction/description-original
:transaction/amount
{:transaction/client [:client/code :db/id]
:transaction/vendor [:vendor/name :db/id]}
:transaction/date]
d)]
{"id" (-> i :db/id)
"client_id" (-> i :transaction/client :db/id)
"client_code" (-> i :transaction/client :client/code)
"date" (some-> i :transaction/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
"amount" (-> i :transaction/amount fmt-amount)
"description" (-> i :transaction/description-original)
"vendor_name" (-> i :transaction/vendor :vendor/name)
"vendor_id" (-> i :transaction/vendor :db/id)
"type" "transaction"}))
(defmethod datomic->solr "journal-entry" [d]
(let [i (dc/pull (dc/db conn) '[:db/id
:journal-entry/amount
:journal-entry/source
{:journal-entry/client [:client/code :db/id]
:journal-entry/vendor [:vendor/name :db/id]
:journal-entry/line-items [{:journal-entry-line/account [:account/name :account/numeric-code]}]}
:journal-entry/date]
d)]
{"id" (-> i :db/id)
"client_id" (-> i :journal-entry/client :db/id)
"client_code" (-> i :journal-entry/client :client/code)
"date" (some-> i :journal-entry/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
"amount" (-> i :journal-entry/amount fmt-amount)
"description" (str
(when (:journal-entry/source i)
(str (:journal-entry/source i) ": "))
(str/join ", " (set (map
(fn [li]
(format "%s (%s)" (:account/name (:journal-entry-line/account li))
(:account/numeric-code (:journal-entry-line/account li))))
(:journal-entry/line-items i)))))
"vendor_name" (-> i :journal-entry/vendor :vendor/name)
"vendor_id" (-> i :journal-entry/vendor :db/id)
"type" "journal-entry"}))
(defmethod datomic->solr "invoice" [d]
(let [i (dc/pull (dc/db conn) '[:db/id :invoice/invoice-number
:invoice/total
{:invoice/client [:client/code :db/id]
:invoice/vendor [:vendor/name :db/id]}
:invoice/date]
d)]
{"id" (-> i :db/id)
"client_id" (-> i :invoice/client :db/id)
"client_code" (-> i :invoice/client :client/code)
"date" (some-> i :invoice/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
"amount" (-> i :invoice/total fmt-amount)
"number" (-> i :invoice/invoice-number)
"vendor_name" (-> i :invoice/vendor :vendor/name)
"vendor_id" (-> i :invoice/vendor :db/id)
"type" "invoice"}))
(defmethod datomic->solr "payment" [d]
(let [i (dc/pull (dc/db conn) '[:db/id :payment/check-number
:payment/amount
{:payment/client [:client/code :db/id]
:payment/vendor [:vendor/name :db/id]}
:payment/date]
d)]
{"id" (-> i :db/id)
"client_id" (-> i :payment/client :db/id)
"client_code" (-> i :payment/client :client/code)
"date" (some-> i :payment/date c/to-date-time (atime/unparse atime/iso-date) (str "T00:00:00Z"))
"amount" (-> i :payment/amount fmt-amount)
"description" (-> i :payment/check-number)
"vendor_name" (-> i :payment/vendor :vendor/name)
"vendor_id" (-> i :payment/vendor :db/id)
"type" "payment"}))
(defn index-documents [xs]
(client/post
(str solr-uri "/solr/invoices/update?commitWithin=15000")
{:headers {"Content-Type" "application/json"}
:socket-timeout 30000
:connection-timeout 30000
:method "POST"
:body (json/write-str xs)}))
:body (json/write-str (map datomic->solr xs))}))
(defn query [q]
(-> (client/post (str solr-uri "/solr/invoices/query")
{:body (json/write-str {"query" q
"fields" "id, date, amount, type, description, number, client_code, client_id, vendor_name"})
:socket-timeout 30000
:connection-timeout 30000
:headers {"Content-Type" "application/json"}
:as :json}
)