From 20f28d5a17e8a9e6637c733d6a7cb7cd7dd1b827 Mon Sep 17 00:00:00 2001 From: Martii Date: Thu, 6 Aug 2015 18:30:15 -0600 Subject: [PATCH] A `findOrDefaultIfNull` issue * Rename existing query filter chained condition for a DB specific use case * Create a new query filter chain specific for using defaults * Singular the search placeholder for removed items in whatever model Closes #701 and post #490 and #700 fix --- controllers/index.js | 2 +- controllers/issue.js | 2 +- controllers/moderation.js | 4 +--- libs/modelQuery.js | 42 ++++++++++++++++++++++++++++++--------- 4 files changed, 36 insertions(+), 14 deletions(-) diff --git a/controllers/index.js b/controllers/index.js index 438598f20..0c3f5325b 100644 --- a/controllers/index.js +++ b/controllers/index.js @@ -54,7 +54,7 @@ exports.home = function (aReq, aRes) { var scriptListQuery = Script.find(); // scriptListQuery: isLib - modelQuery.findOrDefaultIfNull(scriptListQuery, 'isLib', options.librariesOnly, false); + modelQuery.findOrDefaultToNull(scriptListQuery, 'isLib', options.librariesOnly, false); // scriptListQuery: Defaults if (options.librariesOnly) { diff --git a/controllers/issue.js b/controllers/issue.js index eec787b72..6ad78bbe2 100644 --- a/controllers/issue.js +++ b/controllers/issue.js @@ -84,7 +84,7 @@ exports.list = function (aReq, aRes, aNext) { // discussionListQuery: Optionally filter discussion list options.allIssues = !aReq.params.open && !options.isOwner || listAll; if (!options.allIssues) { - modelQuery.findOrDefaultIfNull(discussionListQuery, 'open', options.openIssuesOnly, true); + modelQuery.findOrDefaultToNull(discussionListQuery, 'open', options.openIssuesOnly, true); } // Page metadata diff --git a/controllers/moderation.js b/controllers/moderation.js index 9d716b6c3..08466eb08 100644 --- a/controllers/moderation.js +++ b/controllers/moderation.js @@ -81,9 +81,7 @@ exports.removedItemListPage = function (aReq, aRes, aNext) { var removedItemListQuery = Remove.find(); // removedItemListQuery: byModel - if (options.byModel) { - modelQuery.findOrDefaultIfNull(removedItemListQuery, 'model', options.byModel, null); - } + modelQuery.findOrUseDefaultIfNull(removedItemListQuery, 'model', options.byModel, null); // removedItemListQuery: Defaults switch (options.byModel) { diff --git a/libs/modelQuery.js b/libs/modelQuery.js index 1326dabf2..d603793aa 100644 --- a/libs/modelQuery.js +++ b/libs/modelQuery.js @@ -10,19 +10,43 @@ var _ = require('underscore'); var getDefaultPagination = require('../libs/templateHelpers').getDefaultPagination; -var findOrDefaultIfNull = function (aQuery, aKey, aValue, aDefaultValue) { +// Transform a "tri-state" value condition to null for true/false/null stored DB values +// See also #701 +var findOrDefaultToNull = function (aQuery, aKey, aValue, aDefaultValue) { var conditions = []; var condition = {}; + condition[aKey] = aValue; conditions.push(condition); + if (aValue == aDefaultValue) { condition = {}; condition[aKey] = null; conditions.push(condition); } + + aQuery.and({ $or: conditions }); +}; +exports.findOrDefaultToNull = findOrDefaultToNull; + +var findOrUseDefaultIfNull = function (aQuery, aKey, aValue, aDefaultValue) { + var conditions = []; + var condition = {}; + + if (aValue === null) { + if (aDefaultValue !== null) { + aValue = aDefaultValue; + } else { + return; + } + } + + condition[aKey] = aValue; + conditions.push(condition); + aQuery.and({ $or: conditions }); }; -exports.findOrDefaultIfNull = findOrDefaultIfNull; +exports.findOrUseDefaultIfNull = findOrUseDefaultIfNull; var orderDirs = ['asc', 'desc']; var parseModelListSort = function (aModelListQuery, aOrderBy, aOrderDir, aDefaultSortFn) { @@ -284,7 +308,7 @@ exports.applyUserListQueryDefaults = function (aUserListQuery, aOptions, aReq) { var removedItemUserListQueryDefaults = { defaultSort: '-removed', parseSearchQueryFn: parseRemovedItemSearchQuery, - searchBarPlaceholder: 'Search Removed Items in Users', + searchBarPlaceholder: 'Search Removed Items in User', searchBarFormHiddenVariables: [ { name: 'byModel', value: 'User' } ], @@ -298,7 +322,7 @@ exports.applyRemovedItemUserListQueryDefaults = function (aRemovedItemUserListQu var removedItemScriptListQueryDefaults = { defaultSort: '-removed', parseSearchQueryFn: parseRemovedItemSearchQuery, - searchBarPlaceholder: 'Search Removed Items in Scripts', + searchBarPlaceholder: 'Search Removed Items in Script', searchBarFormHiddenVariables: [ { name: 'byModel', value: 'Script' } ], @@ -312,7 +336,7 @@ exports.applyRemovedItemScriptListQueryDefaults = function (aRemovedItemScriptLi var removedItemCommentListQueryDefaults = { defaultSort: '-removed', parseSearchQueryFn: parseRemovedItemSearchQuery, - searchBarPlaceholder: 'Search Removed Items in Comments', + searchBarPlaceholder: 'Search Removed Items in Comment', searchBarFormHiddenVariables: [ { name: 'byModel', value: 'Comment' } ], @@ -326,7 +350,7 @@ exports.applyRemovedItemCommentListQueryDefaults = function (aRemovedItemComment var removedItemDiscussionListQueryDefaults = { defaultSort: '-removed', parseSearchQueryFn: parseRemovedItemSearchQuery, - searchBarPlaceholder: 'Search Removed Items in Discussions', + searchBarPlaceholder: 'Search Removed Items in Discussion', searchBarFormHiddenVariables: [ { name: 'byModel', value: 'Discussion' } ], @@ -340,7 +364,7 @@ exports.applyRemovedItemDiscussionListQueryDefaults = function (aRemovedItemDisc var removedItemFlagListQueryDefaults = { defaultSort: '-removed', parseSearchQueryFn: parseRemovedItemSearchQuery, - searchBarPlaceholder: 'Search Removed Items in Flags', + searchBarPlaceholder: 'Search Removed Items in Flag', searchBarFormHiddenVariables: [ { name: 'byModel', value: 'Flag' } ], @@ -354,7 +378,7 @@ exports.applyRemovedItemFlagListQueryDefaults = function (aRemovedItemFlagListQu var removedItemGroupListQueryDefaults = { defaultSort: '-removed', parseSearchQueryFn: parseRemovedItemSearchQuery, - searchBarPlaceholder: 'Search Removed Items in Groups', + searchBarPlaceholder: 'Search Removed Items in Group', searchBarFormHiddenVariables: [ { name: 'byModel', value: 'Group' } ], @@ -368,7 +392,7 @@ exports.applyRemovedItemGroupListQueryDefaults = function (aRemovedItemGroupList var removedItemVoteListQueryDefaults = { defaultSort: '-removed', parseSearchQueryFn: parseRemovedItemSearchQuery, - searchBarPlaceholder: 'Search Removed Items in Votes', + searchBarPlaceholder: 'Search Removed Items in Vote', searchBarFormHiddenVariables: [ { name: 'byModel', value: 'Vote' } ],