@dstanesc/o-o-o-o-o-o-o
Version:
O-O-O-O-O-O-O is a collection of content addressed persistent data structures
165 lines • 7.45 kB
JavaScript
var __asyncValues = (this && this.__asyncValues) || function (o) {
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
var m = o[Symbol.asyncIterator], i;
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
};
import { protoGremlinFactory } from '../api/proto-gremlin';
import { compute_chunks } from '@dstanesc/wasm-chunking-fastcdc-node';
import { chunkerFactory } from '../chunking';
import { memoryBlockStoreFactory, } from '../block-store';
import { create as ipfsApi } from 'ipfs-http-client';
import { blockStore as ipfsBlockStore } from '@dstanesc/ipfs-block-store';
import { linkCodecFactory, valueCodecFactory, } from '../codecs';
import { eq } from '../ops';
import * as assert from 'assert';
import { versionStoreFactory } from '../version-store';
import { stagingBlockStoreFactory, } from '../block-store-staging';
var ObjectTypes;
(function (ObjectTypes) {
ObjectTypes[ObjectTypes["ROOT"] = 1] = "ROOT";
ObjectTypes[ObjectTypes["BOOK"] = 2] = "BOOK";
ObjectTypes[ObjectTypes["CHAPTER"] = 3] = "CHAPTER";
ObjectTypes[ObjectTypes["VERSE"] = 4] = "VERSE";
})(ObjectTypes || (ObjectTypes = {}));
var RlshpTypes;
(function (RlshpTypes) {
RlshpTypes[RlshpTypes["book"] = 1] = "book";
RlshpTypes[RlshpTypes["chapter"] = 2] = "chapter";
RlshpTypes[RlshpTypes["verse"] = 3] = "verse";
})(RlshpTypes || (RlshpTypes = {}));
var KeyTypes;
(function (KeyTypes) {
KeyTypes[KeyTypes["ID"] = 1] = "ID";
KeyTypes[KeyTypes["NAME"] = 2] = "NAME";
KeyTypes[KeyTypes["TEXT"] = 3] = "TEXT";
})(KeyTypes || (KeyTypes = {}));
async function queryVerse(g, rootOffset, book, chapter, verse) {
var _a, e_1, _b, _c;
const vr = [];
const startTime = new Date().getTime();
try {
for (var _d = true, _e = __asyncValues(g
.V([rootOffset])
.out(RlshpTypes.book)
.has(ObjectTypes.BOOK, { keyType: KeyTypes.ID, operation: eq(book) })
.out(RlshpTypes.chapter)
.has(ObjectTypes.CHAPTER, {
keyType: KeyTypes.ID,
operation: eq(chapter),
})
.out(RlshpTypes.verse)
.has(ObjectTypes.VERSE, { keyType: KeyTypes.ID, operation: eq(verse) })
.values(KeyTypes.TEXT)
.maxResults(1)
.exec()), _f; _f = await _e.next(), _a = _f.done, !_a;) {
_c = _f.value;
_d = false;
try {
const result = _c;
vr.push(result);
}
finally {
_d = true;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (!_d && !_a && (_b = _e.return)) await _b.call(_e);
}
finally { if (e_1) throw e_1.error; }
}
const endTime = new Date().getTime();
const time = endTime - startTime;
console.log(`Query Time ${time} ms`);
return { result: vr[0].value, time };
}
describe('IPFS block-store', function () {
describe('Query ', function () {
test('bible quick scan, retrieve verse - Gen 1 1', async () => {
const cache = {};
const ipfs = ipfsApi({ url: process.env.IPFS_API }); // eg. /ip4/192.168.1.231/tcp/5001
const { chunk } = chunkerFactory(1024 * 48, compute_chunks);
const linkCodec = linkCodecFactory();
const valueCodec = valueCodecFactory();
const blockStore = ipfsBlockStore({ cache, ipfs });
const versionRoot = linkCodec.parseString('bafkreiegljjns2rqb3z5mtdyvq2u6u2cvsahyez6bqsdjibo6737vrqhbi');
const versionStore = await versionStoreFactory({
versionRoot,
chunk,
linkCodec,
valueCodec,
blockStore,
});
const g = protoGremlinFactory({
chunk,
linkCodec,
valueCodec,
blockStore,
versionStore,
}).g();
const { result, time } = await queryVerse(g, 0, 'Gen', 1, 1);
assert.strictEqual(result, 'In the beginning God created the heaven and the earth.');
assert.ok(time < 300); // 300 ms
});
test('bible full scan, retrieve verse - Rev 22 21', async () => {
const cache = {};
const ipfs = ipfsApi({ url: process.env.IPFS_API }); // eg. /ip4/192.168.1.231/tcp/5001
const { chunk } = chunkerFactory(1024 * 48, compute_chunks);
const linkCodec = linkCodecFactory();
const valueCodec = valueCodecFactory();
const blockStore = ipfsBlockStore({ cache, ipfs });
const versionRoot = linkCodec.parseString('bafkreiegljjns2rqb3z5mtdyvq2u6u2cvsahyez6bqsdjibo6737vrqhbi');
const versionStore = await versionStoreFactory({
versionRoot,
chunk,
linkCodec,
valueCodec,
blockStore,
});
const g = protoGremlinFactory({
chunk,
linkCodec,
valueCodec,
blockStore,
versionStore,
}).g();
const { result, time } = await queryVerse(g, 0, 'Rev', 22, 21);
assert.strictEqual(result, 'The grace of our Lord Jesus Christ be with you all. Amen.');
assert.ok(time < 3000); // 3sec
});
test('bible full scan, preload, retrieve verse - Rev 22 21', async () => {
const cache = {};
const ipfs = ipfsApi({ url: process.env.IPFS_API }); // eg. /ip4/192.168.1.231/tcp/5001
const { chunk } = chunkerFactory(1024 * 48, compute_chunks);
const linkCodec = linkCodecFactory();
const valueCodec = valueCodecFactory();
const actualBlockStore = ipfsBlockStore({ cache, ipfs });
const memoryBlockStore = memoryBlockStoreFactory();
const stagingBlockStore = stagingBlockStoreFactory(linkCodec, memoryBlockStore);
const versionRoot = linkCodec.parseString('bafkreiegljjns2rqb3z5mtdyvq2u6u2cvsahyez6bqsdjibo6737vrqhbi');
await stagingBlockStore.loadVersion(versionRoot, actualBlockStore);
const versionStore = await versionStoreFactory({
versionRoot,
chunk,
linkCodec,
valueCodec,
blockStore: stagingBlockStore,
});
const g = protoGremlinFactory({
chunk,
linkCodec,
valueCodec,
blockStore: stagingBlockStore,
versionStore,
}).g();
const { result, time } = await queryVerse(g, 0, 'Rev', 22, 21);
assert.strictEqual(result, 'The grace of our Lord Jesus Christ be with you all. Amen.');
assert.ok(time < 3000); // 3sec
});
});
});
//# sourceMappingURL=ipfs.test.js.map