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 ) ;大批
返回帶有形狀[鍵,值]的雙Arrays的Array , true返回到callbackFn(value, key) [key, value] )的記錄。
過濾數據存儲的示例:
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許可證的許可