// Set the Custom Field for the Search Results Query variables.resultsFacetFieldSpecs = StructNew(); // CommonSpot Search API logging variables.enableSolrDebugLog = false; //true/false super.init(); //addQueryField("_version_","bigint","0"); // The custom field query fields to the Search Results Query _addCustomQueryFields(variables.resultsFacetFieldSpecs); enableDebugLogging(variables.enableSolrDebugLog); return this; variables.resultsFacetFieldSpecs = arguments.facetSpecs; return variables.resultsFacetFieldSpecs; var key = ""; var fldName = ""; var fldType = "varchar"; var fldDefaultVal = ""; // Loop over the Field Specs Assoc Array to add the Custom Fields to the Results Query for ( key IN arguments.fieldSpecs ) { fldName = key; fldType = "varchar"; fldDefaultVal = ""; if ( StructKeyExists(arguments.fieldSpecs[key],"resultscoltype") AND LEN(TRIM(arguments.fieldSpecs[key].resultscoltype)) ) fldType = arguments.fieldSpecs[key].resultscoltype; if ( fldType EQ "integer" OR fldType EQ "bit" ) fldDefaultVal = 0; // Only add column if the Type is NOT empty or NONE if ( LEN(TRIM(fldName)) AND fldType NEQ "none" ) { // Call Search Method Add the Custom Fields to the Search Results Query addQueryField(fldName,fldType,fldDefaultVal); } } return Arguments.args; return super.search(argumentcollection=arguments); var retArr = super.prepareCriteriaParams(argumentCollection=Arguments); return retArr; var fld = ""; if (StructCount(Arguments.target) EQ 0) // no fields to merge with return Arguments.source; // ... merge is simple - just take everything from the second if (StructCount(Arguments.source) EQ 0) // second is empty, so first can be returned untouched return Arguments.target; // ... merge is simple - just take everything from the first for (fld IN Arguments.source) { if (NOT StructKeyExists(Arguments.target,fld)) Arguments.target[fld] = Arguments.source[fld]; else if (NOT IsStruct(Arguments.target[fld])) Arguments.target[fld] = ListAppend(Arguments.target[fld],Arguments.source[fld]); // else... do nothing... this is just a test } return Arguments.target; // yes, this modifies the input param... ideally, it wouldn't, but in this use case, it's both the right thing and optimal var rval = StructNew(); var resData = StructNew(); rval.status = ''; rval.qtime = ''; rval.facetFields = StructNew(); if ( StructKeyExists(Arguments.queryData,"response") AND IsStruct(Arguments.queryData.response) ) resData = Arguments.queryData.response; // will need to verify that 'response' and 'response.responseHeader' actually exist if ( StructKeyExists(resData,"responseHeader") ) { if ( StructKeyExists(resData.responseHeader,"status") ) rval.status = resData.responseHeader.status; if ( StructKeyExists(resData.responseHeader,"qtime") ) rval.qtime = resData.responseHeader.qtime; } // Facet Fields JSON response if ( StructKeyExists(resData,"facet_counts") AND StructKeyExists(resData.facet_counts,"facet_fields") AND IsStruct(resData.facet_counts.facet_fields) ) { rval.facetFields = resData.facet_counts.facet_fields; } return rval; var facet_fields = Arguments.facetResults; var facets = StructNew(); var childArray = ArrayNew(1); var j = 0; var facetName = ''; var count = 0; var facetValue = ''; // loop over facets for( facetName IN facet_fields ) { facets[facetName] = StructNew(); childArray = facet_fields[facetName]; // loop over facet values & counts for( j=1; j lte ArrayLen(childArray); j=j+1 ) { if ( j MOD 2 ) facetValue = childArray[j]; else count = childArray[j]; if ( LEN(TRIM(facetValue)) AND IsNumeric(count) ) facets[facetName][facetValue] = count; } } return facets; var retStruct = Duplicate(arguments.structA); var tmpStructB = arguments.structB; var keyB = ""; var subKeyB = ""; for ( keyB IN tmpStructB ) { if ( StructKeyExists(retStruct,keyB) ) { if ( isStruct(retStruct[keyB]) AND isStruct(tmpStructB[keyB]) ) { for ( subKeyB IN tmpStructB[keyB] ) { if ( StructKeyExists(retStruct[keyB],subKeyB ) ) { // Make sure we have numeric values if ( !IsNumeric(retStruct[keyB][subKeyB]) ) retStruct[keyB][subKeyB] = 0; if ( !IsNumeric(tmpStructB[keyB][subKeyB]) ) tmpStructB[keyB][subKeyB] = 0; // Add Counts Together retStruct[keyB][subKeyB] = (VAL(retStruct[keyB][subKeyB]) + VAL(tmpStructB[keyB][subKeyB])); } else { retStruct[keyB][subKeyB] = tmpStructB[keyB][subKeyB]; } } } else { if ( isStruct(retStruct[keyB]) AND !isStruct(tmpStructB[keyB]) ) { // Skip merging the data in this key and we will keep the original values } else if ( !isStruct(retStruct[keyB]) AND isStruct(tmpStructB[keyB]) ) { // Use the structure and values from tmpStructB[keyB] retStruct[keyB] = tmpStructB[keyB]; } else { // Any other scenario... // Skip merging the data in this key and we will keep the original values } } } else { retStruct[keyB] = tmpStructB[keyB]; } } return retStruct;