Skip to content

Commit

Permalink
improve initialization
Browse files Browse the repository at this point in the history
  • Loading branch information
fergiemcdowall committed Aug 9, 2023
1 parent 26e69cc commit 5fdca45
Show file tree
Hide file tree
Showing 12 changed files with 242 additions and 301 deletions.
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
"name": "fergies-inverted-index",
"version": "12.0.0",
"description": "An inverted index that allows javascript objects to be easily serialised and retrieved using promises and map-reduce",
"browser": "src/browser.js",
"main": "src/node.js",
"browser": "src/entrypoints/browser.js",
"main": "src/entrypoints/node.js",
"dependencies": {
"browser-level": "1.0.1",
"charwise": "3.0.1",
Expand Down
12 changes: 0 additions & 12 deletions src/browser.js

This file was deleted.

11 changes: 11 additions & 0 deletions src/entrypoints/browser.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { BrowserLevel } from 'browser-level'
import { Main } from '../main.js'

export class InvertedIndex {
constructor (ops = {}) {
return new Main({
Level: BrowserLevel,
...ops
})
}
}
5 changes: 2 additions & 3 deletions src/node.js → src/entrypoints/node.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import levelOptions from './options.js'
import { Main } from './main.js'
import { ClassicLevel } from 'classic-level'
import { Main } from '../main.js'

export class InvertedIndex {
constructor (ops = {}) {
return new Main({
db: new ClassicLevel(ops.name || 'fii', levelOptions),
Level: ClassicLevel,
...ops
})
}
Expand Down
54 changes: 20 additions & 34 deletions src/main.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
// const read = require('./read.js')
// const write = require('./write.js')
// const levelOptions = require('./options.js')

import charwise from 'charwise'
import read from './read.js'
import write from './write.js'
import { TokenParser } from './parseToken.js'

// _match is nested by default so that AND and OR work correctly under
// the bonnet. Flatten array before presenting to consumer
Expand All @@ -27,33 +25,22 @@ const flattenMatchArrayInResults = results =>
return result
})

const initStore = (ops = {}) =>
new Promise((resolve, reject) => {
ops = Object.assign(
{
// TODO: is tokenAppens still needed?
// tokenAppend can be used to create 'comment' spaces in
// tokens. For example using '#' allows tokens like boom#1.00 to
// be retrieved by using "boom". If tokenAppend wasnt used, then
// {gte: 'boom', lte: 'boom'} would also return stuff like
// boomness#1.00 etc
// tokenAppend: '',
caseSensitive: true,
isLeaf: item => typeof item === 'string' || typeof item === 'number',
stopwords: [],
doNotIndexField: [],
storeVectors: true,
docExistsSpace: 'DOC' // field used to verify that doc exists
},
ops
)
const db = ops.db
db.open(err =>
err ? reject(err) : resolve(Object.assign(ops, { _db: db }))
)
})
const init = async (ops = {}) => {
ops = {
caseSensitive: true,
isLeaf: item => typeof item === 'string' || typeof item === 'number',
stopwords: [],
doNotIndexField: [],
storeVectors: true,
docExistsSpace: 'DOC', // the field used to verify that doc exists
db: await new ops.Level(ops.name, {
keyEncoding: charwise,
valueEncoding: 'json'
}),
tokenParser: new TokenParser(),
...ops
}

const makeAFii = ops => {
const r = read(ops)
const w = write(ops)

Expand All @@ -74,7 +61,6 @@ const makeAFii = ops => {
r.GET(tokens, pipeline).then(flattenMatchArrayInResults),
IMPORT: w.IMPORT,
LAST_UPDATED: r.LAST_UPDATED,
// LEVEL_OPTIONS: levelOptions,
MAX: r.MAX,
MIN: r.MIN,
NOT: (...keys) =>
Expand All @@ -87,14 +73,14 @@ const makeAFii = ops => {
.then(flattenMatchArrayInResults),
PUT: w.PUT,
SORT: r.SORT,
STORE: ops._db,
STORE: ops.db,
TIMESTAMP_LAST_UPDATED: w.TIMESTAMP_LAST_UPDATED,
parseToken: r.parseToken
TOKEN_PARSER: ops.tokenParser
}))
}

export class Main {
constructor (ops) {
return initStore(ops).then(makeAFii)
return init(ops)
}
}
6 changes: 0 additions & 6 deletions src/options.js

This file was deleted.

40 changes: 23 additions & 17 deletions src/parseToken.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,22 @@ charwise.HI = undefined
// key might be object or string like this
// <fieldname>:<value>. Turn key into json object that is of the
// format {FIELD: ..., VALUE: {GTE: ..., LTE ...}}
// module.exports = (token, availableFields) =>
export default function (token, availableFields) {
return new Promise((resolve, reject) => {
export class TokenParser {
constructor (availableFields = []) {
this.setAvailableFields(availableFields)
}

setAvailableFields (availableFields) {
this.availableFields = availableFields
}

parse (token) {
// case: <value>
// case: <FIELD>:<VALUE>
// case: undefined

if (Array.isArray(token)) {
return reject(new Error('token cannot be Array'))
throw new Error('token cannot be Array')
}

if (typeof token === 'undefined') token = {}
Expand All @@ -23,23 +30,23 @@ export default function (token, availableFields) {
// a part of the value. This accounts for occasions where the value itself
// has a ':'.
if (token.indexOf(':') === -1) {
return resolve({
FIELD: availableFields,
return {
FIELD: this.availableFields,
VALUE: {
GTE: token,
LTE: token
}
})
}
}

const [field, ...value] = token.split(':')
return resolve({
return {
FIELD: [field],
VALUE: {
GTE: value.join(':'),
LTE: value.join(':')
}
})
}
}

if (typeof token === 'number') {
Expand All @@ -51,7 +58,7 @@ export default function (token, availableFields) {
}
}

// else not string so assume Object
// else not string or number so assume Object
// {
// FIELD: [ fields ],
// VALUE: {
Expand Down Expand Up @@ -96,15 +103,14 @@ export default function (token, availableFields) {

// parse object FIELD
if (typeof token.FIELD === 'undefined') {
return resolve(
Object.assign(token, {
FIELD: availableFields
})
)
return {
FIELD: this.availableFields,
...token
}
}
// Allow FIELD to be an array or a string
token.FIELD = [token.FIELD].flat()

return resolve(token)
})
return token
}
}
Loading

0 comments on commit 5fdca45

Please sign in to comment.