diff -u b/views/range_handler_argument_numeric_range.inc b/views/range_handler_argument_numeric_range.inc --- b/views/range_handler_argument_numeric_range.inc +++ b/views/range_handler_argument_numeric_range.inc @@ -16,7 +16,7 @@ public function option_definition() { $options = parent::option_definition(); - $options['operator'] = array('default' => 'within', 'bool' => FALSE); + $options['operator'] = array('default' => 'within'); $options['include_endpoints'] = array('default' => FALSE, 'bool' => TRUE); return $options; @@ -51,7 +51,6 @@ * {@inheritdoc} */ public function query($group_by = FALSE) { - $this->ensure_my_table(); list($field_from, $field_to) = $this->get_range_subfields(); $operators = array( @@ -85,6 +84,7 @@ * FROM and TO values database field names. */ protected function get_range_subfields() { + $this->ensure_my_table(); return array( $this->table_alias . '.' . $this->definition['additional fields']['from'], $this->table_alias . '.' . $this->definition['additional fields']['to'] @@ -111,13 +111,13 @@ protected function op_within_query($operator, $field_from, $field_to, $op_left, $op_right) { if ($operator === 'within') { $filter = $this->query->createFilter('AND'); - $filter->condition($field_from, $this->value, $op_left); - $filter->condition($field_to, $this->value, $op_right); + $filter->condition($field_from, $this->argument, $op_left); + $filter->condition($field_to, $this->argument, $op_right); } else { $filter = $this->query->createFilter('OR'); - $filter->condition($field_from, $this->value, $op_right, $this->options['group']); - $filter->condition($field_to, $this->value, $op_left, $this->options['group']); + $filter->condition($field_from, $this->argument, $op_right); + $filter->condition($field_to, $this->argument, $op_left); } $this->query->filter($filter); } diff -u b/views/range_handler_filter_numeric_range.inc b/views/range_handler_filter_numeric_range.inc --- b/views/range_handler_filter_numeric_range.inc +++ b/views/range_handler_filter_numeric_range.inc @@ -88,7 +88,6 @@ * {@inheritdoc} */ public function query() { - $this->ensure_my_table(); list($field_from, $field_to) = $this->get_range_subfields(); $info = $this->operators(); @@ -131,6 +130,7 @@ * FROM and TO values database field names. */ protected function get_range_subfields() { + $this->ensure_my_table(); return array( $this->table_alias . '.' . $this->definition['additional fields']['from'], $this->table_alias . '.' . $this->definition['additional fields']['to'] @@ -172,8 +172,8 @@ } else { $filter = $this->query->createFilter('OR'); - $filter->condition($field_from, $this->value, $op_right, $this->options['group']); - $filter->condition($field_to, $this->value, $op_left, $this->options['group']); + $filter->condition($field_from, $this->value, $op_right); + $filter->condition($field_to, $this->value, $op_left); } $this->query->filter($filter); } only in patch2: unchanged: --- a/range.info +++ b/range.info @@ -5,6 +5,9 @@ core = 7.x dependencies[] = field test_dependencies[] = i18n_field +test_dependencies[] = search_api +test_dependencies[] = search_api_db +test_dependencies[] = search_api_views test_dependencies[] = views ; Tests only in patch2: unchanged: --- a/tests/views/range.views.argument.test +++ b/tests/views/range.views.argument.test @@ -22,34 +22,26 @@ class RangeViewsArgumentTestCase extends RangeViewsBaseTestCase { } /** - * {@inheritdoc} + * Tests range field views argument. */ - protected function setUp(array $modules = array()) { - parent::setUp($modules); - - // Add some basic test nodes. - $ranges = array( - array('from' => 0, 'to' => 10), - array('from' => 5, 'to' => 9), - array('from' => -5, 'to' => 15), - array('from' => -10, 'to' => 5), - ); - foreach ($ranges as $range) { - $this->nodes[] = $this->drupalCreateNode(array( - 'type' => $this->contentType, - $this->fieldName => array( - LANGUAGE_NONE => array($range), - ), - )); - } + public function testRangeFieldViewsArgument() { + $view = $this->getRangeFieldViewsArgumentTestView(); + $this->_testRangeViewsArgument($view); } /** - * Tests range views argument. + * Tests range search API views argument. */ - public function testRangeViewsArgument() { - $view = $this->getTestRangeArgumentView(); + public function testRangeSearchApiViewsArgument() { + $this->createSearchServerAndIndex(); + $view = $this->getRangeSearchApiViewsArgumentTestView(); + $this->_testRangeViewsArgument($view); + } + /** + * Range views argument test runner. + */ + protected function _testRangeViewsArgument($view) { // Range contains, exclude endpoints. $view->set_display('default'); $view->init_handlers(); @@ -73,7 +65,6 @@ class RangeViewsArgumentTestCase extends RangeViewsBaseTestCase { array('nid' => $this->nodes[0]->nid), array('nid' => $this->nodes[1]->nid), array('nid' => $this->nodes[2]->nid), - array('nid' => $this->nodes[3]->nid), ); $this->assertIdenticalResultset($view, $expected_result, $this->map, 'Range views argument (contains, include endpoints) produces correct results'); $view->destroy(); @@ -96,7 +87,7 @@ class RangeViewsArgumentTestCase extends RangeViewsBaseTestCase { $view->init_handlers(); $view->argument[$this->fieldName]->options['operator'] = 'not within'; $view->argument[$this->fieldName]->options['include_endpoints'] = TRUE; - $this->executeView($view, array(9)); + $this->executeView($view, array(5)); $expected_result = array( array('nid' => $this->nodes[3]->nid), ); @@ -105,12 +96,12 @@ class RangeViewsArgumentTestCase extends RangeViewsBaseTestCase { } /** - * Returns test view. + * Returns view for testing range field views argument. * - * @return \view + * @return view * View object. */ - protected function getTestRangeArgumentView() { + protected function getRangeFieldViewsArgumentTestView() { $view = new view(); $view->name = 'test_range_argument'; $view->description = ''; @@ -150,4 +141,54 @@ class RangeViewsArgumentTestCase extends RangeViewsBaseTestCase { return $view; } + /** + * Returns view for testing range search API views argument. + * + * @return view + * View object. + */ + protected function getRangeSearchApiViewsArgumentTestView() { + $view = new view(); + $view->name = 'test_range_search_api_argument'; + $view->description = ''; + $view->tag = 'default'; + $view->base_table = 'search_api_index_test_index'; + $view->human_name = 'test_range_search_api_argument'; + $view->core = 7; + $view->api_version = '3.0'; + $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ + + /* Display: Master */ + $handler = $view->new_display('default', 'Master', 'default'); + $handler->display->display_options['use_more_always'] = FALSE; + $handler->display->display_options['access']['type'] = 'none'; + $handler->display->display_options['cache']['type'] = 'none'; + $handler->display->display_options['query']['type'] = 'views_query'; + $handler->display->display_options['exposed_form']['type'] = 'basic'; + $handler->display->display_options['pager']['type'] = 'full'; + $handler->display->display_options['style_plugin'] = 'default'; + $handler->display->display_options['row_plugin'] = 'fields'; + /* Field: Indexed Node: Node ID */ + $handler->display->display_options['fields']['nid']['id'] = 'nid'; + $handler->display->display_options['fields']['nid']['table'] = 'search_api_index_test_index'; + $handler->display->display_options['fields']['nid']['field'] = 'nid'; + $handler->display->display_options['fields']['nid']['label'] = ''; + $handler->display->display_options['fields']['nid']['element_label_colon'] = FALSE; + $handler->display->display_options['fields']['nid']['link_to_entity'] = 0; + /* Sort criterion: Indexed Node: Entity ID */ + $handler->display->display_options['sorts']['search_api_id']['id'] = 'search_api_id'; + $handler->display->display_options['sorts']['search_api_id']['table'] = 'search_api_index_test_index'; + $handler->display->display_options['sorts']['search_api_id']['field'] = 'search_api_id'; + /* Contextual filter: Indexed Node: Range integer range argument */ + $handler->display->display_options['arguments']['field_range_integer']['id'] = 'field_range_integer'; + $handler->display->display_options['arguments']['field_range_integer']['table'] = 'search_api_index_test_index'; + $handler->display->display_options['arguments']['field_range_integer']['field'] = 'field_range_integer'; + $handler->display->display_options['arguments']['field_range_integer']['default_argument_type'] = 'fixed'; + $handler->display->display_options['arguments']['field_range_integer']['summary']['number_of_records'] = '0'; + $handler->display->display_options['arguments']['field_range_integer']['summary']['format'] = 'default_summary'; + $handler->display->display_options['arguments']['field_range_integer']['summary_options']['items_per_page'] = '25'; + + return $view; + } + } only in patch2: unchanged: --- a/tests/views/range.views.base.test +++ b/tests/views/range.views.base.test @@ -41,10 +41,20 @@ abstract class RangeViewsBaseTestCase extends ViewsTestCase { protected $nodes = array(); /** + * View result columns map. + * + * @var array + */ + protected $map = array('nid' => 'nid'); + + /** * {@inheritdoc} */ protected function setUp(array $modules = array()) { $modules[] = 'range'; + $modules[] = 'search_api'; + $modules[] = 'search_api_db'; + $modules[] = 'search_api_views'; $modules[] = 'views'; parent::setUp($modules); @@ -81,10 +91,64 @@ abstract class RangeViewsBaseTestCase extends ViewsTestCase { ); field_create_instance($instance); - views_invalidate_cache(); + // Add some basic test nodes. + $ranges = array( + array('from' => 0, 'to' => 10), + array('from' => 5, 'to' => 9), + array('from' => -5, 'to' => 15), + array('from' => 6, 'to' => 10), + ); + foreach ($ranges as $range) { + $this->nodes[] = $this->drupalCreateNode(array( + 'type' => $this->contentType, + $this->fieldName => array( + LANGUAGE_NONE => array($range), + ), + )); + } + } + + /** + * Creates search server and index. + */ + protected function createSearchServerAndIndex() { + // Create search server and index using DB service. + $server_values = array( + 'name' => 'test_server', + 'machine_name' => 'test_server', + 'class' => 'search_api_db_service', + 'options' => array( + 'database' => 'default:default', + ), + ); + search_api_server_insert($server_values); + + $index_values = array( + 'name' => 'test_index', + 'machine_name' => 'test_index', + 'server' => 'test_server', + 'item_type' => 'node', + 'options' => array( + 'index_directly' => TRUE, + 'fields' => array( + 'field_range_integer:from' => array( + 'type' => 'integer', + ), + 'field_range_integer:to' => array( + 'type' => 'integer', + ), + 'search_api_language' => array( + 'type' => 'string', + ), + ), + ), + ); + $index_id = search_api_index_insert($index_values); + $index = search_api_index_load($index_id); + search_api_index_items($index); - // Set column map. - $this->map = array('nid' => 'nid'); + // Search API returns result with a different column keys. + $this->map = array('entity' => 'nid'); } } only in patch2: unchanged: --- a/tests/views/range.views.filter.test +++ b/tests/views/range.views.filter.test @@ -22,34 +22,26 @@ class RangeViewsFilterTestCase extends RangeViewsBaseTestCase { } /** - * {@inheritdoc} + * Tests range field views filter. */ - protected function setUp(array $modules = array()) { - parent::setUp($modules); - - // Add some basic test nodes. - $ranges = array( - array('from' => 0, 'to' => 10), - array('from' => 5, 'to' => 9), - array('from' => -5, 'to' => 15), - array('from' => -10, 'to' => 5), - ); - foreach ($ranges as $range) { - $this->nodes[] = $this->drupalCreateNode(array( - 'type' => $this->contentType, - $this->fieldName => array( - LANGUAGE_NONE => array($range), - ), - )); - } + public function testRangeFieldViewsFilter() { + $view = $this->getRangeFieldViewsFilterTestView(); + $this->_testRangeViewsFilter($view); } /** - * Tests range views filter. + * Tests range search API views filter. */ - public function testRangeViewsFilter() { - $view = $this->getTestRangeFilterView(); + public function testRangeSearchApiViewsFilter() { + $this->createSearchServerAndIndex(); + $view = $this->getRangeSearchApiViewsFilterTestView(); + $this->_testRangeViewsFilter($view); + } + /** + * Range views filter test runner. + */ + protected function _testRangeViewsFilter($view) { // Range contains, exclude endpoints. $view->set_display('default'); $view->init_handlers(); @@ -75,7 +67,6 @@ class RangeViewsFilterTestCase extends RangeViewsBaseTestCase { array('nid' => $this->nodes[0]->nid), array('nid' => $this->nodes[1]->nid), array('nid' => $this->nodes[2]->nid), - array('nid' => $this->nodes[3]->nid), ); $this->assertIdenticalResultset($view, $expected_result, $this->map, 'Range views filter (contains, include endpoints) produces correct results'); $view->destroy(); @@ -98,7 +89,7 @@ class RangeViewsFilterTestCase extends RangeViewsBaseTestCase { $view->set_display('default'); $view->init_handlers(); $view->filter[$this->fieldName]->operator = 'not within'; - $view->filter[$this->fieldName]->value = 9; + $view->filter[$this->fieldName]->value = 5; $view->filter[$this->fieldName]->options['include_endpoints'] = TRUE; $this->executeView($view); $expected_result = array( @@ -109,12 +100,12 @@ class RangeViewsFilterTestCase extends RangeViewsBaseTestCase { } /** - * Returns test view. + * Returns view for testing range field views filter. * - * @return \view + * @return view * View object. */ - protected function getTestRangeFilterView() { + protected function getRangeFieldViewsFilterTestView() { $view = new view(); $view->name = 'test_range_filter'; $view->description = ''; @@ -150,4 +141,50 @@ class RangeViewsFilterTestCase extends RangeViewsBaseTestCase { return $view; } + /** + * Returns view for testing range search API views filter. + * + * @return view + * View object. + */ + protected function getRangeSearchApiViewsFilterTestView() { + $view = new view(); + $view->name = 'test_range_search_api_filter'; + $view->description = ''; + $view->tag = 'default'; + $view->base_table = 'search_api_index_test_index'; + $view->human_name = 'test_range_search_api_filter'; + $view->core = 7; + $view->api_version = '3.0'; + $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ + + /* Display: Master */ + $handler = $view->new_display('default', 'Master', 'default'); + $handler->display->display_options['use_more_always'] = FALSE; + $handler->display->display_options['access']['type'] = 'none'; + $handler->display->display_options['cache']['type'] = 'none'; + $handler->display->display_options['query']['type'] = 'views_query'; + $handler->display->display_options['exposed_form']['type'] = 'basic'; + $handler->display->display_options['pager']['type'] = 'full'; + $handler->display->display_options['style_plugin'] = 'default'; + $handler->display->display_options['row_plugin'] = 'fields'; + /* Field: Indexed Node: Node ID */ + $handler->display->display_options['fields']['nid']['id'] = 'nid'; + $handler->display->display_options['fields']['nid']['table'] = 'search_api_index_test_index'; + $handler->display->display_options['fields']['nid']['field'] = 'nid'; + $handler->display->display_options['fields']['nid']['label'] = ''; + $handler->display->display_options['fields']['nid']['element_label_colon'] = FALSE; + $handler->display->display_options['fields']['nid']['link_to_entity'] = 0; + /* Sort criterion: Indexed Node: Entity ID */ + $handler->display->display_options['sorts']['search_api_id']['id'] = 'search_api_id'; + $handler->display->display_options['sorts']['search_api_id']['table'] = 'search_api_index_test_index'; + $handler->display->display_options['sorts']['search_api_id']['field'] = 'search_api_id'; + /* Filter criterion: Indexed Node: Range integer range filter */ + $handler->display->display_options['filters']['field_range_integer']['id'] = 'field_range_integer'; + $handler->display->display_options['filters']['field_range_integer']['table'] = 'search_api_index_test_index'; + $handler->display->display_options['filters']['field_range_integer']['field'] = 'field_range_integer'; + + return $view; + } + }