;; This Source Code Form is subject to the terms of the Mozilla Public ;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; file, You can obtain one at http://mozilla.org/MPL/2.0/. (ns datomish.tofinoish-test #?(:cljs (:require-macros [datomish.pair-chan :refer [go-pair !]]]) #?@(:cljs [[datomish.js-sqlite] [datomish.pair-chan] [datomish.test-macros :refer-macros [deftest-async deftest-db]] [datomish.node-tempfile :refer [tempfile]] [cljs.test :as t :refer-macros [is are deftest testing async]] [cljs.core.async :as a :refer [!]]])) #?(:clj (:import [clojure.lang ExceptionInfo])) #?(:clj (:import [datascript.db DB]))) #?(:cljs (def Throwable js/Error)) (def page-schema [{:db/id (d/id-literal :db.part/user) :db/ident :page/url :db/valueType :db.type/string ; Because not all URLs are java.net.URIs. For JS we may want to use /uri. :db/cardinality :db.cardinality/one :db/unique :db.unique/identity :db/doc "A page's URL." :db.install/_attribute :db.part/db} {:db/id (d/id-literal :db.part/user) :db/ident :page/title :db/valueType :db.type/string :db/cardinality :db.cardinality/one ; We supersede as we see new titles. :db/doc "A page's title." :db.install/_attribute :db.part/db} {:db/id (d/id-literal :db.part/user) :db/ident :page/starred :db/valueType :db.type/boolean :db/cardinality :db.cardinality/one :db/doc "Whether the page is starred." :db.install/_attribute :db.part/db} {:db/id (d/id-literal :db.part/user) :db/ident :page/visit :db/valueType :db.type/ref :db/cardinality :db.cardinality/many :db/doc "A visit to the page." :db.install/_attribute :db.part/db}]) (def visit-schema [{:db/id (d/id-literal :db.part/user) :db/ident :visit/visitAt :db/valueType :db.type/instant :db/cardinality :db.cardinality/many :db/doc "The instant of the visit." :db.install/_attribute :db.part/db}]) (def session-schema [{:db/id (d/id-literal :db.part/user) :db/ident :session/startedFromAncestor :db/valueType :db.type/ref ; To a session. :db/cardinality :db.cardinality/one :db/doc "The ancestor of a session." :db.install/_attribute :db.part/db} {:db/id (d/id-literal :db.part/user) :db/ident :session/startedInScope :db/valueType :db.type/string :db/cardinality :db.cardinality/one :db/doc "The parent scope of a session." :db.install/_attribute :db.part/db} {:db/id (d/id-literal :db.part/user) :db/ident :session/startReason :db/valueType :db.type/string ; TODO: enum? :db/cardinality :db.cardinality/many :db/doc "The start reasons of a session." :db.install/_attribute :db.part/db} {:db/id (d/id-literal :db.part/user) :db/ident :session/endReason :db/valueType :db.type/string ; TODO: enum? :db/cardinality :db.cardinality/many :db/doc "The end reasons of a session." :db.install/_attribute :db.part/db} {:db/id (d/id-literal :db.part/user) :db/ident :event/session :db/valueType :db.type/ref ; To a session. :db/cardinality :db.cardinality/one :db/doc "The session in which a tx took place." :db.install/_attribute :db.part/db}]) (def save-schema [{:db/id (d/id-literal :db.part/user) :db.install/_attribute :db.part/db :db/cardinality :db.cardinality/one :db/valueType :db.type/ref :db/ident :save/page} {:db/id (d/id-literal :db.part/user) :db.install/_attribute :db.part/db :db/cardinality :db.cardinality/one :db/valueType :db.type/instant :db/ident :save/savedAt} {:db/id (d/id-literal :db.part/user) :db.install/_attribute :db.part/db :db/cardinality :db.cardinality/one :db/valueType :db.type/string :db/fulltext true :db/ident :save/title} {:db/id (d/id-literal :db.part/user) :db.install/_attribute :db.part/db :db/cardinality :db.cardinality/one :db/valueType :db.type/string :db/fulltext true :db/ident :save/excerpt} {:db/id (d/id-literal :db.part/user) :db.install/_attribute :db.part/db :db/cardinality :db.cardinality/one :db/valueType :db.type/string :db/fulltext true :db/ident :save/content}]) (def tofino-schema (concat page-schema visit-schema session-schema save-schema)) (defn instant [x] #?(:cljs x) #?(:clj (.getTime x))) (defn now [] #?(:cljs (js/Date.)) #?(:clj (java.util.Date.))) ;; Returns the session ID. (defn (> ( ?time ?since)] [?page :page/visit ?visit] [?page :page/url ?uri] [(get-else $ ?page :page/title "") ?title]] '[[?page :page/visit ?visit] [?visit :visit/visitAt ?time] [?page :page/url ?uri] [(get-else $ ?page :page/title "") ?title]])] (go-pair (let [rows (= (:lastVisited (first visited)) (:lastVisited (second visited)))))) (is (= "Example Philanthropy New" (A page about apples.

Fruit content goes here.

"})) (A page about apricots.

Fruit content goes here.

"})) (