Haro es un almacén de datos inmutable moderno construido con características de ES6. No se opina y ofrece una solución de "plug-and-play" para modelar, buscar y administrar datos en el cliente o servidor (en RAM). Es una estructura de datos parcialmente persistente, manteniendo conjuntos de versiones de registros en versions (MVCC).
Todos los métodos son sincrónicos.
Los índices HARO tienen el siguiente Map (field/property) > Map (value) > Set (PKs) que permiten una búsqueda rápida y fácil, así como la inspección. Los índices se pueden administrar independientemente de las operaciones del() y set() , por ejemplo, puede crear perezosamente nuevos índices a través de reindex(field) o sortBy(field) .
Haro tiene una cobertura de código al 100% con sus pruebas.
----------|---------|----------|---------|---------|-------------------------------------------------------------------------------------------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------------------------------------------------------------------------------------------
All files | 100 | 83.56 | 100 | 100 |
haro.cjs | 100 | 83.56 | 100 | 100 | 49-75,108,163-175,192,224-228,242,264,266,274,308,326,353-354,359-361,375-378,380,437,475,482,486-496
----------|---------|----------|---------|---------|------------------------------------------------------------------------------------------------------- La exportación nombrada es haro , y la clase nombrada exportada es Haro .
import { haro } from 'haro' ; const { haro } = require ( 'haro' ) ; Haro toma dos argumentos opcionales, el primero es una Array de registros para establecer asíncronamente, y el segundo es un descriptor de configuración.
const storeDefaults = haro ( ) ;
const storeRecords = haro ( [ { name : 'John Doe' , age : 30 } , { name : 'Jane Doe' , age : 28 } ] ) ;
const storeCustom = haro ( null , { key : 'id' } ) ; const store = haro ( null , { index : [ 'name' , 'age' ] } ) ,
data = [ { name : 'John Doe' , age : 30 } , { name : 'Jane Doe' , age : 28 } ] ;
const records = store . batch ( data , 'set' ) ;
console . log ( records [ 0 ] ) ; // [$uuid, {name: 'John Doe', age: 30}]
console . log ( store . size ) ; // 2
console . log ( store . find ( { age : 28 } ) ) ; // [[$uuid, {name: 'Jane Doe', age: 28}]]
console . log ( store . search ( / ^ja / i , 'name' ) ) ; // [[$uuid, {name: 'Jane Doe', age: 28}]]
console . log ( store . search ( arg => age < 30 , 'age' ) ) ; // [[$uuid, {name: 'Jane Doe', age: 28}]] const store = haro ( ) ;
let arg ;
arg = store . set ( null , { abc : true } ) ;
arg = store . set ( arg [ 0 ] , { abc : false } ) ;
arg = store . set ( arg [ 0 ] , { abc : true } ) ;
store . versions . get ( arg [ 0 ] ) . forEach ( i => console . log ( i [ 0 ] ) ) ; // {abc: true}, {abc: false} Se incluye un punto de referencia en el repositorio, y es útil para medir cómo Haro funcionará en diferentes hardware y software.
time to batch insert data: 6.7825 ms
datastore record count: 1000
name indexes: 1000
testing time to 'find()' a record (first one is cold):
0.063375ms
0.004583ms
0.002417ms
0.003459ms
0.001916ms
testing time to 'search(regex, index)' for a record (first one is cold):
0.147792ms
0.051209ms
0.050958ms
0.051125ms
0.052166ms
time to override data: 0.361709 ms
testing time to 'search(regex, index)' on overridden data for a record (first one is cold):
0.053083ms
0.051916ms
0.027459ms
0.0275ms
0.032292ms
Función
Oyente de eventos para antes de una operación por lotes, recibe type , data .
Función
Oyente de eventos para antes de limpiar el almacén de datos.
Función
El oyente de eventos para antes de que se elimine un disco, recibe key , batch .
Función
El oyente de eventos para antes de que se establezca un registro, recibe data key .
Formación
Matriz de valores al índice. Los índices compuestos son compatibles, utilizando el delimitador predeterminado ( this.delimiter ). Los no coincidentes dentro de los compuestos dan como resultado valores en blanco.
Ejemplo de campos/propiedades para índice:
const store = haro ( null , { index : [ 'field1' , 'field2' , 'field1|field2|field3' ] } ) ;Cadena
Clave Object opcional Para utilizar como tecla Map , predeterminada a un UUID de la versión 4 si no se especifica o se encuentra.
Ejemplo de especificar la clave primaria:
const store = haro ( null , { key : 'field' } ) ;Booleano
Registros de mensajes de almacenamiento persistentes en console , el valor predeterminado es true .
Función
Oyente de eventos para una operación por lotes, recibe dos argumentos ['tipo', Array ].
Función
Oyente de eventos para limpiar el almacén de datos.
Función
El oyente de eventos para cuando se elimina un disco, recibe la clave de registro.
Función
Oyente de eventos para cuando el almacén de datos cambia el conjunto de datos completo, recibe una String que nombra lo que cambió ( indexes o records ).
Función
El oyente de eventos para cuando se establece un disco, recibe una Array .
Booleano
Habilitar/deshabilitar el versiones de estilo MVCC de registros, el valor predeterminado es false . Las versiones se almacenan en Sets para una fácil iteración.
Ejemplo de habilitación de versiones:
const store = haro ( null , { versioning : true } ) ; Mapa
Map de registros, actualizado por del() y set() .
Mapa
Mapa de índices, que son conjuntos que contienen claves de mapa.
Formación
Matriz que representa el orden de this.data .
Número
Número de registros en el almacén de datos.
Mapa
Map de Sets de registros, actualizado por set() .
Formación
El primer argumento debe ser una Array , y el segundo argumento debe ser del o set .
const haro = require ( 'haro' ) ,
store = haro ( null , { key : 'id' , index : [ 'name' ] } ) ,
nth = 100 ,
data = [ ] ;
let i = - 1 ;
while ( ++ i < nth ) {
data . push ( { id : i , name : 'John Doe' + i } ) ;
}
// records is an Array of Arrays
const records = store . batch ( data , 'set' ) ;ser
Elimina todos los pares de clave/valor del almacén de datos.
Ejemplo de claro un almacén de datos:
const store = haro ( ) ;
// Data is added
store . clear ( ) ;Indefinido
Elimina el registro.
Ejemplo de eliminar un registro:
const store = haro ( ) ,
rec = store . set ( null , { abc : true } ) ;
store . del ( rec [ 0 ] ) ;
console . log ( store . size ) ; // 0Matriz u objeto
Devuelve los registros o índices del almacén de datos como Array u Object mutable, para la intención de reutilizar/almacenamiento persistente sin depender de un adaptador que rompa el conjunto de datos.
const store = haro ( ) ;
// Data is loaded
const records = store . dump ( ) ;
const indexes = store . dump ( 'indexes' ) ;
// Save records & indexesMapiterador
Devuelve un nuevo objeto Iterator que contiene una matriz de [key, value] para cada elemento en el objeto Map en orden de inserción.
Ejemplo de eliminar un registro:
const store = haro ( ) ;
let item , iterator ;
// Data is added
iterator = store . entries ( ) ;
item = iterator . next ( ) ;
do {
console . log ( item . value ) ;
item = iterator . next ( ) ;
} while ( ! item . done ) ;Formación
Devuelve una Array de Arrays dobles con la forma [key, value] para registros que volvieron true a callbackFn(value, key) .
Ejemplo de filtrar un almacén de datos:
const store = haro ( ) ;
// Data is added
store . filter ( function ( value ) {
return value . something === true ;
} ) ;Formación
Devuelve una Array de Arrays dobles con valores indexados que coinciden con el where .
Ejemplo de encontrar un registro (s) con una coincidencia de identidad:
const store = haro ( null , { index : [ 'field1' ] } ) ;
// Data is added
store . find ( { field1 : 'some value' } ) ;Indefinido
Llama callbackFn una vez para cada par de valores clave presente en el objeto Map , en orden de inserción. Si se proporciona un parámetro thisArg forEach , se utilizará como this valor para cada devolución de llamada.
Ejemplo de eliminar un registro:
const store = haro ( ) ;
store . set ( null , { abc : true } ) ;
store . forEach ( function ( value , key ) {
console . log ( key ) ;
} ) ;Formación
Obtiene el registro como una Array doble con la forma [key, value] .
Ejemplo de obtener un registro con un valor clave principal conocido:
const store = haro ( ) ;
// Data is added
store . get ( 'keyValue' ) ;Booleano
Devuelve un Boolean que indica si el almacén de datos contiene key .
Ejemplo de verificación para un registro con un valor clave principal conocido:
const store = haro ( ) ;
// Data is added
store . has ( 'keyValue' ) ; // true or falseMapiterador
Devuelve un nuevo objeto Iterator que contiene las teclas para cada elemento en el objeto Map en orden de inserción.
Ejemplo de obtener un iterador y registrar los resultados:
const store = haro ( ) ;
let item , iterator ;
// Data is added
iterator = store . keys ( ) ;
item = iterator . next ( ) ;
do {
console . log ( item . value ) ;
item = iterator . next ( ) ;
} while ( ! item . done ) ;Formación
Devuelve una Array de Arrays dobles con la forma [key, value] para el rango de registros correspondiente.
Ejemplo de paginar un conjunto de datos:
const store = haro ( ) ;
let ds1 , ds2 ;
// Data is added
console . log ( store . size ) ; // >10
ds1 = store . limit ( 0 , 10 ) ; // [0-9]
ds2 = store . limit ( 10 , 10 ) ; // [10-19]
console . log ( ds1 . length === ds2 . length ) ; // true
console . log ( JSON . stringify ( ds1 [ 0 ] [ 1 ] ) === JSON . stringify ( ds2 [ 0 ] [ 1 ] ) ) ; // falseFormación
Devuelve una Array de las devoluciones de callbackFn(value, key) . Si raw es true se devuelve una Array .
Ejemplo de mapeo de un almacén de datos:
const store = haro ( ) ;
// Data is added
store . map ( function ( value ) {
return value . property ;
} ) ;Booleano
Esto está destinado a usarse en una anulación emparejada de los índices y registros, de modo que puede evitar la ruta de código basada en Promise de un batch() inserto o load() . Acepta un tercer parámetro opcional para realizar la transformación para simplificar los problemas de dominio cruzado.
Ejemplo de anulación de un almacén de datos:
const store = haro ( ) ;
store . override ( { 'field' : { 'value' : [ 'pk' ] } } , "indexes" ) ;Formación
Ejecuta una función inspirada Array.reduce() contra el almacén de datos ( Map ).
Ejemplo de filtrar un almacén de datos:
const store = haro ( ) ;
// Data is added
store . reduce ( function ( accumulator , value , key ) {
accumulator [ key ] = value ;
return accumulator ;
} , { } ) ;Aro
Vuelva a indicar el almacén de datos, para llamarse si cambia el valor del index .
Ejemplo de mapeo de un almacén de datos:
const store = haro ( ) ;
// Data is added
// Creating a late index
store . reindex ( 'field3' ) ;
// Recreating indexes, this should only happen if the store is out of sync caused by developer code.
store . reindex ( ) ;Formación
Devuelve una Array de Arrays dobles con la forma [key, value] de registros encontrados coincidentes arg . Si arg es una Function (los parámetros son value e index ) se realiza una coincidencia si el resultado es true , si arg es una RegExp el valor de campo debe .test() como true , de lo contrario, el valor debe ser una coincidencia de identidad. El parámetro index puede ser una String o Array de Strings ; Si no se suministra, es predeterminado a this.index .
Arrays indexadas que se prueban con un RegExp serán tratados como una String delimitada de coma, por ejemplo, ['hockey', 'football'] se convierte en 'hockey, football' para el RegExp .
Ejemplo de búsqueda con una función de predicado:
const store = haro ( null , { index : [ 'name' , 'age' ] } ) ,
data = [ { name : 'John Doe' , age : 30 } , { name : 'Jane Doe' , age : 28 } ] ;
store . batch ( data , 'set' )
console . log ( store . search ( function ( age ) {
return age < 30 ;
} , 'age' ) ) ; // [[$uuid, {name: 'Jane Doe', age: 28}]]Objeto
Grabar en el almacén de datos. Si key es false se generará un UUID de la versión 4.
Si override es true , el registro existente será reemplazado en lugar de enmendarse.
Ejemplo de creación de un registro:
const store = haro ( null , { key : 'id' } ) ,
record = store . set ( null , { id : 1 , name : 'John Doe' } ) ;
console . log ( record ) ; // [1, {id: 1, name: 'Jane Doe'}]Formación
Devuelve una matriz del almacén de datos, ordenado por callbackFn .
Ejemplo de clasificación como una Array :
const store = haro ( null , { index : [ 'name' , 'age' ] } ) ,
data = [ { name : 'John Doe' , age : 30 } , { name : 'Jane Doe' , age : 28 } ] ;
store . batch ( data , 'set' )
console . log ( store . sort ( ( a , b ) => a < b ? - 1 : ( a > b ? 1 : 0 ) ) ) ; // [{name: 'Jane Doe', age: 28}, {name: 'John Doe', age: 30}]Formación
Devuelve una Array de Arrays dobles con la forma [key, value] de registros ordenados por un índice.
Ejemplo de clasificación por un índice:
const store = haro ( null , { index : [ 'name' , 'age' ] } ) ,
data = [ { name : 'John Doe' , age : 30 } , { name : 'Jane Doe' , age : 28 } ] ;
store . batch ( data , 'set' )
console . log ( store . sortBy ( 'age' ) ) ; // [[$uuid, {name: 'Jane Doe', age: 28}], [$uuid, {name: 'John Doe', age: 30}]]Formación
Devuelve una matriz del almacén de datos.
Ejemplo de fundición a una Array :
const store = haro ( ) ,
data = [ { name : 'John Doe' , age : 30 } , { name : 'Jane Doe' , age : 28 } ] ;
store . batch ( data , 'set' )
console . log ( store . toArray ( ) ) ; // [{name: 'John Doe', age: 30}, {name: 'Jane Doe', age: 28}]Mapiterador
Devuelve un nuevo objeto Iterator que contiene los valores para cada elemento en el objeto Map en orden de inserción.
Ejemplo de iteración de los valores:
const store = haro ( ) ,
data = [ { name : 'John Doe' , age : 30 } , { name : 'Jane Doe' , age : 28 } ] ;
store . batch ( data , 'set' )
const iterator = store . values ( ) ;
let item = iterator . next ( ) ;
while ( ! item . done ) {
console . log ( item . value ) ;
item = iterator . next ( ) ;
} ;Formación
Ideal para al tratar con un índice compuesto que contiene una Array de valores, lo que haría que la coincidencia con un solo valor sea imposible al usar find() .
const store = haro ( null , { key : 'guid' , index : [ 'name' , 'name|age' , 'age' ] } ) ,
data = [ { guid : 'abc' , name : 'John Doe' , age : 30 } , { guid : 'def' , name : 'Jane Doe' , age : 28 } ] ;
store . batch ( data , 'set' ) ;
console . log ( store . where ( { name : 'John Doe' , age : 30 } ) ) ; // [{guid: 'abc', name: 'John Doe', age: 30}] Copyright (c) 2024 Jason Mulligan con licencia bajo la licencia BSD-3