annotate light9/web/graph.coffee @ 1350:36f58b2aa8ef

browser syncedgraph sends patches back to server Ignore-this: eb8d3f018ff97f7389c4af3efa62fd9
author Drew Perttula <drewp@bigasterisk.com>
date Sun, 05 Jun 2016 03:21:31 +0000
parents 5c54a1f94050
children 6044e527d795
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1346
2809a8b732f6 optimize graph lookup calls during zoom steps
Drew Perttula <drewp@bigasterisk.com>
parents: 1334
diff changeset
1 log = console.log
2809a8b732f6 optimize graph lookup calls during zoom steps
Drew Perttula <drewp@bigasterisk.com>
parents: 1334
diff changeset
2
1317
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
3 # Patch is {addQuads: <quads>, delQuads: <quads>}
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
4 # <quads> is [{subject: s, ...}, ...]
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
5
1350
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
6 patchSizeSummary = (patch) ->
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
7 '-' + patch.delQuads.length + ' +' + patch.addQuads.length
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
8
1317
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
9 # partial port of autodepgraphapi.py
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
10 class GraphWatchers
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
11 constructor: ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
12 @handlersSp = {} # {s: {p: [handlers]}}
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
13 subscribe: (s, p, o, onChange) -> # return subscription handle
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
14 if o? then throw Error('not implemented')
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
15 if not @handlersSp[s]
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
16 @handlersSp[s] = {}
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
17 if not @handlersSp[s][p]
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
18 @handlersSp[s][p] = []
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
19 @handlersSp[s][p].push(onChange)
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
20
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
21 unsubscribe: (subscription) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
22 throw Error('not implemented')
1334
8406a9fbeb9d note shape can be edited
Drew Perttula <drewp@bigasterisk.com>
parents: 1328
diff changeset
23
8406a9fbeb9d note shape can be edited
Drew Perttula <drewp@bigasterisk.com>
parents: 1328
diff changeset
24 matchingHandlers: (quad) ->
8406a9fbeb9d note shape can be edited
Drew Perttula <drewp@bigasterisk.com>
parents: 1328
diff changeset
25 matches = []
8406a9fbeb9d note shape can be edited
Drew Perttula <drewp@bigasterisk.com>
parents: 1328
diff changeset
26 for subjDict in [@handlersSp[quad.subject] || {}, @handlersSp[null] || {}]
8406a9fbeb9d note shape can be edited
Drew Perttula <drewp@bigasterisk.com>
parents: 1328
diff changeset
27 for subjPredMatches in [subjDict[quad.predicate] || [], subjDict[null] || []]
8406a9fbeb9d note shape can be edited
Drew Perttula <drewp@bigasterisk.com>
parents: 1328
diff changeset
28 matches = matches.concat(subjPredMatches)
8406a9fbeb9d note shape can be edited
Drew Perttula <drewp@bigasterisk.com>
parents: 1328
diff changeset
29 return matches
1317
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
30
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
31 graphChanged: (patch) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
32 for quad in patch.delQuads
1334
8406a9fbeb9d note shape can be edited
Drew Perttula <drewp@bigasterisk.com>
parents: 1328
diff changeset
33 for cb in @matchingHandlers(quad)
1317
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
34 # currently calls multiple times, which is ok, but we might
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
35 # group things into fewer patches
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
36 cb({delQuads: [quad], addQuads: []})
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
37 for quad in patch.addQuads
1334
8406a9fbeb9d note shape can be edited
Drew Perttula <drewp@bigasterisk.com>
parents: 1328
diff changeset
38 for cb in @matchingHandlers(quad)
1317
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
39 cb({delQuads: [], addQuads: [quad]})
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
40
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
41
1350
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
42 jsonPatch = (jsPatch, cb) ->
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
43 out = {patch: {adds: '', deletes: ''}}
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
44
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
45 writeDels = (cb) ->
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
46 writer = N3.Writer({ format: 'N-Quads' })
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
47 writer.addTriples(jsPatch.delQuads)
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
48 writer.end((err, result) ->
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
49 out.patch.deletes = result
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
50 cb())
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
51
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
52 writeAdds = (cb) ->
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
53 writer = N3.Writer({ format: 'N-Quads' })
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
54 writer.addTriples(jsPatch.addQuads)
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
55 writer.end((err, result) ->
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
56 out.patch.adds = result
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
57 cb())
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
58
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
59 async.parallel([writeDels, writeAdds], (err) ->
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
60 cb(JSON.stringify(out))
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
61 )
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
62
1317
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
63 class window.SyncedGraph
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
64 # Note that applyPatch is the only method to write to the graph, so
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
65 # it can fire subscriptions.
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
66
1347
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
67 constructor: (@patchSenderUrl, prefixes) ->
1317
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
68 @graph = N3.Store()
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
69 @_addPrefixes(prefixes)
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
70 @_watchers = new GraphWatchers()
1350
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
71 @patchesToSend = []
1347
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
72 @newConnection()
1317
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
73
1347
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
74 newConnection: ->
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
75 fullUrl = 'ws://' + window.location.host + @patchSenderUrl
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
76 @ws = new WebSocket(fullUrl)
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
77
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
78 @ws.onopen = =>
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
79 log('connected to', fullUrl)
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
80
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
81 @ws.onerror = (e) =>
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
82 log('ws error ' + e)
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
83
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
84 @ws.onclose = =>
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
85 log('ws close')
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
86
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
87 @ws.onmessage = (evt) =>
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
88 @onMessage(JSON.parse(evt.data))
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
89
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
90 onMessage: (msg) ->
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
91 log('from rdfdb: ', msg)
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
92
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
93 patch = {delQuads: [], addQuads: []}
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
94
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
95 parseAdds = (cb) =>
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
96 parser = N3.Parser()
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
97 parser.parse msg.patch.adds, (error, quad, prefixes) =>
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
98 if (quad)
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
99 patch.addQuads.push(quad)
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
100 else
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
101 cb()
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
102 parseDels = (cb) =>
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
103 parser = N3.Parser()
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
104 parser.parse msg.patch.deletes, (error, quad, prefixes) =>
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
105 if (quad)
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
106 patch.delQuads.push(quad)
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
107 else
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
108 cb()
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
109
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
110 async.parallel([parseAdds, parseDels], ((err) => @applyPatch(patch)))
1350
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
111
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
112 _continueSending: ->
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
113 if @ws.readyState != @ws.OPEN
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
114 setTimeout(@_continueSending.bind(@), 500)
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
115 return
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
116
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
117 # we could call this less often and coalesce patches together to optimize
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
118 # the dragging cases.
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
119
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
120 sendOne = (patch, cb) =>
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
121 jsonPatch(patch, (json) =>
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
122 log('send patch to server, ' + json.length + ' bytes')
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
123 @ws.send(json)
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
124 cb(null)
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
125 )
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
126
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
127 async.eachSeries(@patchesToSend, sendOne, () =>
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
128 @patchesToSend = []
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
129 )
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
130
1347
5c54a1f94050 browser SyncedGraph client connects and receives patches
Drew Perttula <drewp@bigasterisk.com>
parents: 1346
diff changeset
131
1317
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
132 _addPrefixes: (prefixes) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
133 @graph.addPrefixes(prefixes)
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
134
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
135 Uri: (curie) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
136 N3.Util.expandPrefixedName(curie, @graph._prefixes)
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
137
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
138 Literal: (jsValue) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
139 N3.Util.createLiteral(jsValue)
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
140
1350
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
141 LiteralRoundedFloat: (f) ->
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
142 N3.Util.createLiteral(d3.format(".3f")(f),
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
143 "http://www.w3.org/2001/XMLSchema#decimal")
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
144
1317
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
145 toJs: (literal) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
146 # incomplete
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
147 parseFloat(N3.Util.getLiteralValue(literal))
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
148
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
149 loadTrig: (trig, cb) -> # for debugging
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
150 patch = {delQuads: [], addQuads: []}
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
151 parser = N3.Parser()
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
152 parser.parse trig, (error, quad, prefixes) =>
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
153 if (quad)
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
154 patch.addQuads.push(quad)
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
155 else
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
156 @applyPatch(patch)
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
157 @_addPrefixes(prefixes)
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
158 cb() if cb
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
159
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
160 quads: () -> # for debugging
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
161 [q.subject, q.predicate, q.object, q.graph] for q in @graph.find()
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
162
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
163 applyAndSendPatch: (patch, cb) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
164 @applyPatch(patch)
1350
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
165 console.log('queue patch to server ', patchSizeSummary(patch))
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
166 @patchesToSend.push(patch)
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
167 @_continueSending()
1317
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
168
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
169 applyPatch: (patch) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
170 # In most cases you want applyAndSendPatch.
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
171 #
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
172 # This is the only method that writes to the graph!
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
173 for quad in patch.delQuads
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
174 @graph.removeTriple(quad)
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
175 for quad in patch.addQuads
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
176 @graph.addTriple(quad)
1350
36f58b2aa8ef browser syncedgraph sends patches back to server
Drew Perttula <drewp@bigasterisk.com>
parents: 1347
diff changeset
177 log('applied patch locally', patchSizeSummary(patch))
1317
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
178 @_watchers.graphChanged(patch)
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
179
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
180 getObjectPatch: (s, p, newObject, g) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
181 # send a patch which removes existing values for (s,p,*,c) and
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
182 # adds (s,p,newObject,c). Values in other graphs are not affected.
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
183 existing = @graph.findByIRI(s, p, null, g)
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
184 return {
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
185 delQuads: existing,
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
186 addQuads: [{subject: s, predicate: p, object: newObject, graph: g}]
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
187 }
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
188
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
189 patchObject: (s, p, newObject, g) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
190 @applyAndSendPatch(@getObjectPatch(s, p, newObject, g))
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
191
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
192
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
193 subscribe: (s, p, o, onChange) -> # return subscription handle
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
194 # onChange is called with a patch that's limited to the quads
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
195 # that match your request.
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
196 # We call you immediately on existing triples.
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
197 @_watchers.subscribe(s, p, o, onChange)
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
198 immediatePatch = {delQuads: [], addQuads: @graph.findByIRI(s, p, o)}
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
199 if immediatePatch.addQuads.length
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
200 onChange(immediatePatch)
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
201
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
202 unsubscribe: (subscription) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
203 @_watchers.unsubscribe(subscription)
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
204
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
205 floatValue: (s, p) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
206 quads = @graph.findByIRI(s, p)
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
207 switch quads.length
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
208 when 0 then throw new Error("no value for "+s+" "+p)
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
209 when 1
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
210 obj = quads[0].object
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
211 return parseFloat(N3.Util.getLiteralValue(obj))
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
212 else
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
213 throw new Error("too many values: " + JSON.stringify(quads))
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
214
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
215 stringValue: (s, p) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
216
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
217 uriValue: (s, p) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
218
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
219 objects: (s, p) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
220
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
221 subjects: (p, o) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
222
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
223 items: (list) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
224
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
225 contains: (s, p, o) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
226
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
227 ###
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
228 rdfstore.create((err, store) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
229 window.store = store
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
230 store.setPrefix('l9', "http://light9.bigasterisk.com/")
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
231 store.setPrefix('xsd', "http://www.w3.org/2001/XMLSchema#")
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
232 store.load('text/turtle', "
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
233 @prefix : <http://light9.bigasterisk.com/> .
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
234 @prefix dev: <http://light9.bigasterisk.com/device/> .
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
235
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
236 :demoResource :startTime 0.5 .
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
237 ", (err, n) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
238 console.log('loaded', n)
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
239 store.graph (err, graph) ->
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
240 window.graph = graph
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
241
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
242 )
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
243 window.URI = (curie) -> store.rdf.createNamedNode(store.rdf.resolve(curie))
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
244 window.Lit = (value, dtype) -> store.rdf.createLiteral(value, null, URI(dtype))
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
245
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
246 )
4c6d88aa9e26 enough element and rdf support to drag one adjuster and see its value change
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
247 ###