Quellcode durchsuchen

Merge pull request #827 from guignonv/patch-2

Allow complex filtering when only one level is set
Lacey-Anne Sanderson vor 6 Jahren
Ursprung
Commit
e471a08089

+ 70 - 0
tests/tripal_chado/api/ChadoQueryTest.php

@@ -0,0 +1,70 @@
+<?php
+namespace Tests;
+
+use StatonLab\TripalTestSuite\DBTransaction;
+use StatonLab\TripalTestSuite\TripalTestCase;
+
+class ChadoQueryTest extends TripalTestCase {
+  // Uncomment to auto start and rollback db transactions per test method.
+  use DBTransaction;
+
+  /**
+   * @group filter
+   * See PR 827.
+   */
+  public function test_filter_level(){
+
+    $stock = factory('chado.stock')->create(['uniquename' => 'octopus_core_test_name']);
+
+    // Test 1. Pass a single filter.
+    $selector = array(
+      'stock_id' => $stock->stock_id,
+      'uniquename' => array(
+        'op' => 'LIKE',
+        'data' => 'octopus%',
+      ),
+    );
+
+    $object = chado_generate_var('stock', $selector);
+
+    $this->assertNotNull($object->stock_id);
+    $this->assertEquals($stock->stock_id, $object->stock_id);
+
+
+    // Test 2 Pass an array of filters with a single item.
+    $selector = array(
+      'stock_id' => $stock->stock_id,
+      'uniquename' => array(
+        array(
+          'op' => 'LIKE',
+          'data' => 'octopus%',
+        ),
+      ),
+    );
+    $object = chado_generate_var('stock', $selector);
+
+    $this->assertNotNull($object->stock_id);
+    $this->assertEquals($stock->stock_id, $object->stock_id);
+
+
+    // Test 3 Pass an array of filters with multiple items.
+    $selector = array(
+      'type_id' => array(
+        array(
+          'op' => '>',
+          'data' => ($stock->type_id - 1),
+        ),
+        array(
+          'op' => '<',
+          'data' => ($stock->type_id + 1),
+        ),
+      ),
+    );
+
+    $object = chado_generate_var('stock', $selector);
+    $this->assertNotNull($object->stock_id);
+    $this->assertEquals($stock->stock_id, $object->stock_id);
+
+  }
+
+}

+ 2 - 1
tripal_chado/api/tripal_chado.query.api.inc

@@ -1367,7 +1367,8 @@ function chado_select_record($table, $columns, $values, $options = NULL) {
 
       // CASE 1a: If there is only one element in the array, treat it the same
       // as a non-array value.
-      if (count($value) == 1 AND is_int(key($value))) {
+      if (count($value) == 1 AND is_int(key($value))
+          AND !(isset($value[0]['op']) && isset($value[0]['data']))) {
 
         $value = array_pop($value);
         $op = '=';