Haro는 ES6 기능으로 제작 된 현대적인 불변의 데이터 저장소입니다. 이는 구현되지 않은 상태이며 클라이언트 또는 서버 (RAM)의 모델링, 검색 및 데이터 관리에 대한 "플러그 앤 플레이"솔루션을 제공합니다. 버전의 레코드 세트를 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 ]를받습니다.
기능
데이터 저장소를 지우기위한 이벤트 리스너.
기능
레코드가 삭제 될 때 이벤트 리스너는 레코드 키를 수신합니다.
기능
데이터 스토어가 전체 데이터 세트를 변경할 때 이벤트 리스너는 변경 사항 ( indexes 또는 records )을 명명하는 String 수신합니다.
기능
레코드가 설정 될 때 Array 수신합니다.
부울
레코드의 MVCC 스타일 버전 설정을 활성화/비활성화하면 기본값이 false 입니다. 버전은 쉽게 반복 할 수 있도록 Sets 에 저장됩니다.
버전 작성을 활성화하는 예 :
const store = haro ( null , { versioning : true } ) ; 지도
del() & set() 에 의해 업데이트 된 레코드 Map .
지도
맵 키를 포함하는 세트 인 인덱스 맵.
정렬
this.data 순서를 나타내는 배열.
숫자
데이터 저장소의 레코드 수.
지도
set() 에 의해 업데이트 된 레코드 Sets Map .
정렬
첫 번째 인수는 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
Map 객체의 각 요소에 대한 [key, value] 배열이 삽입 순서로 포함 된 새 Iterator 객체를 반환합니다.
레코드 삭제의 예 :
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 ) ;정렬
callbackFn(value, key) 으로 true 반환 된 레코드의 Shape [key, value] 를 가진 이중 Arrays Array 반환합니다.
데이터 스토어 필터링의 예 :
const store = haro ( ) ;
// Data is added
store . filter ( function ( value ) {
return value . something === true ;
} ) ;정렬
where 와 일치하는 인덱스 값으로 찾은 이중 Arrays Array 반환합니다.
신원 일치와 함께 레코드 찾기의 예 :
const store = haro ( null , { index : [ 'field1' ] } ) ;
// Data is added
store . find ( { field1 : 'some value' } ) ;한정되지 않은
Map 객체에있는 각 키 값 쌍에 대해 callbackFn 한 번 삽입하십시오. 이 thisArg 매개 변수가 forEach 에 제공되면 각 콜백 의이 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' ) ;부울
데이터 스토어에 key 포함되어 있는지 표시하는 Boolean 반환합니다.
알려진 기본 키 값으로 레코드를 확인하는 예 :
const store = haro ( ) ;
// Data is added
store . has ( 'keyValue' ) ; // true or falseMapiterator
Map 객체의 각 요소의 키를 삽입 순서로 포함하는 새 Iterator 객체를 반환합니다 .`
반복자를 얻고 결과를 기록하는 예 :
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 ) ;정렬
해당 레코드 범위에 대해 Shape [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() insert 또는 load() 의 Promise 기반 코드 경로를 피할 수 있습니다. 교차 도메인 문제를 단순화하기 위해 변환을 수행 할 수있는 선택적 세 번째 매개 변수를 허용합니다.
데이터 스토어를 재정의하는 예 :
const store = haro ( ) ;
store . override ( { 'field' : { 'value' : [ 'pk' ] } } , "indexes" ) ;정렬
Data Store ( 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 ( ) ;정렬
arg 와 일치하는 레코드의 모양 [key, value] 있는 이중 Arrays Array 반환합니다. arg Function 인 경우 (매개 변수는 value & index ) 결과가 true 인 경우 일치가 이루어집니다. arg 가 RegExp 인 경우 필드 값은 .test() 가 true 로야합니다. 그렇지 않으면 값은 ID 일치 여야합니다. index 매개 변수 Strings String 또는 Array 일 수 있습니다. 공급하지 않으면 기본값은 this.index 입니다.
RegExp 로 테스트되는 색인 Arrays 쉼표로 구분 된 String 으로 취급됩니다 (예 ['hockey', 'football'] RegExp 의 'hockey, football' 가됩니다.
술어 기능으로 검색의 예 :
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
Map 객체의 각 요소의 값을 삽입 순서로 포함하는 새 Iterator 객체를 반환합니다.
값 반복의 예 :
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 라이센스에 따라 라이센스