;; Copyright 2016 Mozilla ;; ;; Licensed under the Apache License, Version 2.0 (the "License"); you may not use ;; this file except in compliance with the License. You may obtain a copy of the ;; License at http://www.apache.org/licenses/LICENSE-2.0 ;; Unless required by applicable law or agreed to in writing, software distributed ;; under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR ;; CONDITIONS OF ANY KIND, either express or implied. See the License for the ;; specific language governing permissions and limitations under the License. (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} {:db/id (d/id-literal :db.part/user) :db.install/_attribute :db.part/db :db/cardinality :db.cardinality/many :db/valueType :db.type/string :db/fulltext false :db/ident :save/unindexed}]) (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.

"})) (