<commit_before>var rodabase = require('../');

var tape = require('tape');
var jsondown = require('jsondown');
var _ = require('underscore');

var roda = rodabase('./test/data/resource.json', {
  db: jsondown
});
var n = 100;

tape('Read lock', function(t){
  var api = roda('1');
  var ok = true;

  t.plan(2);
  function run(i){
    var tx = roda.transaction();
    api.get('k', tx, function(err, val){
      ok &= !err;

      api.put({
        _id: 'k',
        k: (val ? val.k : 0) + 1
      }, tx);

      tx.commit();
    });
  }
  for(var i = 0; i < n; i++)
    run(i);

  var tx = roda.transaction();

  api.get('k', tx, function(err, val){
    t.ok(ok, 'no error');
    t.equal(val.k, n, 'Tx incrememnt');
  });

  tx.commit();
});

tape('Increment', function(t){
  t.plan(2);
  var api = roda('2');

  for(var i = 0; i < n; i++)
    api.put({ i: i }, function(err, val){
      if(val.i === n - 1){
        api.read(function(err, list){
          list = _.sortBy(list, 'i');
          t.deepEqual(_.sortBy(list, '_id'), list, '_id incremental');
          t.deepEqual(_.sortBy(list, '_rev'), list, '_rev incremental');
        });
      }
    });
});

tape('Tx increment', function(t){
  t.plan(4);
  var api = roda('3');
  var tx = roda.transaction();

  for(var i = 0; i < n; i++)
    api.put({ i: i }, tx);
    
  api.read(function(err, list){
    t.equal(list.length, 0, 'list empty before commit');
    tx.commit(function(){
      api.read(function(err, list){
        list = _.sortBy(list, 'i');
        t.equal(list.length, n, 'list filled after commit');
        t.deepEqual(_.sortBy(list, '_id'), list, '_id incremental');
        t.deepEqual(_.sortBy(list, '_rev'), list, '_rev incremental');
      });
    });
  });
});

tape('Changes', function(t){
  t.plan(3);
  var api = roda('4');
  var tx = roda.transaction();
  var i;

  function encode(i){
    return roda.util.trim(roda.util.encode(i));
  }

  for(i = 0; i < n; i++)
    api.put({ _id: encode(i), i: i }, tx);
  for(i = 0; i < n; i++)
    api.put({ _id: encode(i), i: i }, tx); //redundant put

  for(i = 0; i < n; i+=3)
    api.del(encode(i), tx);
  for(i = 0; i < n; i+=3)
    api.del(encode(i), tx); //non-exist del

  tx.commit(function(err){
    t.notOk(err, 'commit success');

    api.read(function(err, list){
      t.equal(list.length, Math.floor(n*2/3), 'read 2/3 n length');
    });
    api.changes(function(err, changes){
      t.equal(changes.length, n, 'changes n ength');
    });
  });
});

