{"_id":"foreign-key","_rev":"3513343","name":"foreign-key","description":"group and reduce rows for foreign key relations for sorted key-value stores like leveldb","dist-tags":{"latest":"0.1.0"},"maintainers":[{"name":"nopersonsmodules","email":"nopersonsmodules@gmail.com"}],"time":{"modified":"2024-08-27T20:32:55.000Z","created":"2013-08-10T11:34:52.875Z","0.1.0":"2013-08-19T06:12:59.732Z","0.0.1":"2013-08-19T06:03:04.061Z","0.0.0":"2013-08-10T11:34:52.875Z"},"users":{},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"repository":{"type":"git","url":"git://github.com/substack/foreign-key.git"},"versions":{"0.1.0":{"name":"foreign-key","version":"0.1.0","description":"group and reduce rows for foreign key relations for sorted key-value stores like leveldb","main":"index.js","dependencies":{"bytewise":"~0.5.0","inherits":"~2.0.0","readable-stream":"~1.0.15"},"devDependencies":{"tape":"~1.0.4","level-test":"~1.5.1","through":"~2.3.4"},"scripts":{"test":"tape test/*.js"},"repository":{"type":"git","url":"git://github.com/substack/foreign-key.git"},"homepage":"https://github.com/substack/foreign-key","keywords":["database","level","group","normal","form","denormalize","relational","sql"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT","readmeFilename":"readme.markdown","bugs":{"url":"https://github.com/substack/foreign-key/issues"},"_id":"foreign-key@0.1.0","dist":{"shasum":"3fd1228c0e2ac7ede17bde334d72bc8ced50f9f9","size":3555,"noattachment":false,"key":"/foreign-key/-/foreign-key-0.1.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/foreign-key/download/foreign-key-0.1.0.tgz"},"_from":".","_npmVersion":"1.3.7","_npmUser":{"name":"substack","email":"mail@substack.net"},"maintainers":[{"name":"nopersonsmodules","email":"nopersonsmodules@gmail.com"}],"directories":{},"publish_time":1376892779732,"_hasShrinkwrap":false,"_cnpm_publish_time":1376892779732,"_cnpmcore_publish_time":"2021-12-17T01:17:34.831Z"},"0.0.1":{"name":"foreign-key","version":"0.0.1","description":"group and reduce rows for foreign key relations for sorted key-value stores like leveldb","main":"index.js","dependencies":{"bytewise":"~0.5.0","inherits":"~2.0.0","readable-stream":"~1.0.15"},"devDependencies":{"tape":"~1.0.4","level-test":"~1.5.1","through":"~2.3.4"},"scripts":{"test":"tape test/*.js"},"repository":{"type":"git","url":"git://github.com/substack/foreign-key.git"},"homepage":"https://github.com/substack/foreign-key","keywords":["database","level","group","normal","form","denormalize","relational","sql"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT","readmeFilename":"readme.markdown","bugs":{"url":"https://github.com/substack/foreign-key/issues"},"_id":"foreign-key@0.0.1","dist":{"shasum":"6bec96cdeff1a129f76d044cca3e5fcd3e9fc1bf","size":2784,"noattachment":false,"key":"/foreign-key/-/foreign-key-0.0.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/foreign-key/download/foreign-key-0.0.1.tgz"},"_from":".","_npmVersion":"1.3.7","_npmUser":{"name":"substack","email":"mail@substack.net"},"maintainers":[{"name":"nopersonsmodules","email":"nopersonsmodules@gmail.com"}],"directories":{},"publish_time":1376892184061,"_hasShrinkwrap":false,"_cnpm_publish_time":1376892184061,"_cnpmcore_publish_time":"2021-12-17T01:17:35.077Z"},"0.0.0":{"name":"foreign-key","version":"0.0.0","description":"group and reduce rows for foreign key relations for sorted key-value stores like leveldb","main":"index.js","dependencies":{"bytewise":"~0.5.0","inherits":"~2.0.0","readable-stream":"~1.0.15"},"devDependencies":{"tape":"~1.0.4","level-test":"~1.5.1","through":"~2.3.4"},"scripts":{"test":"tape test/*.js"},"repository":{"type":"git","url":"git://github.com/substack/foreign-key.git"},"homepage":"https://github.com/substack/foreign-key","keywords":["database","level","group","normal","form","denormalize","relational","sql"],"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"license":"MIT","readmeFilename":"readme.markdown","bugs":{"url":"https://github.com/substack/foreign-key/issues"},"_id":"foreign-key@0.0.0","dist":{"shasum":"a0310138831d2e748e874c2882c7f0a830d1f58e","size":3475,"noattachment":false,"key":"/foreign-key/-/foreign-key-0.0.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/foreign-key/download/foreign-key-0.0.0.tgz"},"_from":".","_npmVersion":"1.3.7","_npmUser":{"name":"substack","email":"mail@substack.net"},"maintainers":[{"name":"nopersonsmodules","email":"nopersonsmodules@gmail.com"}],"directories":{},"publish_time":1376134492875,"_hasShrinkwrap":false,"_cnpm_publish_time":1376134492875,"_cnpmcore_publish_time":"2021-12-17T01:17:35.385Z"}},"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     { type: 'item', name: 'makerbot', 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: 'makerbot', 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","_attachments":{},"readmeFilename":"readme.markdown","homepage":"https://github.com/substack/foreign-key","bugs":{"url":"https://github.com/substack/foreign-key/issues"},"license":"MIT"}