{"bugs":{"url":"https://github.com/substack/foreign-key/issues"},"dist":{"shasum":"6bec96cdeff1a129f76d044cca3e5fcd3e9fc1bf","tarball":"https://registry.npmjs.org/foreign-key/-/foreign-key-0.0.1.tgz","integrity":"sha512-OxNXjc/nyTq/4ZT/OcnK5zHeYOGsZh5jZ130PCqImA7KNQsAXebFkWScq4pF4sDrg+DmYM5OOCXF6JI29ilc/g==","signatures":[{"sig":"MEUCIQDVf1ycwlsd4NqxFOa9JbnUAc/PusxXactC4wcN2OIfYgIgPjo/XRakklrshK4thSbxb3iMtfTQRbV5I9zmKM+8PhE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.js","name":"foreign-key","_from":".","author":{"url":"http://substack.net","name":"James Halliday","email":"mail@substack.net"},"readme":"# foreign-key\n\ngenerate keys for [sorted key-value stores](https://npmjs.org/package/level)\nto group and reduce rows by a foreign key\n\n[![build status](https://secure.travis-ci.org/substack/foreign-key.png)](http://travis-ci.org/substack/foreign-key)\n\n# example\n\nGiven some data about hackerspaces, hackers, and items:\n\n``` json\n[\n  { \"type\": \"hackerspace\", \"name\": \"sudoroom\" },\n  { \"type\": \"hacker\", \"name\": \"substack\", \"space\": \"sudoroom\"},\n  { \"type\": \"hackerspace\", \"name\": \"noisebridge\" },\n  { \"type\": \"hacker\", \"name\": \"mitch\", \"space\": \"nosiebridge\" },\n  { \"type\": \"item\", \"name\": \"3d printer\", \"space\": \"sudoroom\" },\n  { \"type\": \"item\", \"name\": \"piano\", \"space\": \"sudoroom\" },\n  { \"type\": \"hacker\", \"name\": \"mk30\", \"space\": \"sudoroom\" },\n  { \"type\": \"hacker\", \"name\": \"rwolfe\", \"space\": \"i3\" },\n  { \"type\": \"item\", \"name\": \"3d printer\", \"space\": \"noisebridge\" },\n  { \"type\": \"hacker\", \"name\": \"ioerror\", \"space\": \"noisebridge\" },\n  { \"type\": \"hacker\", \"name\": \"wrought\", \"space\": \"sudoroom\" },\n  { \"type\": \"hacker\", \"name\": \"nbritsky\", \"space\": \"i3\" },\n  { \"type\": \"item\", \"name\": \"laser cutter\", \"space\": \"noisebridge\" },\n  { \"type\": \"hackerspace\", \"name\": \"i3\" }\n]\n```\n\nwe can generate key names to efficiently group hackers and items with their\nhackerspace using `\"space\"` as a foreign key refering to the `\"name\"` of a\nhackerspace:\n\n``` js\nvar through = require('through');\nvar foreign = require('foreign-key');\n\nvar g = foreign([ 'type', 'hackerspace' ]);\ng.add('hackers', [ 'type', 'hacker' ], 'space');\ng.add('equipment', [ 'type', 'item' ], 'space');\n\nvar db = require('level')('/tmp/foreign-test', { valueEncoding: 'json' });\ndb.batch(require('./hackers.json').map(function (row) {\n    return { type: 'put', key: g.key(row.name, row), value: row };\n}));\n\ndb.createReadStream()\n    .pipe(g.createStream())\n    .pipe(through(console.log))\n;\n```\n\noutput:\n\n```\n{ type: 'hackerspace',\n  name: 'i3',\n  hackers: \n   [ { type: 'hacker', name: 'nbritsky', space: 'i3' },\n     { type: 'hacker', name: 'rwolfe', space: 'i3' } ] }\n{ type: 'hackerspace',\n  name: 'noisebridge',\n  equipment: \n   [ { type: 'item', name: '3d printer', space: 'noisebridge' },\n     { type: 'item', name: 'laser cutter', space: 'noisebridge' } ],\n  hackers: \n   [ { type: 'hacker', name: 'ioerror', space: 'noisebridge' },\n     { type: 'hacker', name: 'mitch', space: 'nosiebridge' } ] }\n{ type: 'hackerspace',\n  name: 'sudoroom',\n  equipment: \n   [ { type: 'item', name: '3d printer', space: 'sudoroom' },\n     { type: 'item', name: 'piano', space: 'sudoroom' } ],\n  hackers: \n   [ { type: 'hacker', name: 'mk30', space: 'sudoroom' },\n     { type: 'hacker', name: 'substack', space: 'sudoroom' },\n     { type: 'hacker', name: 'wrought', space: 'sudoroom' } ] }\n```\n\n# methods\n\n``` js\nvar foreign = require('foreign-key')\n```\n\n## var g = foreign(primaryFilter)\n\nCreate a new foreign key instance `g` that pivots on the rows matching\n`primaryFilter`.\n\n## g.add(targetKey, filter, foreignKey)\n\nInsert rows matching `filter` into rows matching `primaryFilter` at the location\ninto primary rows `targetKey`.\n\n## g.key(key, row)\n\nReturn the new key to use for the ordinary unique identifier `key` given the\nforeign key rules applicable to `row`.\n\n## g.createStream()\n\nCreate a through stream that takes row objects as input and combines results\nfrom added secondary rows into primary rows.\n\n# install\n\nWith [npm](https://npmjs.org) do:\n\n```\nnpm install foreign-key\n```\n\n# license\n\nMIT\n","license":"MIT","scripts":{"test":"tape test/*.js"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"homepage":"https://github.com/substack/foreign-key","keywords":["database","level","group","normal","form","denormalize","relational","sql"],"repository":{"url":"git://github.com/substack/foreign-key.git","type":"git"},"_npmVersion":"1.3.7","description":"group and reduce rows for foreign key relations for sorted key-value stores like leveldb","directories":{},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"dependencies":{"bytewise":"~0.5.0","inherits":"~2.0.0","readable-stream":"~1.0.15"},"readmeFilename":"readme.markdown","devDependencies":{"tape":"~1.0.4","through":"~2.3.4","level-test":"~1.5.1"},"_id":"foreign-key@0.0.1","version":"0.0.1"}