/** @internal * @brief Add options specific to facets * * Currently managed options are: * - <tt>facet stickyness</tt> to defined global et specific facet stickyness. * - <tt>facet order</tt> when using strict strict ordering mode. * * @param $query [in] Query along with its configuration. * @param $params [in-out] array of parameter to update with facet options. */ private function add_facet_options(AfsQuery $query, &$params) { $facet_mgr = $query->get_facet_manager(); if ($facet_mgr->get_default_stickyness()) { if (!array_key_exists('afs:facetDefault', $params)) { $params['afs:facetDefault'] = array(); } $params['afs:facetDefault'][] = 'sticky=true'; $default_sticky = true; } else { $default_sticky = false; } if ($facet_mgr->has_facets()) { if (empty($params['afs:facet'])) { $params['afs:facet'] = array(); } foreach ($facet_mgr->get_facets() as $name => $facet) { $sticky = $facet_mgr->is_sticky($facet); if ($default_sticky != $sticky) { $params['afs:facet'][] = $name . ',sticky=' . ($sticky ? 'true' : 'false'); } if (!is_null($sort_order = $facet->get_values_sort_order())) { list($sort, $order) = $sort_order->format(); $params['afs:facet'][] = $name . ',sort=' . $sort; $params['afs:facet'][] = $name . ',order=' . $order; } } } if ($facet_mgr->is_facet_order_strict()) { $params['afs:facetOrder'] = implode(',', array_keys($facet_mgr->get_facets())); } }
/** @brief Constructs new instance of facet helper. * * @param $facet [in] root facet element. * @param $query [in] @a AfsQuery which has produced current reply. * @param $config [in] helper configuration object. */ public function __construct($facet, AfsQuery $query, AfsHelperConfiguration $config, $feed = null) { $this->id = $facet->id; if (property_exists($facet, 'labels') && !empty($facet->labels)) { $this->labels = $facet->labels; } if (property_exists($facet, 'tags')) { $this->tags = $facet->tags; } $this->layout = $facet->layout; $this->type = $facet->type; if (property_exists($facet, 'sticky') && 0 == strcmp('true', $facet->sticky)) { $this->sticky = true; } else { $this->sticky = false; } $facet_manager = $query->get_facet_manager(); $facet_manager->check_or_add_facet(new AfsFacet($this->id, $this->type, $this->layout)); $builder = new AfsFacetElementBuilder($facet_manager, $query); $this->elements = $builder->create_elements($this->id, $facet, $config, $feed); }
public function testSmoothFacetSortOrder() { $query = new AfsQuery(); $this->assertFalse($query->get_facet_manager()->is_facet_order_strict()); }
public function testFacetStrictOrder() { $query = new AfsQuery(); $facet_mgr = $query->get_facet_manager(); $sort = array('FOO', 'BAR'); $facet_mgr->set_facet_order($sort, AfsFacetOrder::STRICT); $this->qm->send($query); $params = $this->connector->get_parameters(); $this->assertTrue(array_key_exists('afs:facetOrder', $params)); $this->assertEquals(implode(',', $sort), $params['afs:facetOrder']); }
public function testLazyFacetOrderingMoreFacetsDeclaredThanPresentInReply() { $input = json_decode('{ "header": { "query": { "userId": "afd070b6-4315-40cc-975d-747e28bf132a", "sessionId": "5bf5642d-a262-4608-9901-45aa6e87325d" }, "performance": { "durationMs": 666 } }, "replySet": [ { "meta": { "uri": "Test", "totalItems": 200, "totalItemsIsExact": true, "pageItems": 2, "firstPageItem": 3, "lastPageItem": 4, "durationMs": 42, "firstPaFId": 1, "lastPaFId": 1, "producer": "SEARCH" }, "facets": { "facet": [ { "afs:t": "FacetInterval", "interval": [ { "key": "[3 .. 6]", "items": 1 } ], "layout": "INTERVAL", "type": "DATE", "id": "Baz" }, { "afs:t": "FacetInterval", "interval": [ { "key": "[3 .. 6]", "items": 1 } ], "layout": "INTERVAL", "type": "INTEGER", "id": "Bar" }, { "afs:t": "FacetInterval", "interval": [ { "key": "[0 .. 3]", "items": 1 } ], "layout": "INTERVAL", "type": "REAL", "id": "Foo" } ] } } ] }'); $config = new AfsHelperConfiguration(); $query = new AfsQuery(); $facet_mgr = $query->get_facet_manager(); $facet_mgr->set_facet_order(array('Foo', 'Bal', 'Bar'), AfsFacetOrder::LAX); $this->assertTrue($facet_mgr->has_facet('Foo')); $this->assertTrue($facet_mgr->has_facet('Bal')); $this->assertTrue($facet_mgr->has_facet('Bar')); $this->assertFalse($facet_mgr->has_facet('Baz')); $helper = new AfsReplysetHelper($input->replySet[0], $query, $config); $this->assertEquals(AfsFacetType::REAL_TYPE, $facet_mgr->get_facet('Foo')->get_type()); $this->assertEquals(AfsFacetType::INTEGER_TYPE, $facet_mgr->get_facet('Bar')->get_type()); $facets = $helper->get_facets(); $this->assertEquals(3, count($facets)); $this->assertEquals('Foo', $facets[0]->get_id()); $this->assertEquals('Bar', $facets[1]->get_id()); $this->assertEquals('Baz', $facets[2]->get_id()); }
public function testFacetElementBuilderOnTreeNode() { $input = json_decode('{ "afs:t": "FacetTree", "node": [ { "key": "2010", "labels": [ { "lang": "FR", "region": "FR", "label": "2010" } ], "items": 24, "node": [ { "key": "2010-03", "labels": [ { "lang": "FR", "region": "FR", "label": "03" } ], "items": 14, "node": [ { "key": "2010-03-07", "labels": [ { "lang": "FR", "region": "FR", "label": "07" } ], "items": 4 } ] } ] } ], "layout": "TREE", "type": "DATE", "id": "TREE_DATE", "labels": [ { "label": "Tree date" } ] }'); $query = new AfsQuery(); $config = new AfsHelperConfiguration(); $config->set_helper_format(AfsHelperFormat::HELPERS); $facet_mgr = $query->get_facet_manager(); $facet_mgr->add_facet(new AfsFacet('TREE_DATE', AfsFacetType::DATE_TYPE)); $builder = new AfsFacetElementBuilder($facet_mgr, $query); $elems = $builder->create_elements('TREE_DATE', $input, $config); $this->assertEquals(count($elems), 1); $elem = reset($elems); $this->assertEquals($elem->label, '2010'); $this->assertEquals($elem->count, 24); $this->assertFalse($elem->active); $this->assertTrue($elem->query->has_filter('TREE_DATE', '"2010"')); $this->assertEquals(count($elem->values), 1); $elem = $elem->values[0]; $this->assertEquals($elem->label, '03'); $this->assertEquals($elem->count, 14); $this->assertFalse($elem->active); $this->assertTrue($elem->query->has_filter('TREE_DATE', '"2010-03"')); $this->assertEquals(count($elem->values), 1); $elem = $elem->values[0]; $this->assertEquals($elem->label, '07'); $this->assertEquals($elem->count, 4); $this->assertFalse($elem->active); $this->assertTrue($elem->query->has_filter('TREE_DATE', '"2010-03-07"')); $this->assertEquals(count($elem->values), 0); }