Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Solo nonetype collection test #10

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion builder/codegen.js
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ function generateEncodeCollectionKey (collection, sep) {

const accessors = toProps('record', collection.fullKey)
let str = ''
str += ' encodeKey (record) {\n'
str += ' encodeKey (record = {}) {\n'
str += ` const key = [${accessors.join(', ')}]\n`
str += ` return ${id + '_key'}.encode(key)\n`
str += ` }${sep}\n`
Expand Down
14 changes: 14 additions & 0 deletions test/basic.js
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,7 @@ test('none-type indexes', async function ({ create }, t) {
await db.insert('@db/members', { id: 'maf', age: 37 })
await db.insert('@db/members', { id: 'andrew', age: 34 })
await db.insert('@db/members', { id: 'anna', age: 32 })
await db.flush()

{
const result = await db.find('@db/members-by-age', { gte: { key: null, age: 33 }, lt: { key: null, age: 99 } }).toArray()
Expand All @@ -304,3 +305,16 @@ test('none-type indexes', async function ({ create }, t) {

await db.close()
})

test.solo('can do a get on a collection with a none-type key', async function ({ create }, t) {
const db = await create({ fixture: 3 })

await db.insert('@db/digest', { id: 'maf', age: 37 })
await db.flush()

const record = await db.get('@db/digest')
t.ok(record)
t.is(record.name, 'maf')

await db.close()
})
6 changes: 6 additions & 0 deletions test/fixtures/builders/3.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@ Hyperschema.toDisk(schema)
const db = HyperDB.from(SCHEMA_DIR, DB_DIR)
const testDb = db.namespace('db')

testDb.collections.register({
name: 'digest',
schema: '@db/member',
key: ['key']
})

testDb.collections.register({
name: 'members',
stats: true,
Expand Down
2 changes: 1 addition & 1 deletion test/fixtures/generated/1/hyperdb/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ const collection0 = {
name: '@db/members',
id: 0,
stats: false,
encodeKey (record) {
encodeKey (record = {}) {
const key = [record.id]
return collection0_key.encode(key)
},
Expand Down
4 changes: 2 additions & 2 deletions test/fixtures/generated/2/hyperdb/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ const collection0 = {
name: '@db/members',
id: 0,
stats: true,
encodeKey (record) {
encodeKey (record = {}) {
const key = [record.id]
return collection0_key.encode(key)
},
Expand Down Expand Up @@ -77,7 +77,7 @@ const collection1 = {
name: 'stats',
id: 1,
stats: false,
encodeKey (record) {
encodeKey (record = {}) {
const key = [record.id]
return collection1_key.encode(key)
},
Expand Down
20 changes: 17 additions & 3 deletions test/fixtures/generated/3/hyperdb/db.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,23 @@
"offset": 0,
"schema": [
{
"name": "members",
"name": "digest",
"namespace": "db",
"id": 0,
"stats": false,
"type": 1,
"indexes": [],
"schema": "@db/member",
"derived": false,
"key": [
"key"
],
"trigger": null
},
{
"name": "members",
"namespace": "db",
"id": 1,
"stats": true,
"type": 1,
"indexes": [
Expand All @@ -22,7 +36,7 @@
{
"name": "stats",
"namespace": null,
"id": 1,
"id": 2,
"stats": false,
"type": 1,
"indexes": [],
Expand All @@ -36,7 +50,7 @@
{
"name": "members-by-age",
"namespace": "db",
"id": 2,
"id": 3,
"stats": false,
"type": 2,
"collection": "@db/members",
Expand Down
150 changes: 99 additions & 51 deletions test/fixtures/generated/3/hyperdb/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,59 @@ const { IndexEncoder, c } = require('@holepunchto/hyperdb/runtime')

const { version, resolveStruct } = require('./messages.js')

// '@db/members' collection key
// '@db/digest' collection key
const collection0_key = new IndexEncoder([
IndexEncoder.NONE,
IndexEncoder.STRING
IndexEncoder.NONE
], { prefix: 0 })

function collection0_indexify (record) {
const a = record.key
return a === undefined ? [] : [a]
}

// '@db/digest' reconstruction function
function collection0_reconstruct (version, keyBuf, valueBuf) {
const key = collection0_key.decode(keyBuf)
const value = c.decode(resolveStruct('@db/digest/value', version), valueBuf)
// TODO: This should be fully code generated
return {
key: key[0],
...value
}
}

// '@db/digest'
const collection0 = {
name: '@db/digest',
id: 0,
stats: false,
encodeKey (record = {}) {
const key = [record.key]
return collection0_key.encode(key)
},
encodeKeyRange ({ gt, lt, gte, lte } = {}) {
return collection0_key.encodeRange({
gt: gt ? collection0_indexify(gt) : null,
lt: lt ? collection0_indexify(lt) : null,
gte: gte ? collection0_indexify(gte) : null,
lte: lte ? collection0_indexify(lte) : null
})
},
encodeValue (version, record) {
return c.encode(resolveStruct('@db/digest/value', version), record)
},
trigger: null,
reconstruct: collection0_reconstruct,
indexes: []
}

// '@db/members' collection key
const collection1_key = new IndexEncoder([
IndexEncoder.NONE,
IndexEncoder.STRING
], { prefix: 1 })

function collection1_indexify (record) {
const arr = []

arr.push(null)
Expand All @@ -24,8 +70,8 @@ function collection0_indexify (record) {
}

// '@db/members' reconstruction function
function collection0_reconstruct (version, keyBuf, valueBuf) {
const key = collection0_key.decode(keyBuf)
function collection1_reconstruct (version, keyBuf, valueBuf) {
const key = collection1_key.decode(keyBuf)
const value = c.decode(resolveStruct('@db/members/value', version), valueBuf)
// TODO: This should be fully code generated
return {
Expand All @@ -36,43 +82,43 @@ function collection0_reconstruct (version, keyBuf, valueBuf) {
}

// '@db/members'
const collection0 = {
const collection1 = {
name: '@db/members',
id: 0,
id: 1,
stats: true,
encodeKey (record) {
encodeKey (record = {}) {
const key = [record.key, record.id]
return collection0_key.encode(key)
return collection1_key.encode(key)
},
encodeKeyRange ({ gt, lt, gte, lte } = {}) {
return collection0_key.encodeRange({
gt: gt ? collection0_indexify(gt) : null,
lt: lt ? collection0_indexify(lt) : null,
gte: gte ? collection0_indexify(gte) : null,
lte: lte ? collection0_indexify(lte) : null
return collection1_key.encodeRange({
gt: gt ? collection1_indexify(gt) : null,
lt: lt ? collection1_indexify(lt) : null,
gte: gte ? collection1_indexify(gte) : null,
lte: lte ? collection1_indexify(lte) : null
})
},
encodeValue (version, record) {
return c.encode(resolveStruct('@db/members/value', version), record)
},
trigger: null,
reconstruct: collection0_reconstruct,
reconstruct: collection1_reconstruct,
indexes: []
}

// 'stats' collection key
const collection1_key = new IndexEncoder([
const collection2_key = new IndexEncoder([
IndexEncoder.UINT
], { prefix: 1 })
], { prefix: 2 })

function collection1_indexify (record) {
function collection2_indexify (record) {
const a = record.id
return a === undefined ? [] : [a]
}

// 'stats' reconstruction function
function collection1_reconstruct (version, keyBuf, valueBuf) {
const key = collection1_key.decode(keyBuf)
function collection2_reconstruct (version, keyBuf, valueBuf) {
const key = collection2_key.decode(keyBuf)
const value = c.decode(resolveStruct('stats/value', version), valueBuf)
// TODO: This should be fully code generated
return {
Expand All @@ -82,39 +128,39 @@ function collection1_reconstruct (version, keyBuf, valueBuf) {
}

// 'stats'
const collection1 = {
const collection2 = {
name: 'stats',
id: 1,
id: 2,
stats: false,
encodeKey (record) {
encodeKey (record = {}) {
const key = [record.id]
return collection1_key.encode(key)
return collection2_key.encode(key)
},
encodeKeyRange ({ gt, lt, gte, lte } = {}) {
return collection1_key.encodeRange({
gt: gt ? collection1_indexify(gt) : null,
lt: lt ? collection1_indexify(lt) : null,
gte: gte ? collection1_indexify(gte) : null,
lte: lte ? collection1_indexify(lte) : null
return collection2_key.encodeRange({
gt: gt ? collection2_indexify(gt) : null,
lt: lt ? collection2_indexify(lt) : null,
gte: gte ? collection2_indexify(gte) : null,
lte: lte ? collection2_indexify(lte) : null
})
},
encodeValue (version, record) {
return c.encode(resolveStruct('stats/value', version), record)
},
trigger: null,
reconstruct: collection1_reconstruct,
reconstruct: collection2_reconstruct,
indexes: []
}

// '@db/members-by-age' collection key
const index2_key = new IndexEncoder([
const index3_key = new IndexEncoder([
IndexEncoder.NONE,
IndexEncoder.UINT,
IndexEncoder.NONE,
IndexEncoder.STRING
], { prefix: 2 })
], { prefix: 3 })

function index2_indexify (record) {
function index3_indexify (record) {
const arr = []

arr.push(null)
Expand All @@ -133,55 +179,57 @@ function index2_indexify (record) {
}

// '@db/members-by-age'
const index2 = {
const index3 = {
name: '@db/members-by-age',
id: 2,
id: 3,
stats: false,
encodeKey (record) {
return index2_key.encode(index2_indexify(record))
return index3_key.encode(index3_indexify(record))
},
encodeKeyRange ({ gt, lt, gte, lte } = {}) {
return index2_key.encodeRange({
gt: gt ? index2_indexify(gt) : null,
lt: lt ? index2_indexify(lt) : null,
gte: gte ? index2_indexify(gte) : null,
lte: lte ? index2_indexify(lte) : null
return index3_key.encodeRange({
gt: gt ? index3_indexify(gt) : null,
lt: lt ? index3_indexify(lt) : null,
gte: gte ? index3_indexify(gte) : null,
lte: lte ? index3_indexify(lte) : null
})
},
encodeValue: (doc) => index2.collection.encodeKey(doc),
encodeValue: (doc) => index3.collection.encodeKey(doc),
encodeIndexKeys (record, context) {
return [index2_key.encode([record.key, record.age, record.key, record.id])]
return [index3_key.encode([record.key, record.age, record.key, record.id])]
},
reconstruct: (keyBuf, valueBuf) => valueBuf,
offset: collection0.indexes.length,
collection: collection0
offset: collection1.indexes.length,
collection: collection1
}
collection0.indexes.push(index2)
collection1.indexes.push(index3)

module.exports = {
version,
collections: [
collection0,
collection1
collection1,
collection2
],
indexes: [
index2
index3
],
resolveCollection,
resolveIndex
}

function resolveCollection (name) {
switch (name) {
case '@db/members': return collection0
case 'stats': return collection1
case '@db/digest': return collection0
case '@db/members': return collection1
case 'stats': return collection2
default: return null
}
}

function resolveIndex (name) {
switch (name) {
case '@db/members-by-age': return index2
case '@db/members-by-age': return index3
default: return null
}
}
Loading
Loading