summaryrefslogtreecommitdiff
path: root/jstests/fts_index.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/fts_index.js')
-rw-r--r--jstests/fts_index.js138
1 files changed, 138 insertions, 0 deletions
diff --git a/jstests/fts_index.js b/jstests/fts_index.js
new file mode 100644
index 00000000000..480bfb05fa2
--- /dev/null
+++ b/jstests/fts_index.js
@@ -0,0 +1,138 @@
+// Test that:
+// 1. Text indexes properly validate the index spec used to create them.
+// 2. Text indexes properly enforce a schema on the language_override field.
+// 3. Collections may have at most one text index.
+// 4. Text indexes properly handle large documents.
+
+var coll = db.fts_index;
+var indexName = "textIndex";
+coll.drop();
+coll.getDB().createCollection(coll.getName());
+
+//
+// 1. Text indexes properly validate the index spec used to create them.
+//
+
+// Spec passes text-specific index validation.
+coll.ensureIndex({a: "text"}, {name: indexName, default_language: "spanish"});
+assert(!db.getLastError());
+assert.eq(1, coll.getDB().system.indexes.count({ns: coll.getFullName(), name: indexName}));
+coll.dropIndexes();
+
+// Spec fails text-specific index validation ("spanglish" unrecognized).
+coll.ensureIndex({a: "text"}, {name: indexName, default_language: "spanglish"});
+assert(db.getLastError());
+assert.eq(0, coll.system.indexes.count({ns: coll.getFullName(), name: indexName}));
+coll.dropIndexes();
+
+// Spec passes general index validation.
+coll.ensureIndex({"$**": "text"}, {name: indexName});
+assert(!db.getLastError());
+assert.eq(1, coll.getDB().system.indexes.count({ns: coll.getFullName(), name: indexName}));
+coll.dropIndexes();
+
+// Spec fails general index validation ("a.$**" invalid field name for key).
+coll.ensureIndex({"a.$**": "text"}, {name: indexName});
+assert(db.getLastError());
+assert.eq(0, coll.getDB().system.indexes.count({ns: coll.getFullName(), name: indexName}));
+coll.dropIndexes();
+
+//
+// 2. Text indexes properly enforce a schema on the language_override field.
+//
+
+// Can create a text index on a collection where no documents have invalid language_override.
+coll.insert({a: ""});
+coll.insert({a: "", language: "spanish"});
+coll.ensureIndex({a: "text"});
+assert(!db.getLastError());
+coll.drop();
+
+// Can't create a text index on a collection containing document with an invalid language_override.
+coll.insert({a: "", language: "spanglish"});
+coll.ensureIndex({a: "text"});
+assert(db.getLastError());
+coll.drop();
+
+// Can insert documents with valid language_override into text-indexed collection.
+coll.ensureIndex({a: "text"});
+assert(!db.getLastError());
+coll.insert({a: ""});
+coll.insert({a: "", language: "spanish"});
+assert(!db.getLastError());
+coll.drop();
+
+// Can't insert documents with invalid language_override into text-indexed collection.
+coll.ensureIndex({a: "text"});
+assert(!db.getLastError());
+coll.insert({a: "", language: "spanglish"});
+assert(db.getLastError());
+coll.drop();
+
+//
+// 3. Collections may have at most one text index.
+//
+
+coll.ensureIndex({a: 1, b: "text", c: 1});
+assert(!db.getLastError());
+assert.eq(2, coll.getIndexes().length);
+
+// ensureIndex() becomes a no-op on an equivalent index spec.
+coll.ensureIndex({a: 1, b: "text", c: 1});
+assert(!db.getLastError());
+assert.eq(2, coll.getIndexes().length);
+coll.ensureIndex({a: 1, _fts: "text", _ftsx: 1, c: 1}, {weights: {b: 1}});
+assert(!db.getLastError());
+assert.eq(2, coll.getIndexes().length);
+coll.ensureIndex({a: 1, b: "text", c: 1}, {default_language: "english"});
+assert(!db.getLastError());
+assert.eq(2, coll.getIndexes().length);
+coll.ensureIndex({a: 1, b: "text", c: 1}, {textIndexVersion: 2});
+assert(!db.getLastError());
+assert.eq(2, coll.getIndexes().length);
+coll.ensureIndex({a: 1, b: "text", c: 1}, {language_override: "language"});
+assert(!db.getLastError());
+assert.eq(2, coll.getIndexes().length);
+
+// ensureIndex() fails if a second text index would be built.
+coll.ensureIndex({a: 1, _fts: "text", _ftsx: 1, c: 1}, {weights: {d: 1}});
+assert(db.getLastError());
+coll.ensureIndex({a: 1, b: "text", c: 1}, {default_language: "none"});
+assert(db.getLastError());
+coll.ensureIndex({a: 1, b: "text", c: 1}, {textIndexVersion: 1});
+assert(db.getLastError());
+coll.ensureIndex({a: 1, b: "text", c: 1}, {language_override: "idioma"});
+assert(db.getLastError());
+coll.ensureIndex({a: 1, b: "text", c: 1}, {weights: {d: 1}});
+assert(db.getLastError());
+coll.ensureIndex({a: 1, b: "text", d: 1});
+assert(db.getLastError());
+coll.ensureIndex({a: 1, d: "text", c: 1});
+assert(db.getLastError());
+coll.ensureIndex({b: "text"});
+assert(db.getLastError());
+coll.ensureIndex({b: "text", c: 1});
+assert(db.getLastError());
+coll.ensureIndex({a: 1, b: "text"});
+assert(db.getLastError());
+
+coll.dropIndexes();
+
+//
+// 4. Text indexes properly handle large keys.
+//
+
+coll.ensureIndex({a: "text"});
+assert(!db.getLastError());
+
+var longstring = "";
+var longstring2 = "";
+for(var i = 0; i < 1024 * 1024; ++i) {
+ longstring = longstring + "a";
+ longstring2 = longstring2 + "b";
+}
+coll.insert({a: longstring});
+coll.insert({a: longstring2});
+assert.eq(1, coll.find({$text: {$search: longstring}}).itcount(), "long string not found in index");
+
+coll.drop();