// Chains through place ID. starPage(url, session, action, now = microtime.now()) { const result = datascript.core.transact_BANG_(this.conn, vector( vector(DB_ADD, -1, 'page/url', url) )); // TODO return datascript.core.resolve_tempid(result.tempids, -1); }
async startSession(scope, ancestor, now = microtime.now(), reason = SessionStartReason.newTab) { const result = datascript.core.transact_BANG_(this.conn, vector( vector(DB_ADD, -1, 'session/startedInScope', `${scope}`), vector(DB_ADD, -1, 'session/startedFromAncestor', ancestor), vector(DB_ADD, -1, 'session/startReason', reason), vector(DB_ADD, -1, 'session/startTime', now) )); return datascript.core.resolve_tempid(result.tempids, -1); }
/** * Record a visit to a URL. * @param url the visited URL. * @param title (optional) a known title for the page. * @param now (optional) microsecond timestamp. * @returns {Promise} a promise that resolves to the place ID. */ visit(url, session, title, now = microtime.now()) { const result = datascript.core.transact_BANG_(this.conn, vector( vector(DB_ADD, -1, 'page/url', url), vector(DB_ADD, -1, 'page/title', title), // TODO: handle no title. vector(DB_ADD, -1, 'event/visit', -2), vector(DB_ADD, -2, 'visit/instant', now) )); // TODO: session. return datascript.core.resolve_tempid(result.tempids, -1); }
someStuff() { datascript.core.transact_BANG_(this.conn, vector( vector(DB_ADD, -1, 'page/url', 'http://foo.com/'), vector(DB_ADD, -1, 'page/title', 'Foo.com') )); const query = parse(` [:find ?title :in $ ?url :where [?x "page/url" ?url] [?x "page/title" ?title]] `); let results = datascript.core.q(query, datascript.js.db(this.conn), 'http://foo.com/'); console.log(results); datascript.core.transact_BANG_(this.conn, vector( vector(DB_ADD, -1, 'page/url', 'http://foo.com/'), vector(DB_ADD, -1, 'page/title', 'Foo.com Again') )); results = datascript.core.q(query, datascript.js.db(this.conn), 'http://foo.com/'); console.log(results); return results; }
async getStarredWithOrderByAndLimit(newestFirst, limit) { const starredQuery = parse(` [:find (max ?timestampMicros) (pull ?page ["page/url" "page/title"]) ?page :in $ :where [?page "page/starred" true ?t] [?t ":db/txInstant" ?timestampMicros] ]`); const results = datascript.core.q(starredQuery, this.getDB()); const sorted = newestFirst ? mori.sortBy(mori.first, compareDescending, results) : results; const limited = limit ? mori.take(limit, sorted) : sorted; return mori.map(this.pageResultToJSON, limited); }
constructor(dir) { this.dir = dir; const schema = this.createSchema(); this.conn = datascript.core.create_conn(schema); this.schema = schema; this.pageDetailsQuery = parse(` [:find (max ?timestamp) (pull ?page ["page/url" "page/title"]) ?page :in $ ?visits :where [(ground ?visits) [[?ev]]] [?page "event/visit" ?ev] [?ev _ ?timestamp]] `); }
constructor(dir) { this.dir = dir; const schema = this.createSchema(); this.conn = datascript.core.create_conn(schema); this.schema = schema; }
getVisits(since = null) { const db = datascript.core.db(this.conn); return datascript.core.index_range(db, 'visit/instant', since, null); }
async endSession(session, now = microtime.now(), reason = SessionEndReason.tabClosed) { return datascript.core.transact_BANG_(this.conn, vector( vector(DB_ADD, session, 'session/endReason', reason), vector(DB_ADD, session, 'session/endTime', now) )); }
getPageDetails(visits) { const query = this.pageDetailsQuery; const results = datascript.core.q(query, this.getDB(), visits); const sorted = mori.sortBy(mori.first, compareDescending, results); return mori.map(this.pageResultToJSON, sorted); }
getVisits(since = null) { return mori.reverse( datascript.core.index_range( this.getDB(), 'visit/instant', since, null)); }
transact(assertions) { return datascript.core.transact_BANG_(this.conn, assertions); }
getDB() { return datascript.core.db(this.conn); }