@@ -8,6 +8,11 @@ const defs = {
88 ops : [ 'object' , 'predicate' , 'subject' ] , // [optional]
99 osp : [ 'object' , 'subject' , 'predicate' ]
1010}
11+ const tripleAliasMap = {
12+ s : 'subject' ,
13+ p : 'predicate' ,
14+ o : 'object'
15+ }
1116const defKeys = Object . keys ( defs )
1217
1318function collect ( stream , cb ) {
@@ -20,7 +25,7 @@ function collect (stream, cb) {
2025function namespaceBlankVariables ( triple ) {
2126 Object . keys ( triple ) . forEach ( ( key ) => {
2227 if ( triple [ key ] . startsWith && triple [ key ] . startsWith ( '_:' ) ) {
23- triple [ key ] = triple [ key ] . replace ( / ^ _ : / , 'hypergraph :' )
28+ triple [ key ] = triple [ key ] . replace ( / ^ _ : / , 'hg :' )
2429 }
2530 } )
2631 return triple
@@ -36,21 +41,37 @@ function filterTriple (triple) {
3641 return filtered
3742}
3843
39- function escape ( value ) {
44+ function escapeKeyValue ( value ) {
4045 if ( typeof value === 'string' || value instanceof String ) {
41- return value . replace ( / ( \\ | \ /) / g, '\\$& ' )
46+ return value . replace ( / ( \/ ) / g, '%2F ' )
4247 }
4348 return value
4449}
4550
46- function genKey ( key , triple ) {
47- var result = '/' + key
51+ function unescapeKeyValue ( value ) {
52+ return value . replace ( / % 2 F / g, '/' )
53+ }
54+
55+ function decodeKey ( key ) {
56+ const values = key . split ( '/' )
57+ if ( values . length < 4 ) throw new Error ( 'Key is not in triple form' )
58+ const order = values [ 0 ]
59+ const triple = { }
60+ for ( var i = 0 ; i < 3 ; i ++ ) {
61+ const k = tripleAliasMap [ order [ i ] ]
62+ triple [ k ] = unescapeKeyValue ( values [ i + 1 ] )
63+ }
64+ return triple
65+ }
66+
67+ function encodeKey ( key , triple ) {
68+ var result = key
4869 var def = defs [ key ]
4970 var i = 0
5071 var value = triple [ def [ i ] ]
5172 // need to handle this smarter
5273 while ( value ) {
53- result += '/' + escape ( value )
74+ result += '/' + escapeKeyValue ( value )
5475 i += 1
5576 value = triple [ def [ i ] ]
5677 }
@@ -60,17 +81,19 @@ function genKey (key, triple) {
6081 return result
6182}
6283
63- function genKeys ( triple ) {
64- return defKeys . map ( key => genKey ( key , triple ) )
84+ function encodeKeys ( triple ) {
85+ return defKeys . map ( key => encodeKey ( key , triple ) )
6586}
6687
6788function generateBatch ( triple , action ) {
89+ const namespacedTriple = namespaceBlankVariables ( triple )
6890 if ( ! action ) action = 'put'
69- var data = ( action === 'put' )
70- ? JSON . stringify ( namespaceBlankVariables ( triple ) )
71- : null
72- return genKeys ( triple ) . map ( key => ( {
73- type : 'put' , // no delete in hyperdb so just puting nulls
91+ var data = null
92+ if ( action === 'put' ) {
93+ data = JSON . stringify ( extraDataMask ( triple ) )
94+ }
95+ return encodeKeys ( namespacedTriple ) . map ( key => ( {
96+ type : 'put' , // no delete in hyperdb so just putting nulls
7497 key : key ,
7598 value : data
7699 } ) )
@@ -122,7 +145,7 @@ function createQuery (pattern, options) {
122145 var types = typesFromPattern ( pattern )
123146 var preferedIndex = options && options . index
124147 var index = findIndex ( types , preferedIndex )
125- var key = genKey ( index , pattern )
148+ var key = encodeKey ( index , pattern )
126149 return key
127150}
128151
@@ -134,10 +157,23 @@ function keyIsNotAObject (tripleKey) {
134157 return typeof tripleKey !== 'object'
135158}
136159
160+ function not ( fn ) {
161+ return ( ...args ) => ! fn ( ...args )
162+ }
163+
137164function keyIsAVariable ( tripleKey ) {
138165 return tripleKey instanceof Variable
139166}
140167
168+ function extraDataMask ( obj ) {
169+ return Object . keys ( obj )
170+ . filter ( not ( keyIsAVariable ) )
171+ . reduce ( ( prev , key ) => {
172+ prev [ key ] = obj [ key ]
173+ return prev
174+ } , { } )
175+ }
176+
141177function objectMask ( criteria , obj ) {
142178 return Object . keys ( obj )
143179 . filter ( hasKey )
@@ -157,6 +193,7 @@ function variableNames (obj) {
157193function queryMask ( object ) {
158194 return objectMask ( keyIsNotAObject , object )
159195} ;
196+
160197function variablesMask ( object ) {
161198 return objectMask ( keyIsAVariable , object )
162199} ;
@@ -203,11 +240,13 @@ function materializer (pattern, data) {
203240module . exports = {
204241 defs,
205242 defKeys,
206- genKey,
243+ encodeKey,
244+ decodeKey,
207245 filterTriple,
208246 collect,
209247 generateBatch,
210248 createQuery,
249+ extraDataMask,
211250 queryMask,
212251 variablesMask,
213252 variableNames,
0 commit comments