{"bugs":{"url":"https://github.com/substack/foreign-key/issues"},"dist":{"shasum":"3fd1228c0e2ac7ede17bde334d72bc8ced50f9f9","tarball":"https://registry.npmjs.org/foreign-key/-/foreign-key-0.1.0.tgz","integrity":"sha512-BiPJ8/+EvGf2p33qfEbQ4/8dphzdfkzvNHNFikQY+JACQNV4PKl+9LcrZft4J533mtx9IMUbJCOkh0LqMpa2Kw==","signatures":[{"sig":"MEUCIAjbZZTbGLlBRp8cqvlPdgYw/Gt4yVsTUtsclaNvWObbAiEA5HPR6umPD0E3SAN/y+vu9f2New+llshy9bSIYY5xdqA=","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.keyList(key, row)\n\nReturn the array of elements that `g.key()` passes to\n[`bytewise.encode()`](https://npmjs.org/package/bytewise).\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.1.0","version":"0.1.0"}