Haro是具有ES6功能的现代不变数据。它是未开放的,并为客户或服务器上的数据(在RAM中)提供了“插件”解决方案。通过维护versions (MVCC)中的记录集,这是部分持久的数据结构。
所有方法都是同步的。
HARO索引具有以下结构Map (field/property) > Map (value) > Set (PKs)该图(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 。
功能
批处理操作的事件侦听器,收到两个参数['type', Array ]。
功能
用于清除数据存储的活动听众。
功能
事件侦听器为删除记录时,会收到记录键。
功能
当数据存储更改整个数据集时,接收一个String命名( indexes或records )的字符串。
功能
事件侦听器为记录设置时,会收到一个Array 。
布尔
启用/禁用记录的MVCC样式版本,默认值为false 。版本存储在Sets中,以便于迭代。
启用版本的示例:
const store = haro ( null , { versioning : true } ) ; 地图
记录Map ,由del() & set()更新。
地图
索引图,该索引集包含映射密钥。
大批
代表this.data的顺序的数组。
数字
数据存储中的记录数。
地图
Sets记录的Map ,由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 & indexesMapiterator
返回一个新的Iterator对象,该对象包含插入顺序中Map对象中每个元素的[key, value]的数组。
删除记录的示例:
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 ) ;大批
返回带有形状[key, value]的双Arrays的Array , true返回到callbackFn(value, key)的记录。
过滤数据存储的示例:
const store = haro ( ) ;
// Data is added
store . filter ( function ( value ) {
return value . something === true ;
} ) ;大批
返回一个双Arrays的Array ,并通过与where匹配的索引值发现。
找到具有身份匹配的记录的示例:
const store = haro ( null , { index : [ 'field1' ] } ) ;
// Data is added
store . find ( { field1 : 'some value' } ) ;不明确的
以插入顺序呼叫callbackFn一次,每次键值对Map中存在的每个键值对。如果为forEach提供了thisArg参数,则将用作每个回调的this值。
删除记录的示例:
const store = haro ( ) ;
store . set ( null , { abc : true } ) ;
store . forEach ( function ( value , key ) {
console . log ( key ) ;
} ) ;大批
将记录视为具有形状[key, value]的双Array 。
获取具有已知主要键值的记录的示例:
const store = haro ( ) ;
// Data is added
store . get ( 'keyValue' ) ;布尔
返回Boolean指示数据存储是否包含key 。
检查具有已知主要键值的记录的示例:
const store = haro ( ) ;
// Data is added
store . has ( 'keyValue' ) ; // true or falseMapiterator
返回一个新的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 ) ;大批
返回具有相应记录范围的形状[key, value]的双Arrays Array 。
登机数据集的示例:
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大批
返回callbackFn(value, key)返回的Array 。如果raw为true ,则返回Array 。
映射数据存储的示例:
const store = haro ( ) ;
// Data is added
store . map ( function ( value ) {
return value . property ;
} ) ;布尔
这是在索引和记录的配对覆盖中使用的,以便您可以避免batch()插入或load()的基于Promise的代码路径。接受可选的第三参数以执行转换以简化跨域问题。
覆盖数据存储的示例:
const store = haro ( ) ;
store . override ( { 'field' : { 'value' : [ 'pk' ] } } , "indexes" ) ;大批
对数据存储( Map )运行Array.reduce()启发的功能。
过滤数据存储的示例:
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 ( ) ;大批
返回带有形状[key, value]的Double Arrays的Array ,找到了与arg的匹配。如果arg是一个Function (参数为value和index ),则如果结果为true ,则进行匹配,如果arg为RegExp则字段值必须.test()为true ,否则值必须是身份匹配。 index参数可以是String或Strings Array ;如果未提供,则默认为this.index 。
用RegExp测试的索引Arrays将被视为逗号分隔的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}]大批
返回带有索引排序的记录的形状[key, value]的双Arrays 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 . 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}]Mapiterator
返回一个新的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}] 版权(C)2024 Jason Mulligan获得了BSD-3许可证的许可