Skip to content

Commit

Permalink
Fix downstream graph indexing bug
Browse files Browse the repository at this point in the history
  • Loading branch information
dan-f committed May 24, 2017
1 parent 6606dcd commit 8144384
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 9 deletions.
15 changes: 8 additions & 7 deletions src/rdf/graph.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import Immutable from 'immutable'

import { GraphError } from '../errors'
import { Node, nodeSet } from './node'
import { nodeSet } from './node'
import { immutableHashCode } from '../util'

/**
* Provides functionality for dealing with RDF graphs.
Expand Down Expand Up @@ -43,13 +44,13 @@ class Graph {
let poIndex = Immutable.Map()
let pogIndex = Immutable.Map()
for (let { subject, predicate, object, graph } of quads) {
spIndex = spIndex.update(Immutable.List([ subject, predicate ]), nodes =>
spIndex = spIndex.update(immutableHashCode(subject, predicate), nodes =>
nodes ? nodes.add(object) : nodeSet([object])
)
poIndex = poIndex.update(Immutable.List([ predicate, object ]), nodes =>
poIndex = poIndex.update(immutableHashCode(predicate, object), nodes =>
nodes ? nodes.add(subject) : nodeSet([subject])
)
pogIndex = pogIndex.update(Immutable.List([ predicate, object, graph ]), nodes =>
pogIndex = pogIndex.update(immutableHashCode(predicate, object, graph), nodes =>
nodes ? nodes.add(subject) : nodeSet([subject])
)
}
Expand All @@ -69,13 +70,13 @@ class Graph {
*/
match ({ subject, predicate, object, graph }) {
if (subject && predicate) {
return this.spIndex.get(Immutable.List([ subject, predicate ])) || nodeSet([])
return this.spIndex.get(immutableHashCode(subject, predicate), nodeSet([]))
}
if (predicate && object && !graph) {
return this.poIndex.get(Immutable.List([ predicate, object ])) || nodeSet([])
return this.poIndex.get(immutableHashCode(predicate, object), nodeSet([]))
}
if (predicate && object && graph) {
return this.pogIndex.get(Immutable.List([ predicate, object, graph ])) || nodeSet([])
return this.pogIndex.get(immutableHashCode(predicate, object, graph), nodeSet([]))
}
throw new GraphError(
'Unsupported graph match. ' +
Expand Down
4 changes: 4 additions & 0 deletions src/util.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import Immutable from 'immutable'

/**
* Iterates over key, value pairs in an object
* @param {Object} obj
Expand All @@ -8,3 +10,5 @@ export function * iterObj (obj) {
yield [k, obj[k]]
}
}

export const immutableHashCode = (...vals) => Immutable.List(vals).hashCode()
4 changes: 2 additions & 2 deletions test/setup.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import chai from 'chai'
import chaiAsPromised from 'chai-as-promised'
import chaiImmutable from 'chai-immutable'
import Immutable from 'immutable'
import sinonChai from 'sinon-chai'

import { AST } from '../src/lang/ast'
import { Node, nodeSet } from '../src/rdf/node'
import { immutableHashCode } from '../src/util'

global.expect = chai.expect

Expand Down Expand Up @@ -103,7 +103,7 @@ chai.use((_chai, utils) => {
})

Assertion.addMethod('map', function (...list) {
utils.flag(this, 'indexKey', Immutable.List(list))
utils.flag(this, 'indexKey', immutableHashCode(...list))
})

Assertion.addMethod('nodes', function (nodes) {
Expand Down

0 comments on commit 8144384

Please sign in to comment.