/*global define */ define(['jquery', 'underscore', 'backbone', 'models/Search'], function($, _, Backbone, SearchModel) { 'use strict'; /** * @class LogsSearch * @classdesc Searches the DataONE aggregated event logs. The DataONE Metrics Service has replaced * the DataONE event log service. * @deprecated * @classcategory Deprecated */ var LogsSearch = SearchModel.extend({ // This model contains all of the search/filter terms /* * Search filters can be either plain text or a filter object with the following options: * filterLabel - text that will be displayed in the filter element in the UI * label - text that will be displayed in the autocomplete list * value - the value that will be included in the query * description - a longer text description of the filter value * @classcategory Models */ defaults: function(){ return { all: [], dateLogged: [], nodeId: MetacatUI.appModel.get("nodeId") || null, id: [], pid: [], event: [], userAgent: [], dateAggregated: [], inPartialRobotList: "false", isRepeatVisit: "false", isPublic: [], entryId: [], city: [], region: [], country: [], location: [], geohashes: [], geohashLevel: 9, geohashGroups: {}, username: [], size: [], formatId: [], formatType: [], exclude: [{ field: null, value: null }], facets: [], facetRanges: [], facetRangeStart: function(){ var twentyYrsAgo = new Date(); twentyYrsAgo.setFullYear( twentyYrsAgo.getFullYear() - 20 ); return twentyYrsAgo.toISOString(); }(), facetRangeEnd: function(){ var now = new Date(); return now.toISOString(); }(), facetRangeGap: "%2B1MONTH", facetMinCount: "1" } }, initialize: function(){ this.listenTo(this, "change:geohashes", this.groupGeohashes); }, //Map the filter names to their index field names fieldNameMap: { all: "", dateLogged: "dateLogged", datasource: "nodeId", nodeId: "nodeId", id: "id", pid: "pid", event: "event", userAgent: "userAgent", dateAggregated: "dateAggregated", isPublic: "isPublic", entryId: "entryId", city: "city", region: "region", country: "country", location: "location", size: "size", username: "rightsHolder", formatId: "formatId", formatType: "formatType", inPartialRobotList : "inPartialRobotList", inFullRobotList : "inFullRobotList", isRepeatVisit : "isRepeatVisit" }, setNodeId: function(){ if(MetacatUI.nodeModel.get("currentMemberNode")) this.set("nodeId", MetacatUI.nodeModel.get("currentMemberNode")); }, /* * Get the query string based on the attributes set in this model */ getQuery: function(){ var query = "", model = this; var otherFilters = ["event", "formatType", "formatId", "id", "pid", "userAgent", "inPartialRobotList", "inFullRobotList", "isRepeatVisit", "dateAggregated", "dateLogged", "entryId", "city", "region", "location", "size", "username"]; //-------nodeId-------- //Update the Node Id if(!this.get("nodeId")) this.setNodeId(); if(this.filterIsAvailable("nodeId") && this.get("nodeId")){ var value = this.get("nodeId"); //Don't filter by nodeId when it is set to a CN if((typeof value == "string") && (value.substr(value.lastIndexOf(":")+1, 2).toLowerCase() != "cn")){ //For multiple values if(Array.isArray(value) && value.length){ query += "+" + model.getGroupedQuery(model.fieldNameMap["nodeId"], value, { operator: "OR", subtext: false }); } else if(value && value.length){ // Does this need to be wrapped in quotes? if(model.needsQuotes(value)) value = "%22" + encodeURIComponent(value) + "%22"; else value = model.escapeSpecialChar(encodeURIComponent(value)); query += "+" + model.fieldNameMap["nodeId"] + ":" + value; } } else if(Array.isArray(value)){ query += "+" + model.getGroupedQuery(model.fieldNameMap["nodeId"], value, { operator: "OR", subtext: false }); } } //-----Other Filters/Basic Filters----- _.each(otherFilters, function(filterName){ if(model.filterIsAvailable(filterName)){ var filterValue = null; var filterValues = model.get(filterName); //Check that this filter is set if((typeof filterValues == "undefined") || !filterValues) return; //For multiple values if(Array.isArray(filterValues) && filterValues.length){ query += "+" + model.getGroupedQuery(model.fieldNameMap[filterName], filterValues, { operator: "OR", subtext: false }); } else if(filterValues && filterValues.length){ // Does this need to be wrapped in quotes? if(model.needsQuotes(filterValues)) filterValues = "%22" + encodeURIComponent(filterValues) + "%22"; else filterValues = model.escapeSpecialChar(encodeURIComponent(filterValues)); query += "+" + model.fieldNameMap[filterName] + ":" + filterValues; } } }); return query; }, getFacetQuery: function(){ var query = "&facet=true&facet.limit=-1&facet.mincount=" + this.get("facetMinCount"), model = this; if(typeof this.get("facets") == "string") this.set("facets", [this.get("facets")]); _.each(this.get("facets"), function(facetField, i, list){ if(model.filterIsAvailable(facetField)){ query += "&facet.field=" + facetField; } }); _.each(this.get("facetRanges"), function(facetField, i, list){ if(model.filterIsAvailable(facetField)){ query += "&facet.range=" + facetField + "&facet.range.start=" + model.get("facetRangeStart") + "&facet.range.end=" + model.get("facetRangeEnd") + "&facet.range.gap=" + model.get("facetRangeGap"); return; } }); return query; } }); return LogsSearch; });