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 & indexesMapiterator
إرجاع كائن 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 إلى 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 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 ) ;صفيف
إرجاع 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 true عن RegExp .test() يجب أن تكون قيمة الحقل. يمكن أن تكون معلمة 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}]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