// @tags: [
//   assumes_balancer_off
// ]
(function() {
"use strict";

const t = db.index_check3;
t.drop();

t.save({a: 1});
t.save({a: 2});
t.save({a: 3});
t.save({a: "z"});

assert.eq(1, t.find({a: {$lt: 2}}).itcount(), "A");
assert.eq(1, t.find({a: {$gt: 2}}).itcount(), "B");

t.createIndex({a: 1});

assert.eq(1, t.find({a: {$lt: 2}}).itcount(), "C");
assert.eq(1, t.find({a: {$gt: 2}}).itcount(), "D");

t.drop();

for (let i = 0; i < 100; i++) {
    let o = {i: i};
    if (i % 2 == 0)
        o.foo = i;
    t.save(o);
}

t.createIndex({foo: 1});

let explain = t.find({foo: {$lt: 50}}).explain("executionStats");
assert.gt(30, explain.executionStats.totalKeysExamined, "lt");
explain = t.find({foo: {$gt: 50}}).explain("executionStats");
assert.gt(30, explain.executionStats.totalKeysExamined, "gt");

t.drop();
t.save({i: 'a'});
for (var i = 0; i < 10; ++i) {
    t.save({});
}

t.createIndex({i: 1});

explain = t.find({i: {$lte: 'a'}}).explain("executionStats");
assert.gt(3, explain.executionStats.totalKeysExamined, "lte");

// bug SERVER-99
explain = t.find({i: {$gte: 'a'}}).explain("executionStats");
assert.gt(3, explain.executionStats.totalKeysExamined, "gte");
assert.eq(1, t.find({i: {$gte: 'a'}}).count(), "gte a");
assert.eq(1, t.find({i: {$gte: 'a'}}).itcount(), "gte b");
assert.eq(1, t.find({i: {$gte: 'a'}}).sort({i: 1}).count(), "gte c");
assert.eq(1, t.find({i: {$gte: 'a'}}).sort({i: 1}).itcount(), "gte d");

t.save({i: "b"});

explain = t.find({i: {$gte: 'a'}}).explain("executionStats");
assert.gt(3, explain.executionStats.totalKeysExamined, "gte");
assert.eq(2, t.find({i: {$gte: 'a'}}).count(), "gte a2");
assert.eq(2, t.find({i: {$gte: 'a'}}).itcount(), "gte b2");
assert.eq(2, t.find({i: {$gte: 'a', $lt: MaxKey}}).itcount(), "gte c2");
assert.eq(2, t.find({i: {$gte: 'a', $lt: MaxKey}}).sort({i: -1}).itcount(), "gte d2");
assert.eq(2, t.find({i: {$gte: 'a', $lt: MaxKey}}).sort({i: 1}).itcount(), "gte e2");
})();