tape('Nested', function(t){
  t.plan(5);
  roda('5').use('validate', function(ctx, next){
    roda('5.1').put({
      _id: ctx.result._id,
      i: ctx.result.i * 10
    }, ctx.transaction);
    next();
  });
  var tx = roda.transaction();
  var i;

  function encode(i){
    return roda.util.trim(roda.util.encode(i));
  }

  for(i = 0; i < n; i++)
    roda('5').put({ _id: encode(i), i: i }, tx);
  for(i = 0; i < n; i++)
    roda('5').put({ _id: encode(i), i: i }, tx); //redundant put

  for(i = 0; i < n; i+=3)
    roda('5').del(encode(i), tx);
  for(i = 0; i < n; i+=3)
    roda('5').del(encode(i), tx); //non-exist del
  for(i = 0; i < n; i+=2)
    roda('5.1').del(encode(i), tx);

  tx.commit(function(err){
    t.notOk(err, 'commit success');

    roda('5').read(function(err, list){
      t.equal(list.length, Math.floor(n*2/3), 'read 2/3 n length');
    });
    roda('5').changes(function(err, changes){
      t.equal(changes.length, n, 'changes n length');
    });
    roda('5.1').read(function(err, list){
      t.equal(list.length, Math.floor(n/2), 'hook n/2 length');
    });
    roda('5.1').changes(function(err, list){
      t.equal(list.length, n, 'hook changes n length');
    });
  });

});
tape('Double Nested', function(t){
  t.plan(7);
  roda('6').use('validate', function(ctx, next){
    roda('6.1').put({
      _id: ctx.result._id,
      i: ctx.result.i * 10
    }, ctx.transaction);
    //redundant
    roda('6.1').put({
      _id: ctx.result._id,
      i: ctx.result.i * 10
    }, ctx.transaction);
    next();
  });
  roda('6.1').use('diff', function(ctx, next){
    if(ctx.result)
      roda('6.2').put({
        _id: ctx.result._id,
        i: ctx.result.i * 10
      }, ctx.transaction);
    else
      roda('6.2').del(ctx.current._id, ctx.transaction);
    next();
  });
  var tx = roda.transaction();
  var i;

  function encode(i){
    return roda.util.trim(roda.util.encode(i));
  }

  for(i = 0; i < n; i++)
    roda('6').put({ _id: encode(i), i: i }, tx);
  for(i = 0; i < n; i++)
    roda('5').put({ _id: encode(i), i: i }, tx); //redundant put

  for(i = 0; i < n; i+=3)
    roda('6').del(encode(i), tx);
  for(i = 0; i < n; i+=3)
    roda('6').del(encode(i), tx); //non-exist del
  for(i = 0; i < n; i+=2)
    roda('6.1').del(encode(i), tx);

  tx.commit(function(err){
    t.notOk(err, 'commit success');

    roda('6').read(function(err, list){
      t.equal(list.length, Math.floor(n*2/3), 'read 2/3 n length');<commit_msg>fix typo<commit_after>var rodabase = require('../');

var tape = require('tape');
var jsondown = require('jsondown');
var _ = require('underscore');

var roda = rodabase('./test/data/resource.json', {
  db: jsondown
});
var n = 100;

tape('Read lock', function(t){
  var api = roda('1');
  var ok = true;

  t.plan(2);
  function run(i){
    var tx = roda.transaction();
    api.get('k', tx, function(err, val){
      ok &= !err;

      api.put({
        _id: 'k',
        k: (val ? val.k : 0) + 1
      }, tx);

      tx.commit();
    });
  }
  for(var i = 0; i < n; i++)
    run(i);

  var tx = roda.transaction();

  api.get('k', tx, function(err, val){
    t.ok(ok, 'no error');
    t.equal(val.k, n, 'Tx incrememnt');
  });

  tx.commit();
});

tape('Increment', function(t){
  t.plan(2);
  var api = roda('2');

  for(var i = 0; i < n; i++)
    api.put({ i: i }, function(err, val){
      if(val.i === n - 1){
        api.read(function(err, list){
          list = _.sortBy(list, 'i');
          t.deepEqual(_.sortBy(list, '_id'), list, '_id incremental');
          t.deepEqual(_.sortBy(list, '_rev'), list, '_rev incremental');
        });
      }
    });
});

tape('Tx increment', function(t){
  t.plan(4);
  var api = roda('3');
  var tx = roda.transaction();

  for(var i = 0; i < n; i++)
    api.put({ i: i }, tx);
    
  api.read(function(err, list){
    t.equal(list.length, 0, 'list empty before commit');
    tx.commit(function(){
      api.read(function(err, list){
        list = _.sortBy(list, 'i');
        t.equal(list.length, n, 'list filled after commit');
        t.deepEqual(_.sortBy(list, '_id'), list, '_id incremental');
        t.deepEqual(_.sortBy(list, '_rev'), list, '_rev incremental');
      });
    });
  });
});

tape('Changes', function(t){
  t.plan(3);
  var api = roda('4');
  var tx = roda.transaction();
  var i;

  function encode(i){
    return roda.util.trim(roda.util.encode(i));
  }

  for(i = 0; i < n; i++)
    api.put({ _id: encode(i), i: i }, tx);
  for(i = 0; i < n; i++)
    api.put({ _id: encode(i), i: i }, tx); //redundant put

  for(i = 0; i < n; i+=3)
    api.del(encode(i), tx);
  for(i = 0; i < n; i+=3)
    api.del(encode(i), tx); //non-exist del

  tx.commit(function(err){
    t.notOk(err, 'commit success');

    api.read(function(err, list){
      t.equal(list.length, Math.floor(n*2/3), 'read 2/3 n length');
    });
    api.changes(function(err, changes){
      t.equal(changes.length, n, 'changes n ength');
    });
  });
});

tape('Nested', function(t){
  t.plan(5);
  roda('5').use('validate', function(ctx, next){
    roda('5.1').put({
      _id: ctx.result._id,
      i: ctx.result.i * 10
    }, ctx.transaction);
    next();
  });
  var tx = roda.transaction();
  var i;

  function encode(i){
    return roda.util.trim(roda.util.encode(i));
  }

  for(i = 0; i < n; i++)
    roda('5').put({ _id: encode(i), i: i }, tx);
  for(i = 0; i < n; i++)
    roda('5').put({ _id: encode(i), i: i }, tx); //redundant put

  for(i = 0; i < n; i+=3)
    roda('5').del(encode(i), tx);
  for(i = 0; i < n; i+=3)
    roda('5').del(encode(i), tx); //non-exist del
  for(i = 0; i < n; i+=2)
    roda('5.1').del(encode(i), tx);

  tx.commit(function(err){
    t.notOk(err, 'commit success');

    roda('5').read(function(err, list){
      t.equal(list.length, Math.floor(n*2/3), 'read 2/3 n length');
    });
    roda('5').changes(function(err, changes){
      t.equal(changes.length, n, 'changes n length');
    });
    roda('5.1').read(function(err, list){
      t.equal(list.length, Math.floor(n/2), 'hook n/2 length');
    });
    roda('5.1').changes(function(err, list){
      t.equal(list.length, n, 'hook changes n length');
    });
  });

});
tape('Double Nested', function(t){
  t.plan(7);
  roda('6').use('validate', function(ctx, next){
    roda('6.1').put({
      _id: ctx.result._id,
      i: ctx.result.i * 10
    }, ctx.transaction);
    //redundant
    roda('6.1').put({
      _id: ctx.result._id,
      i: ctx.result.i * 10
    }, ctx.transaction);
    next();
  });
  roda('6.1').use('diff', function(ctx, next){
    if(ctx.result)
      roda('6.2').put({
        _id: ctx.result._id,
        i: ctx.result.i * 10
      }, ctx.transaction);
    else
      roda('6.2').del(ctx.current._id, ctx.transaction);
    next();
  });
  var tx = roda.transaction();
  var i;

  function encode(i){
    return roda.util.trim(roda.util.encode(i));
  }

  for(i = 0; i < n; i++)
    roda('6').put({ _id: encode(i), i: i }, tx);
  for(i = 0; i < n; i++)
    roda('6').put({ _id: encode(i), i: i }, tx); //redundant put

  for(i = 0; i < n; i+=3)
    roda('6').del(encode(i), tx);
  for(i = 0; i < n; i+=3)
    roda('6').del(encode(i), tx); //non-exist del
  for(i = 0; i < n; i+=2)
    roda('6.1').del(encode(i), tx);

  tx.commit(function(err){
    t.notOk(err, 'commit success');

    roda('6').read(function(err, list){
      t.equal(list.length, Math.floor(n*2/3), 'read 2/3 n length');
{'fraction_non_alphanumeric': 0.2325017674982325, 'fraction_numerical': 0.019593980406019593, 'mean_word_length': 2.632428466617755, 'pattern_counts': {'":': 0, '<': 37, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1498910', 'n_tokens_mistral': 4071, 'n_tokens_neox': 3944, 'n_words': 882}