From d7ced9480eb95f1153dde0efff2c621eecdd6676 Mon Sep 17 00:00:00 2001 From: vnmedeiros Date: Fri, 26 Apr 2019 09:55:16 -0300 Subject: [PATCH] show all terms in the hierarchical search. --- .../repositories/class-tainacan-metadata.php | 39 +++++------- tests/test-facets.php | 60 +++++++++++++------ 2 files changed, 56 insertions(+), 43 deletions(-) diff --git a/src/classes/repositories/class-tainacan-metadata.php b/src/classes/repositories/class-tainacan-metadata.php index d8d90c700..c20214707 100644 --- a/src/classes/repositories/class-tainacan-metadata.php +++ b/src/classes/repositories/class-tainacan-metadata.php @@ -1042,40 +1042,28 @@ class Metadata extends Repository { } else { - $search_q = ''; - if (!empty($search)) { - /** - * We need all children to figure out what parents have items on their descendants, but we want - * to filter only the terms with the search string - */ - $search_q = $wpdb->prepare("AND (tt.parent <> %d OR t.name LIKE %s)", $args['parent_id'], '%' . $search . '%'); - } - $base_query = $wpdb->prepare(" SELECT DISTINCT t.term_id, t.name, tt.parent, coalesce(tr.term_taxonomy_id, 0) as have_items FROM $wpdb->terms t INNER JOIN $wpdb->term_taxonomy tt ON t.term_id = tt.term_id LEFT JOIN $wpdb->term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id AND tr.object_id IN ($items_query) - WHERE tt.taxonomy = %s $search_q - ORDER BY t.name ASC - ", - $taxonomy_slug + WHERE tt.taxonomy = %s ORDER BY t.name ASC", $taxonomy_slug ); $all_hierarchy = $wpdb->get_results($base_query); - $results = $this->_process_terms_tree($all_hierarchy, $args['parent_id']); + if (empty($search)) { + $results = $this->_process_terms_tree($all_hierarchy, $args['parent_id'], 'parent'); + } else { + $results = $this->_process_terms_tree($all_hierarchy, $search, 'name'); + } + $total = count($results); if ( $args['offset'] >= 0 && $args['number'] >= 1 ) { $results = array_slice($results, (int) $args['offset'], (int) $args['number']); } - - - - } - } else { $base_query = $wpdb->prepare("FROM $wpdb->term_taxonomy tt @@ -1262,7 +1250,7 @@ class Metadata extends Repository { * * This method is public only for tests purposes, it should not be used anywhere else */ - public function _process_terms_tree($tree, $search_parent) { + public function _process_terms_tree($tree, $search_value, $search_type='parent') { $h_map = []; $results = []; @@ -1273,7 +1261,8 @@ class Metadata extends Repository { $h->have_items = 1; $h_map[$h->term_id] = $h; - if ($h->parent == $search_parent) { + if(($search_type == 'parent' && $h->parent == $search_value) || + ($search_type == 'name' && $h->have_items > 0 && strpos(strtolower($h->name), strtolower($search_value)) !== false)) { $results[$h->term_id] = $h; } @@ -1287,7 +1276,8 @@ class Metadata extends Repository { $h_map[$_parent]->have_items = 1; if ( isset($h_map[$_parent]->parent) ) { - if ($h_map[$_parent]->parent == $search_parent) { + if(($search_type == 'parent' && $h->parent == $search_value) || + ($search_type == 'name' && $h->have_items > 0 && strpos(strtolower($h->name), strtolower($search_value)) !== false)) { $results[$h_map[$_parent]->term_id] = $h_map[$_parent]; } $_parent = $h_map[$_parent]->parent; @@ -1302,11 +1292,12 @@ class Metadata extends Repository { if ( $h->parent > 0 && !isset($h_map[$h->parent]) ) { $h_map[$h->parent] = (object)['have_items' => $h->have_items]; } - if ($h->parent == $search_parent) { + if(($search_type == 'parent' && $h->parent == $search_value) || + ($search_type == 'name' && $h->have_items > 0 && strpos(strtolower($h->name), strtolower($search_value)) !== false)) { $results[$h->term_id] = $h; } } - + } // Results have all terms with wanted parent. Now we unset those who dont have items diff --git a/tests/test-facets.php b/tests/test-facets.php index 23bd0da6a..03eb32376 100644 --- a/tests/test-facets.php +++ b/tests/test-facets.php @@ -40,27 +40,27 @@ class Facets extends TAINACAN_UnitApiTestCase { $this->collection2 = $collection2; $taxonomy = $this->tainacan_entity_factory->create_entity( - 'taxonomy', - array( - 'name' => 'genero', - 'description' => 'tipos de musica', - 'allow_insert' => 'yes', + 'taxonomy', + array( + 'name' => 'genero', + 'description' => 'tipos de musica', + 'allow_insert' => 'yes', 'status' => 'publish' - ), - true + ), + true ); $this->taxonomy = $taxonomy; $taxonomy2 = $this->tainacan_entity_factory->create_entity( - 'taxonomy', - array( - 'name' => 'genero2', - 'description' => 'tipos de musica2', - 'allow_insert' => 'yes', + 'taxonomy', + array( + 'name' => 'genero2', + 'description' => 'tipos de musica2', + 'allow_insert' => 'yes', 'status' => 'publish' - ), - true + ), + true ); $this->taxonomy = $taxonomy; @@ -781,20 +781,42 @@ class Facets extends TAINACAN_UnitApiTestCase { $this->assertContains( 'Value 55', $valuesParsed); $this->assertContains( 'Value 77', $valuesParsed); - // test count items normal + // test count items normal - // test default taxonomy + // test default taxonomy $values = $this->repository->fetch_all_metadatum_values( $this->meta_3_tax->get_id()); $values = $this->get_values($values); $this->assertEquals(2, sizeof($values)); - // test default taxonomy without filter + // test default taxonomy without filter $values = $this->repository->fetch_all_metadatum_values( $this->meta_3_tax->get_id(), [ 'items_filter' => false ]); $values = $this->get_values($values); $this->assertEquals(2, sizeof($values)); - // test search taxonomy + + //test search taxonomy + $values = $this->repository->fetch_all_metadatum_values( $this->meta_3_tax->get_id(), [ + 'items_filter' => [ 'parent_id' => 0], + 'search' => 't2', + ]); + $values = $this->get_values($values); + $this->assertEquals(1, sizeof($values)); + + $values = $this->repository->fetch_all_metadatum_values( $this->meta_3_tax->get_id(), [ + 'items_filter' => [ 'parent_id' => 0], + 'search' => 'Children', + ]); + $values = $this->get_values($values); + $this->assertEquals(5, sizeof($values)); + + $values = $this->repository->fetch_all_metadatum_values( $this->meta_3_tax->get_id(), [ + 'items_filter' => [ 'parent_id' => 0], + 'search' => 'GGC', + ]); + $values = $this->get_values($values); + $this->assertEquals(1, sizeof($values)); + // test search taxonomy with filter // test search taxonomy without filter // test offset taxonomy @@ -998,9 +1020,9 @@ class Facets extends TAINACAN_UnitApiTestCase { foreach ($parents as $parent) { for($i=0; $i < $items_repeat; $i++) { $rando_h = rand (1, $h); - $rando_c = rand (1, $nchildrens) - 1; $id = $parent; for ($count=0; $count < $rando_h; $count++ ) { + $rando_c = rand (1, $nchildrens) - 1; $idx = ($id * $nchildrens) + $rando_c; if($idx > count($data)-1) { $idx = ($parent * $nchildrens) + $rando_c;