Haro - это современная неизменная хранилища данных, созданную с функциями ES6. Он не накапливается и предлагает решение «подключать и играть» для моделирования, поиска и управления данными на клиенте или на сервере (в ОЗУ). Это частично постоянная структура данных, поддерживая наборы версий записей в versions (MVCC).
Все методы синхронны.
Индексы HARO имеют следующую Map (field/property) > Map (value) > Set (PKs) которая позволяет быстро и простой поиск, а также проверку. Индексы могут управляться независимо от операций del() и set() , например, вы можете лениво создавать новые индексы через reindex(field) или sortBy(field) .
Haro имеет 100% покрытие кода с его тестами.
----------|---------|----------|---------|---------|-------------------------------------------------------------------------------------------------------
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
----------|---------|----------|---------|---------|------------------------------------------------------------------------------------------------------- Названный экспорт - haro , а экспортируемый класс - Haro .
import { haro } from 'haro' ; const { haro } = require ( 'haro' ) ; Haro принимает два дополнительных аргумента, первым является Array записей, чтобы установить асинхронно, а второй - дескриптор конфигурации.
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} В репозитории включен эталон и полезен для оценки того, как Haro будет работать на различном оборудовании и программном обеспечении.
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
Функция
Слушатель событий для работы до пакетной операции, получает type , data .
Функция
Слушатель событий, прежде чем очистить хранилище данных.
Функция
Слушатель событий для того, как запись будет удалена, получает key , batch .
Функция
Слушатель событий для установки записи, получает key , data .
Множество
Массив значений для индекса. Композитные индексы поддерживаются с использованием разделителя по умолчанию ( this.delimiter ). Не матрицы в композитах приводят к пустым значениям.
Пример полей/свойств для индекса:
const store = haro ( null , { index : [ 'field1' , 'field2' , 'field1|field2|field3' ] } ) ;Нить
Необязательный ключ Object для использования в качестве ключа Map , по умолчанию в версии 4 UUID если не указан, или найден.
Пример указания первичного ключа:
const store = haro ( null , { key : 'field' } ) ;Логический
Журналы Постоянные сообщения хранения в console , по умолчанию true .
Функция
Слушатель событий для пакетной операции получает два аргумента ['тип', Array ].
Функция
Слушатель событий для очистки хранилища данных.
Функция
Слушатель событий для того, когда запись будет удалена, получает ключ записи.
Функция
Слушатель событий для того, когда хранилище данных изменяет весь набор данных, получает именование String , что изменилось ( indexes или records ).
Функция
Слушатель событий. Когда будет установлена запись, получает Array .
Логический
Включить/отключить версии записей в стиле MVCC, по умолчанию false . Версии хранятся в Sets для легкой итерации.
Пример включения версий:
const store = haro ( null , { versioning : true } ) ; Карта
Map записей, обновленная del() и set() .
Карта
Карта индексов, которые являются наборами, содержащими клавиши карты.
Множество
Массив, представляющий порядок this.data .
Число
Количество записей в хранилище данных.
Карта
Map Sets записей, обновлена set() .
Множество
Первый аргумент должен быть Array , а второй аргумент должен быть del или 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' ) ;себя
Удаляет все пары ключей/значения из хранилища данных.
Пример очистки данных данных:
const store = haro ( ) ;
// Data is added
store . clear ( ) ;Неопределенный
Удаляет запись.
Пример удаления записи:
const store = haro ( ) ,
rec = store . set ( null , { abc : true } ) ;
store . del ( rec [ 0 ] ) ;
console . log ( store . size ) ; // 0Массив или объект
Возвращает записи или индексы хранилища данных в качестве изменяемого Array или Object , для намерения повторного использования/постоянного хранилища, не полагаясь на адаптер, который разбил бы набор данных.
const store = haro ( ) ;
// Data is loaded
const records = store . dump ( ) ;
const indexes = store . dump ( 'indexes' ) ;
// Save records & indexesКарта
Возвращает новый объект Iterator , который содержит массив [key, value] для каждого элемента в объекте Map в порядке вставки.
Пример удаления записи:
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 ) ;Множество
Возвращает Array двойных Arrays с формой [key, value] для записей, которые вернули true to callbackFn(value, key) .
Пример фильтрации хранилища данных:
const store = haro ( ) ;
// Data is added
store . filter ( function ( value ) {
return value . something === true ;
} ) ;Множество
Возвращает Array двойных Arrays с обнаруженными индексированными значениями, соответствующими where .
Пример поиска записей (ы) с совпадением идентификации:
const store = haro ( null , { index : [ 'field1' ] } ) ;
// Data is added
store . find ( { field1 : 'some value' } ) ;Неопределенный
Вызовы callbackFn один раз для каждой пары ключевых значений, присутствующей в объекте Map , в порядке вставки. Если параметр thisArg предоставлен для forEach , он будет использоваться в качестве this значения для каждого обратного вызова.
Пример удаления записи:
const store = haro ( ) ;
store . set ( null , { abc : true } ) ;
store . forEach ( function ( value , key ) {
console . log ( key ) ;
} ) ;Множество
Получает запись как двойной Array с формой [key, value] .
Пример получения записи с известным значением первичного ключа:
const store = haro ( ) ;
// Data is added
store . get ( 'keyValue' ) ;Логический
Возвращает Boolean указывающее, содержит ли хранилище данных key .
Пример проверки для записи с известным значением первичного ключа:
const store = haro ( ) ;
// Data is added
store . has ( 'keyValue' ) ; // true or falseКарта
Возвращает новый объект Iterator , который содержит ключи для каждого элемента в объекте Map в порядке вставки.
Пример получения итератора и регистрации результатов:
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 ) ;Множество
Возвращает Array двойных Arrays с формой [key, value] для соответствующего диапазона записей.
Пример набора данных:
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 ] ) ) ; // falseМножество
Возвращает Array возврата callbackFn(value, key) . Если raw true , возвращается Array .
Пример отображения данных данных:
const store = haro ( ) ;
// Data is added
store . map ( function ( value ) {
return value . property ;
} ) ;Логический
Это предназначено для использования в парном переопределении индексов и записей, так что вы можете избежать пробега кода, основанного на Promise batch() вставки или load() . Принимает необязательный третий параметр для выполнения преобразования для упрощения проблем с доменом.
Пример переоценки данных данных:
const store = haro ( ) ;
store . override ( { 'field' : { 'value' : [ 'pk' ] } } , "indexes" ) ;Множество
Запускает функцию вдохновленной Array.reduce() против хранилища данных ( Map ).
Пример фильтрации хранилища данных:
const store = haro ( ) ;
// Data is added
store . reduce ( function ( accumulator , value , key ) {
accumulator [ key ] = value ;
return accumulator ;
} , { } ) ;Харо
Повторно индексирует хранилище данных, которое будет вызвано при изменении значения index .
Пример отображения данных данных:
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 ( ) ;Множество
Возвращает Array двойных Arrays с формой [key, value] записей, найденных соответствующим arg . Если arg является Function (параметры являются value и index ), совпадает, если результат является true , если arg является RegExp значение поля должно .test() как true , иначе значение должно быть совпадением идентификации. Параметр index может быть String или Array Strings ; Если не поставляется, по умолчанию это. this.index .
Индексированные Arrays , которые тестируются с помощью RegExp будут рассматриваться как String с разграниченной запятой, например ['hockey', 'football'] становится 'hockey, football' для RegExp .
Пример поиска с функцией предиката:
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}]]Объект
Запись в хранилище данных. Если key false , будет сгенерирована версия 4 UUID .
Если override true , существующая запись будет заменена вместо измененных.
Пример создания записи:
const store = haro ( null , { key : 'id' } ) ,
record = store . set ( null , { id : 1 , name : 'John Doe' } ) ;
console . log ( record ) ; // [1, {id: 1, name: 'Jane Doe'}]Множество
Возвращает массив хранилища данных, отсортированный callbackFn .
Пример сортировки как 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}]Множество
Возвращает Array двойных Arrays с формой [key, value] записей, отсортированных по индексу.
Пример сортировки по индексу:
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}]]Множество
Возвращает массив хранилища данных.
Пример кастинга в 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}]Карта
Возвращает новый объект Iterator , который содержит значения для каждого элемента в объекте Map в порядке вставки.
Пример итерации значений:
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 ( ) ;
} ;Множество
Идеально подходит для работы с композитным индексом, который содержит Array значений, что сделало бы невозможным сопоставление при одном значении при использовании 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 г. Джейсон Маллиган лицензирован по лицензии BSD-3