// 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;