Commit 4685889d authored by Sven Franck's avatar Sven Franck

indexStorage: pass jslint, prepare allDocs/complex queries

parent 9ca13f16
...@@ -107,13 +107,20 @@ jIO.addStorageType('indexed', function (spec, my) { ...@@ -107,13 +107,20 @@ jIO.addStorageType('indexed', function (spec, my) {
* @return {object} The new index array * @return {object} The new index array
*/ */
priv.createEmptyIndexArray = function (indices) { priv.createEmptyIndexArray = function (indices) {
var i, j = priv.indices.length, var i, k, j = priv.indices.length, new_index,
new_index_object = {}, new_index_name; new_index_object = {}, new_index_name, new_index_fields;
if (indices === undefined) { if (indices === undefined) {
for (i = 0; i < j; i += 1) { for (i = 0; i < j; i += 1) {
new_index_name = priv.indices[i].name; new_index = priv.indices[i];
new_index_name = new_index.name;
new_index_fields = new_index.fields;
new_index_object[new_index_name] = {}; new_index_object[new_index_name] = {};
// loop index fields and add objects to hold value/id pairs
for (k = 0; k < new_index_fields.length; k += 1) {
new_index_object[new_index_name][new_index_fields[k]] = {};
}
} }
} }
return new_index_object; return new_index_object;
...@@ -168,18 +175,24 @@ jIO.addStorageType('indexed', function (spec, my) { ...@@ -168,18 +175,24 @@ jIO.addStorageType('indexed', function (spec, my) {
* @return {boolean} true/false * @return {boolean} true/false
*/ */
priv.isDocidInIndex = function (indices, doc) { priv.isDocidInIndex = function (indices, doc) {
var index, i, l = priv.indices.length; var index, i, j, label, l = priv.indices.length;
// loop indices // loop indices
for (i = 0; i < l; i += 1) { for (i = 0; i < l; i += 1) {
index = {}; index = {};
index.reference = priv.indices[i]; index.reference = priv.indices[i];
index.name = index.reference.name; index.reference_size = index.reference.fields.length;
index.size = priv.getObjectSize(indices[index.name]); index.current = indices[index.reference.name];
for (j = 0; j < index.reference_size; j += 1) {
label = index.reference.fields[j];
index.current_size = priv.getObjectSize(index.current[label]);
if (index.size > 0) { // check for existing entries to remove (put-update)
if (priv.searchIndexByValue(indices[index.name], doc._id, "bool")) { if (index.current_size > 0) {
return true; if (priv.searchIndexByValue(index.current[label], doc._id, "bool")) {
return true;
}
} }
} }
} }
...@@ -194,26 +207,32 @@ jIO.addStorageType('indexed', function (spec, my) { ...@@ -194,26 +207,32 @@ jIO.addStorageType('indexed', function (spec, my) {
* @return {object} indices The cleaned up file * @return {object} indices The cleaned up file
*/ */
priv.cleanIndices = function (indices, doc) { priv.cleanIndices = function (indices, doc) {
var i, j, k, index, key, l = priv.indices.length; var i, j, k, index, key, label, l = priv.indices.length;
// loop indices (indexA, indexAB...) // loop indices (indexA, indexAB...)
for (i = 0; i < l; i += 1) { for (i = 0; i < l; i += 1) {
// index object (reference and current-iteration)
index = {}; index = {};
index.reference = priv.indices[i]; index.reference = priv.indices[i];
index.reference_size = index.reference.fields.length;
index.current = indices[index.reference.name]; index.current = indices[index.reference.name];
index.current_size = priv.getObjectSize(index.current);
// loop index fields
for (j = 0; j < index.current_size; j += 1) { for (j = 0; j < index.reference_size; j += 1) {
key = priv.searchIndexByValue(index.current, doc._id, "key"); label = index.reference.fields[j];
index.result_array = index.current[key]; index.current_size = priv.getObjectSize(index.current[label]);
if (!!key) {
// if there is more than one docid in the result array, // loop field entries
// just remove this one and not the whole array for (k = 0; k < index.current_size; k += 1) {
if (index.result_array.length > 1) { key = priv.searchIndexByValue(index.current[label], doc._id, "key");
index.result_array.splice(k, 1); index.result_array = index.current[label][key];
} else { if (!!key) {
delete index.current[key]; // if there is more than one docid in the result array,
// just remove this one and not the whole array
if (index.result_array.length > 1) {
index.result_array.splice(k, 1);
} else {
delete index.current[label][key];
}
} }
} }
} }
...@@ -227,47 +246,38 @@ jIO.addStorageType('indexed', function (spec, my) { ...@@ -227,47 +246,38 @@ jIO.addStorageType('indexed', function (spec, my) {
* @param {object} doc The document which should be added to the index * @param {object} doc The document which should be added to the index
*/ */
priv.updateIndices = function (indices, doc) { priv.updateIndices = function (indices, doc) {
var i, j, k, m, index, value, label, key, l = priv.indices.length; var i, j, index, value, label, key, l = priv.indices.length;
// loop indices // loop indices
for (i = 0; i < l; i += 1) { for (i = 0; i < l; i += 1) {
// index object (reference and current-iteration)
index = {}; index = {};
index.reference = priv.indices[i]; index.reference = priv.indices[i];
index.reference_size = index.reference.fields.length; index.reference_size = index.reference.fields.length;
index.field_array = [];
index.current = indices[index.reference.name]; index.current = indices[index.reference.name];
index.current_size = priv.getObjectSize(index.current);
// build array of values to create entries in index // build array of values to create entries in index
for (j = 0; j < index.reference_size; j += 1) { for (j = 0; j < index.reference_size; j += 1) {
label = index.reference.fields[j]; label = index.reference.fields[j];
value = doc[label]; value = doc[label];
if (value !== undefined) { if (value !== undefined) {
// add a new entry index.current_size = priv.getObjectSize(index.current[label]);
index.field_array.push(value);
// remove existing entries with same docid (put-update!) // check for existing entries to remove (put-update)
if (index.current_size > 0) { if (index.current_size > 0) {
key = priv.searchIndexByValue(indices[index.reference.name], key = priv.searchIndexByValue(
doc._id, "key"); index.current[label],
doc._id,
"key"
);
if (!!key) { if (!!key) {
delete index.current[key]; delete index.current[label][key];
} }
} }
} if (index.current[label][value] === undefined) {
} index.current[label][value] = [];
// create keyword entries
if (index.current !== undefined) {
m = index.field_array.length;
if (m) {
for (k = 0; k < m; k += 1) {
index.current_keyword = [index.field_array[k]];
if (index.current[index.current_keyword] === undefined) {
index.current[index.current_keyword] = [];
}
index.current[index.current_keyword].push(doc._id);
} }
// add a new entry
index.current[label][value].push(doc._id);
} }
} }
} }
...@@ -366,7 +376,6 @@ jIO.addStorageType('indexed', function (spec, my) { ...@@ -366,7 +376,6 @@ jIO.addStorageType('indexed', function (spec, my) {
*/ */
priv.convertIndicesToQueryObject = function (indices, query_syntax) { priv.convertIndicesToQueryObject = function (indices, query_syntax) {
var use_index = priv.findBestIndexForQuery(indices, query_syntax); var use_index = priv.findBestIndexForQuery(indices, query_syntax);
return indices; return indices;
}; };
/** /**
...@@ -379,7 +388,7 @@ jIO.addStorageType('indexed', function (spec, my) { ...@@ -379,7 +388,7 @@ jIO.addStorageType('indexed', function (spec, my) {
*/ */
priv.allDocsResponseFromIndex = function (indices, include_docs, option) { priv.allDocsResponseFromIndex = function (indices, include_docs, option) {
var i, j, k, m, n = 0, l = priv.indices.length, var i, j, k, m, n = 0, l = priv.indices.length,
index, key, obj, prop, found, file, index, key, obj, prop, found, file, label,
unique_count = 0, unique_docids = [], all_doc_response = {}, unique_count = 0, unique_docids = [], all_doc_response = {},
success = function (content) { success = function (content) {
file = { value: {} }; file = { value: {} };
...@@ -408,25 +417,33 @@ jIO.addStorageType('indexed', function (spec, my) { ...@@ -408,25 +417,33 @@ jIO.addStorageType('indexed', function (spec, my) {
for (i = 0; i < l; i += 1) { for (i = 0; i < l; i += 1) {
index = {}; index = {};
index.reference = priv.indices[i]; index.reference = priv.indices[i];
index.reference_size = index.reference.fields.length;
index.current = indices[index.reference.name]; index.current = indices[index.reference.name];
index.current_size = priv.getObjectSize(index.current);
// a lot of loops, not sure this is the fastest way // a lot of loops, not sure this is the fastest way
for (j = 0; j < index.current_size; j += 1) { // loop index fields
for (key in index.current) { for (j = 0; j < index.reference_size; j += 1) {
if (index.current.hasOwnProperty(key)) { label = index.reference.fields[j];
obj = index.current[key]; index.current_field = index.current[label];
for (prop in obj) { index.current_size = priv.getObjectSize(index.current_field);
if (obj.hasOwnProperty(prop)) {
for (k = 0; k < unique_docids.length; k += 1) { // loop field id array
if (obj[prop] === unique_docids[k]) { for (j = 0; j < index.current_size; j += 1) {
found = true; for (key in index.current_field) {
break; if (index.current_field.hasOwnProperty(key)) {
obj = index.current_field[key];
for (prop in obj) {
if (obj.hasOwnProperty(prop)) {
for (k = 0; k < unique_docids.length; k += 1) {
if (obj[prop] === unique_docids[k]) {
found = true;
break;
}
}
if (!found) {
unique_docids.push(obj[prop]);
unique_count += 1;
} }
}
if (!found) {
unique_docids.push(obj[prop]);
unique_count += 1;
} }
} }
} }
...@@ -434,6 +451,7 @@ jIO.addStorageType('indexed', function (spec, my) { ...@@ -434,6 +451,7 @@ jIO.addStorageType('indexed', function (spec, my) {
} }
} }
} }
// construct allDocs response // construct allDocs response
all_doc_response.total_rows = unique_count; all_doc_response.total_rows = unique_count;
all_doc_response.rows = []; all_doc_response.rows = [];
...@@ -771,6 +789,7 @@ jIO.addStorageType('indexed', function (spec, my) { ...@@ -771,6 +789,7 @@ jIO.addStorageType('indexed', function (spec, my) {
priv.index_suffix, priv.index_suffix,
option, option,
function (response) { function (response) {
// should include_docs be possible besides complex queries?
query_syntax = command.getOption('query'); query_syntax = command.getOption('query');
if (query_syntax !== undefined) { if (query_syntax !== undefined) {
// check to see if index can do the job // check to see if index can do the job
...@@ -801,4 +820,4 @@ jIO.addStorageType('indexed', function (spec, my) { ...@@ -801,4 +820,4 @@ jIO.addStorageType('indexed', function (spec, my) {
f.getIndices(); f.getIndices();
}; };
return that; return that;
}); });
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment