/** * Get the list of facets in base to the specified query and filter * @gearman = true * @rest = false * @background = false * * @param * [in] Entity_FacetRequest facetRequestEntity Facet request entity * @param * [out] array FacetGroup */ public function getFacetsList($facetRequestEntity) { require_once 'class.solr.php'; // require_once (ROOT_PATH . // '/businessLogic/modules/SearchIndexAccess/Solr.php'); require_once 'entities/FacetGroup.php'; require_once 'entities/FacetItem.php'; require_once 'entities/SelectedFacetGroupItem.php'; require_once 'entities/FacetResult.php'; /** * *************************************************************** */ // get array of selected facet groups $facetRequestEntity->selectedFacetsString = str_replace(',,', ',', $facetRequestEntity->selectedFacetsString); // remove descriptions of selected facet groups $aGroups = explode(',', $facetRequestEntity->selectedFacetsString); $aGroups = array_filter($aGroups); // remove empty items $aSelectedFacetGroups = array(); foreach ($aGroups as $i => $value) { $gi = explode(':::', $value); $gr = explode('::', $gi[0]); $it = explode('::', $gi[1]); // create string for remove condition $count = 0; $removeCondition = str_replace($value . ',', '', $facetRequestEntity->selectedFacetsString, $count); if ($count == 0) { $removeCondition = str_replace($value, '', $facetRequestEntity->selectedFacetsString, $count); } $selectedFacetGroupData = array('selectedFacetGroupName' => $gr[0], 'selectedFacetGroupPrintName' => $gr[1], 'selectedFacetItemName' => $it[0], 'selectedFacetItemPrintName' => $it[1], 'selectedFacetRemoveCondition' => $removeCondition); $aSelectedFacetGroups[] = Entity_SelectedFacetGroupItem::createForRequest($selectedFacetGroupData); } /** * *************************************************************** */ // convert request to index request // create filters $filters = array(); if (!empty($aSelectedFacetGroups)) { // exclude facetFields and facetDates included in filter from the next // list of facets foreach ($aSelectedFacetGroups as $value) { $facetRequestEntity->facetFields = array_diff($facetRequestEntity->facetFields, array($value->selectedFacetGroupName)); $facetRequestEntity->facetDates = array_diff($facetRequestEntity->facetDates, array($value->selectedFacetGroupName)); } // $facetFields = array_diff($facetFields, // $facetInterfaceRequestEntity->selectedFacetGroups); // $facetDates = array_diff($facetDates, // $facetInterfaceRequestEntity->selectedFacetGroups); foreach ($aSelectedFacetGroups as $group) { $filters[] = $group->selectedFacetGroupName . ':' . urlencode($group->selectedFacetItemName); } } $facetRequestEntity->filters = $filters; $solr = new BpmnEngine_SearchIndexAccess_Solr($this->_solrIsEnabled, $this->_solrHost); // create list of facets $facetsList = $solr->getFacetsList($facetRequestEntity); $numFound = $facetsList->response->numFound; $facetCounts = $facetsList->facet_counts; $facetGroups = array(); // convert facet fields result to objects /** * ********************************************************************* */ // include facet field results $facetFieldsResult = $facetsList->facet_counts->facet_fields; if (!empty($facetFieldsResult)) { foreach ($facetFieldsResult as $facetGroup => $facetvalues) { if (count($facetvalues) > 0) { $data = array('facetGroupName' => $facetGroup); $data['facetGroupPrintName'] = $facetGroup; $data['facetGroupType'] = 'field'; $facetItems = array(); for ($i = 0; $i < count($facetvalues); $i += 2) { $dataItem = array(); $dataItem['facetName'] = $facetvalues[$i]; $dataItem['facetPrintName'] = $facetvalues[$i]; $dataItem['facetCount'] = $facetvalues[$i + 1]; $dataItem['facetSelectCondition'] = $facetRequestEntity->selectedFacetsString . (empty($facetRequestEntity->selectedFacetsString) ? '' : ',') . $data['facetGroupName'] . '::' . $data['facetGroupPrintName'] . ':::' . $dataItem['facetName'] . '::' . $dataItem['facetPrintName']; $newFacetItem = Entity_FacetItem::createForInsert($dataItem); $facetItems[] = $newFacetItem; } $data['facetItems'] = $facetItems; $newFacetGroup = Entity_FacetGroup::createForInsert($data); $facetGroups[] = $newFacetGroup; } } } /** * ********************************************************************* */ // include facet date ranges results $facetDatesResult = $facetsList->facet_counts->facet_dates; if (!empty($facetDatesResult)) { foreach ($facetDatesResult as $facetGroup => $facetvalues) { if (count((array) $facetvalues) > 3) { $data = array('facetGroupName' => $facetGroup); $data['facetGroupPrintName'] = $facetGroup; $data['facetGroupType'] = 'daterange'; $facetItems = array(); $facetvalueskeys = array_keys((array) $facetvalues); foreach ($facetvalueskeys as $i => $k) { if ($k != 'gap' && $k != 'start' && $k != 'end') { $dataItem = array(); if ($i < count($facetvalueskeys) - 4) { $dataItem['facetName'] = '[' . $k . '%20TO%20' . $facetvalueskeys[$i + 1] . ']'; $dataItem['facetPrintName'] = '[' . $k . '%20TO%20' . $facetvalueskeys[$i + 1] . ']'; } else { // the last group $dataItem['facetName'] = '[' . $k . '%20TO%20' . $facetvalues->end . ']'; $dataItem['facetPrintName'] = '[' . $k . '%20TO%20' . $facetvalues->end . ']'; } $dataItem['facetCount'] = $facetvalues->{$k}; $dataItem['facetSelectCondition'] = $facetRequestEntity->selectedFacetsString . (empty($facetRequestEntity->selectedFacetsString) ? '' : ',') . $data['facetGroupName'] . '::' . $data['facetGroupPrintName'] . ':::' . $dataItem['facetName'] . '::' . $dataItem['facetPrintName']; $newFacetItem = Entity_FacetItem::createForInsert($dataItem); $facetItems[] = $newFacetItem; } } $data['facetItems'] = $facetItems; $newFacetGroup = Entity_FacetGroup::createForInsert($data); $facetGroups[] = $newFacetGroup; } } } // TODO:convert facet queries // ----- /** * *************************************************************** */ // Create a filter string used in the filter of results of a datatable $filterText = ''; // the list of selected filters used for filtering result, // send in ajax foreach ($aSelectedFacetGroups as $selectedFacetGroup) { $filterText .= $selectedFacetGroup->selectedFacetGroupName . ':' . urlencode($selectedFacetGroup->selectedFacetItemName) . ','; } $filterText = substr_replace($filterText, '', -1); // $filterText = ($filterText == '')?'':'&filterText='.$filterText; /** * *************************************************************** */ // Create result $dataFacetResult = array('aFacetGroups' => $facetGroups, 'aSelectedFacetGroups' => $aSelectedFacetGroups, 'sFilterText' => $filterText); $facetResult = Entity_FacetResult::createForRequest($dataFacetResult); return $facetResult; }