cms/drupal/modules/simpletest/tests/entity_query.test
changeset 541 e756a8c72c3d
equal deleted inserted replaced
540:07239de796bb 541:e756a8c72c3d
       
     1 <?php
       
     2 
       
     3 
       
     4 /**
       
     5  * @file
       
     6  * Unit test file for the entity API.
       
     7  */
       
     8 
       
     9 /**
       
    10  * Tests EntityFieldQuery.
       
    11  */
       
    12 class EntityFieldQueryTestCase extends DrupalWebTestCase {
       
    13 
       
    14   public static function getInfo() {
       
    15     return array(
       
    16       'name' => 'Entity query',
       
    17       'description' => 'Test the EntityFieldQuery class.',
       
    18       'group' => 'Entity API',
       
    19     );
       
    20   }
       
    21 
       
    22   function setUp() {
       
    23     parent::setUp(array('node', 'field_test', 'entity_query_access_test', 'node_access_test'));
       
    24 
       
    25     field_test_create_bundle('bundle1');
       
    26     field_test_create_bundle('bundle2');
       
    27     field_test_create_bundle('test_bundle');
       
    28     field_test_create_bundle('test_entity_bundle');
       
    29 
       
    30     $instances = array();
       
    31     $this->fields = array();
       
    32     $this->field_names[0] = $field_name = drupal_strtolower($this->randomName() . '_field_name');
       
    33     $field = array('field_name' => $field_name, 'type' => 'test_field', 'cardinality' => 4);
       
    34     $field = field_create_field($field);
       
    35     $this->fields[0] = $field;
       
    36     $instance = array(
       
    37       'field_name' => $field_name,
       
    38       'entity_type' => '',
       
    39       'bundle' => '',
       
    40       'label' => $this->randomName() . '_label',
       
    41       'description' => $this->randomName() . '_description',
       
    42       'weight' => mt_rand(0, 127),
       
    43       'settings' => array(
       
    44         'test_instance_setting' => $this->randomName(),
       
    45       ),
       
    46       'widget' => array(
       
    47         'type' => 'test_field_widget',
       
    48         'label' => 'Test Field',
       
    49         'settings' => array(
       
    50           'test_widget_setting' => $this->randomName(),
       
    51         )
       
    52       )
       
    53     );
       
    54 
       
    55     $instances[0] = $instance;
       
    56 
       
    57     // Add an instance to that bundle.
       
    58     $instances[0]['bundle'] = 'bundle1';
       
    59     $instances[0]['entity_type'] = 'test_entity_bundle_key';
       
    60     field_create_instance($instances[0]);
       
    61     $instances[0]['bundle'] = 'bundle2';
       
    62     field_create_instance($instances[0]);
       
    63     $instances[0]['bundle'] = $instances[0]['entity_type'] = 'test_entity_bundle';
       
    64     field_create_instance($instances[0]);
       
    65 
       
    66     $this->field_names[1] = $field_name = drupal_strtolower($this->randomName() . '_field_name');
       
    67     $field = array('field_name' => $field_name, 'type' => 'shape', 'cardinality' => 4);
       
    68     $field = field_create_field($field);
       
    69     $this->fields[1] = $field;
       
    70     $instance = array(
       
    71       'field_name' => $field_name,
       
    72       'entity_type' => '',
       
    73       'bundle' => '',
       
    74       'label' => $this->randomName() . '_label',
       
    75       'description' => $this->randomName() . '_description',
       
    76       'weight' => mt_rand(0, 127),
       
    77       'settings' => array(
       
    78         'test_instance_setting' => $this->randomName(),
       
    79       ),
       
    80       'widget' => array(
       
    81         'type' => 'test_field_widget',
       
    82         'label' => 'Test Field',
       
    83         'settings' => array(
       
    84           'test_widget_setting' => $this->randomName(),
       
    85         )
       
    86       )
       
    87     );
       
    88 
       
    89     $instances[1] = $instance;
       
    90 
       
    91     // Add a field instance to the bundles.
       
    92     $instances[1]['bundle'] = 'bundle1';
       
    93     $instances[1]['entity_type'] = 'test_entity_bundle_key';
       
    94     field_create_instance($instances[1]);
       
    95     $instances[1]['bundle'] = $instances[1]['entity_type'] = 'test_entity_bundle';
       
    96     field_create_instance($instances[1]);
       
    97 
       
    98     $this->instances = $instances;
       
    99     // Write entity base table if there is one.
       
   100     $entities = array();
       
   101 
       
   102     // Create entities which have a 'bundle key' defined.
       
   103     for ($i = 1; $i < 7; $i++) {
       
   104       $entity = new stdClass();
       
   105       $entity->ftid = $i;
       
   106       $entity->fttype = ($i < 5) ? 'bundle1' : 'bundle2';
       
   107 
       
   108       $entity->{$this->field_names[0]}[LANGUAGE_NONE][0]['value'] = $i;
       
   109       drupal_write_record('test_entity_bundle_key', $entity);
       
   110       field_attach_insert('test_entity_bundle_key', $entity);
       
   111     }
       
   112 
       
   113     $entity = new stdClass();
       
   114     $entity->ftid = 5;
       
   115     $entity->fttype = 'test_entity_bundle';
       
   116     $entity->{$this->field_names[1]}[LANGUAGE_NONE][0]['shape'] = 'square';
       
   117     $entity->{$this->field_names[1]}[LANGUAGE_NONE][0]['color'] = 'red';
       
   118     $entity->{$this->field_names[1]}[LANGUAGE_NONE][1]['shape'] = 'circle';
       
   119     $entity->{$this->field_names[1]}[LANGUAGE_NONE][1]['color'] = 'blue';
       
   120     drupal_write_record('test_entity_bundle', $entity);
       
   121     field_attach_insert('test_entity_bundle', $entity);
       
   122 
       
   123     $instances[2] = $instance;
       
   124     $instances[2]['bundle'] = 'test_bundle';
       
   125     $instances[2]['field_name'] = $this->field_names[0];
       
   126     $instances[2]['entity_type'] = 'test_entity';
       
   127     field_create_instance($instances[2]);
       
   128 
       
   129     // Create entities with support for revisions.
       
   130     for ($i = 1; $i < 5; $i++) {
       
   131       $entity = new stdClass();
       
   132       $entity->ftid = $i;
       
   133       $entity->ftvid = $i;
       
   134       $entity->fttype = 'test_bundle';
       
   135       $entity->{$this->field_names[0]}[LANGUAGE_NONE][0]['value'] = $i;
       
   136 
       
   137       drupal_write_record('test_entity', $entity);
       
   138       field_attach_insert('test_entity', $entity);
       
   139       drupal_write_record('test_entity_revision', $entity);
       
   140     }
       
   141 
       
   142     // Add two revisions to an entity.
       
   143     for ($i = 100; $i < 102; $i++) {
       
   144       $entity = new stdClass();
       
   145       $entity->ftid = 4;
       
   146       $entity->ftvid = $i;
       
   147       $entity->fttype = 'test_bundle';
       
   148       $entity->{$this->field_names[0]}[LANGUAGE_NONE][0]['value'] = $i;
       
   149 
       
   150       drupal_write_record('test_entity', $entity, 'ftid');
       
   151       drupal_write_record('test_entity_revision', $entity);
       
   152 
       
   153       db_update('test_entity')
       
   154        ->fields(array('ftvid' => $entity->ftvid))
       
   155        ->condition('ftid', $entity->ftid)
       
   156        ->execute();
       
   157 
       
   158       field_attach_update('test_entity', $entity);
       
   159     }
       
   160   }
       
   161 
       
   162   /**
       
   163    * Tests EntityFieldQuery.
       
   164    */
       
   165   function testEntityFieldQuery() {
       
   166     $query = new EntityFieldQuery();
       
   167     $query
       
   168       ->entityCondition('entity_type', 'test_entity_bundle')
       
   169       ->entityCondition('entity_id', '5');
       
   170     $this->assertEntityFieldQuery($query, array(
       
   171       array('test_entity_bundle', 5),
       
   172     ), 'Test query on an entity type with a generated bundle.');
       
   173 
       
   174     // Test entity_type condition.
       
   175     $query = new EntityFieldQuery();
       
   176     $query->entityCondition('entity_type', 'test_entity_bundle_key');
       
   177     $this->assertEntityFieldQuery($query, array(
       
   178       array('test_entity_bundle_key', 1),
       
   179       array('test_entity_bundle_key', 2),
       
   180       array('test_entity_bundle_key', 3),
       
   181       array('test_entity_bundle_key', 4),
       
   182       array('test_entity_bundle_key', 5),
       
   183       array('test_entity_bundle_key', 6),
       
   184     ), 'Test entity entity_type condition.');
       
   185 
       
   186     // Test entity_id condition.
       
   187     $query = new EntityFieldQuery();
       
   188     $query
       
   189       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   190       ->entityCondition('entity_id', '3');
       
   191     $this->assertEntityFieldQuery($query, array(
       
   192       array('test_entity_bundle_key', 3),
       
   193     ), 'Test entity entity_id condition.');
       
   194 
       
   195     $query = new EntityFieldQuery();
       
   196     $query
       
   197       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   198       ->propertyCondition('ftid', '3');
       
   199     $this->assertEntityFieldQuery($query, array(
       
   200       array('test_entity_bundle_key', 3),
       
   201     ), 'Test entity entity_id condition and entity_id property condition.');
       
   202 
       
   203     // Test bundle condition.
       
   204     $query = new EntityFieldQuery();
       
   205     $query
       
   206       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   207       ->entityCondition('bundle', 'bundle1');
       
   208     $this->assertEntityFieldQuery($query, array(
       
   209       array('test_entity_bundle_key', 1),
       
   210       array('test_entity_bundle_key', 2),
       
   211       array('test_entity_bundle_key', 3),
       
   212       array('test_entity_bundle_key', 4),
       
   213     ), 'Test entity bundle condition: bundle1.');
       
   214 
       
   215     $query = new EntityFieldQuery();
       
   216     $query
       
   217       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   218       ->entityCondition('bundle', 'bundle2');
       
   219     $this->assertEntityFieldQuery($query, array(
       
   220       array('test_entity_bundle_key', 5),
       
   221       array('test_entity_bundle_key', 6),
       
   222     ), 'Test entity bundle condition: bundle2.');
       
   223 
       
   224     $query = new EntityFieldQuery();
       
   225     $query
       
   226       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   227       ->propertyCondition('fttype', 'bundle2');
       
   228     $this->assertEntityFieldQuery($query, array(
       
   229       array('test_entity_bundle_key', 5),
       
   230       array('test_entity_bundle_key', 6),
       
   231     ), 'Test entity bundle condition and bundle property condition.');
       
   232 
       
   233     // Test revision_id condition.
       
   234     $query = new EntityFieldQuery();
       
   235     $query
       
   236       ->entityCondition('entity_type', 'test_entity')
       
   237       ->entityCondition('revision_id', '3');
       
   238     $this->assertEntityFieldQuery($query, array(
       
   239       array('test_entity', 3),
       
   240     ), 'Test entity revision_id condition.');
       
   241 
       
   242     $query = new EntityFieldQuery();
       
   243     $query
       
   244       ->entityCondition('entity_type', 'test_entity')
       
   245       ->propertyCondition('ftvid', '3');
       
   246     $this->assertEntityFieldQuery($query, array(
       
   247       array('test_entity', 3),
       
   248     ), 'Test entity revision_id condition and revision_id property condition.');
       
   249 
       
   250     $query = new EntityFieldQuery();
       
   251     $query
       
   252       ->entityCondition('entity_type', 'test_entity')
       
   253       ->fieldCondition($this->fields[0], 'value', 100, '>=')
       
   254       ->age(FIELD_LOAD_REVISION);
       
   255     $this->assertEntityFieldQuery($query, array(
       
   256         array('test_entity', 100),
       
   257         array('test_entity', 101),
       
   258     ), 'Test revision age.');
       
   259 
       
   260     // Test that fields attached to the non-revision supporting entity
       
   261     // 'test_entity_bundle_key' are reachable in FIELD_LOAD_REVISION.
       
   262     $query = new EntityFieldQuery();
       
   263     $query
       
   264       ->fieldCondition($this->fields[0], 'value', 100, '<')
       
   265       ->age(FIELD_LOAD_REVISION);
       
   266     $this->assertEntityFieldQuery($query, array(
       
   267         array('test_entity_bundle_key', 1),
       
   268         array('test_entity_bundle_key', 2),
       
   269         array('test_entity_bundle_key', 3),
       
   270         array('test_entity_bundle_key', 4),
       
   271         array('test_entity_bundle_key', 5),
       
   272         array('test_entity_bundle_key', 6),
       
   273         array('test_entity', 1),
       
   274         array('test_entity', 2),
       
   275         array('test_entity', 3),
       
   276         array('test_entity', 4),
       
   277     ), 'Test that fields are reachable from FIELD_LOAD_REVISION even for non-revision entities.');
       
   278 
       
   279     // Test entity sort by entity_id.
       
   280     $query = new EntityFieldQuery();
       
   281     $query
       
   282       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   283       ->entityOrderBy('entity_id', 'ASC');
       
   284     $this->assertEntityFieldQuery($query, array(
       
   285       array('test_entity_bundle_key', 1),
       
   286       array('test_entity_bundle_key', 2),
       
   287       array('test_entity_bundle_key', 3),
       
   288       array('test_entity_bundle_key', 4),
       
   289       array('test_entity_bundle_key', 5),
       
   290       array('test_entity_bundle_key', 6),
       
   291     ), 'Test sort entity entity_id in ascending order.', TRUE);
       
   292 
       
   293     $query = new EntityFieldQuery();
       
   294     $query
       
   295       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   296       ->entityOrderBy('entity_id', 'DESC');
       
   297     $this->assertEntityFieldQuery($query, array(
       
   298       array('test_entity_bundle_key', 6),
       
   299       array('test_entity_bundle_key', 5),
       
   300       array('test_entity_bundle_key', 4),
       
   301       array('test_entity_bundle_key', 3),
       
   302       array('test_entity_bundle_key', 2),
       
   303       array('test_entity_bundle_key', 1),
       
   304     ), 'Test sort entity entity_id in descending order.', TRUE);
       
   305 
       
   306     // Test entity sort by entity_id, with a field condition.
       
   307     $query = new EntityFieldQuery();
       
   308     $query
       
   309       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   310       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
   311       ->entityOrderBy('entity_id', 'ASC');
       
   312     $this->assertEntityFieldQuery($query, array(
       
   313       array('test_entity_bundle_key', 1),
       
   314       array('test_entity_bundle_key', 2),
       
   315       array('test_entity_bundle_key', 3),
       
   316       array('test_entity_bundle_key', 4),
       
   317       array('test_entity_bundle_key', 5),
       
   318       array('test_entity_bundle_key', 6),
       
   319     ), 'Test sort entity entity_id in ascending order, with a field condition.', TRUE);
       
   320 
       
   321     $query = new EntityFieldQuery();
       
   322     $query
       
   323       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   324       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
   325       ->propertyOrderBy('ftid', 'DESC');
       
   326     $this->assertEntityFieldQuery($query, array(
       
   327       array('test_entity_bundle_key', 6),
       
   328       array('test_entity_bundle_key', 5),
       
   329       array('test_entity_bundle_key', 4),
       
   330       array('test_entity_bundle_key', 3),
       
   331       array('test_entity_bundle_key', 2),
       
   332       array('test_entity_bundle_key', 1),
       
   333     ), 'Test sort entity entity_id property in descending order, with a field condition.', TRUE);
       
   334 
       
   335     // Test property sort by entity id.
       
   336     $query = new EntityFieldQuery();
       
   337     $query
       
   338       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   339       ->propertyOrderBy('ftid', 'ASC');
       
   340     $this->assertEntityFieldQuery($query, array(
       
   341       array('test_entity_bundle_key', 1),
       
   342       array('test_entity_bundle_key', 2),
       
   343       array('test_entity_bundle_key', 3),
       
   344       array('test_entity_bundle_key', 4),
       
   345       array('test_entity_bundle_key', 5),
       
   346       array('test_entity_bundle_key', 6),
       
   347     ), 'Test sort entity entity_id property in ascending order.', TRUE);
       
   348 
       
   349     $query = new EntityFieldQuery();
       
   350     $query
       
   351       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   352       ->propertyOrderBy('ftid', 'DESC');
       
   353     $this->assertEntityFieldQuery($query, array(
       
   354       array('test_entity_bundle_key', 6),
       
   355       array('test_entity_bundle_key', 5),
       
   356       array('test_entity_bundle_key', 4),
       
   357       array('test_entity_bundle_key', 3),
       
   358       array('test_entity_bundle_key', 2),
       
   359       array('test_entity_bundle_key', 1),
       
   360     ), 'Test sort entity entity_id property in descending order.', TRUE);
       
   361 
       
   362     // Test property sort by entity id, with a field condition.
       
   363     $query = new EntityFieldQuery();
       
   364     $query
       
   365       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   366       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
   367       ->propertyOrderBy('ftid', 'ASC');
       
   368     $this->assertEntityFieldQuery($query, array(
       
   369       array('test_entity_bundle_key', 1),
       
   370       array('test_entity_bundle_key', 2),
       
   371       array('test_entity_bundle_key', 3),
       
   372       array('test_entity_bundle_key', 4),
       
   373       array('test_entity_bundle_key', 5),
       
   374       array('test_entity_bundle_key', 6),
       
   375     ), 'Test sort entity entity_id property in ascending order, with a field condition.', TRUE);
       
   376 
       
   377     $query = new EntityFieldQuery();
       
   378     $query
       
   379       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   380       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
   381       ->propertyOrderBy('ftid', 'DESC');
       
   382     $this->assertEntityFieldQuery($query, array(
       
   383       array('test_entity_bundle_key', 6),
       
   384       array('test_entity_bundle_key', 5),
       
   385       array('test_entity_bundle_key', 4),
       
   386       array('test_entity_bundle_key', 3),
       
   387       array('test_entity_bundle_key', 2),
       
   388       array('test_entity_bundle_key', 1),
       
   389     ), 'Test sort entity entity_id property in descending order, with a field condition.', TRUE);
       
   390 
       
   391     // Test entity sort by bundle.
       
   392     $query = new EntityFieldQuery();
       
   393     $query
       
   394       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   395       ->entityOrderBy('bundle', 'ASC')
       
   396       ->propertyOrderBy('ftid', 'DESC');
       
   397     $this->assertEntityFieldQuery($query, array(
       
   398       array('test_entity_bundle_key', 4),
       
   399       array('test_entity_bundle_key', 3),
       
   400       array('test_entity_bundle_key', 2),
       
   401       array('test_entity_bundle_key', 1),
       
   402       array('test_entity_bundle_key', 6),
       
   403       array('test_entity_bundle_key', 5),
       
   404     ), 'Test sort entity bundle in ascending order, property in descending order.', TRUE);
       
   405 
       
   406     $query = new EntityFieldQuery();
       
   407     $query
       
   408       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   409       ->entityOrderBy('bundle', 'DESC')
       
   410       ->propertyOrderBy('ftid', 'ASC');
       
   411     $this->assertEntityFieldQuery($query, array(
       
   412       array('test_entity_bundle_key', 5),
       
   413       array('test_entity_bundle_key', 6),
       
   414       array('test_entity_bundle_key', 1),
       
   415       array('test_entity_bundle_key', 2),
       
   416       array('test_entity_bundle_key', 3),
       
   417       array('test_entity_bundle_key', 4),
       
   418     ), 'Test sort entity bundle in descending order, property in ascending order.', TRUE);
       
   419 
       
   420     // Test entity sort by bundle, with a field condition.
       
   421     $query = new EntityFieldQuery();
       
   422     $query
       
   423       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   424       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
   425       ->entityOrderBy('bundle', 'ASC')
       
   426       ->propertyOrderBy('ftid', 'DESC');
       
   427     $this->assertEntityFieldQuery($query, array(
       
   428       array('test_entity_bundle_key', 4),
       
   429       array('test_entity_bundle_key', 3),
       
   430       array('test_entity_bundle_key', 2),
       
   431       array('test_entity_bundle_key', 1),
       
   432       array('test_entity_bundle_key', 6),
       
   433       array('test_entity_bundle_key', 5),
       
   434     ), 'Test sort entity bundle in ascending order, property in descending order, with a field condition.', TRUE);
       
   435 
       
   436     $query = new EntityFieldQuery();
       
   437     $query
       
   438       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   439       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
   440       ->entityOrderBy('bundle', 'DESC')
       
   441       ->propertyOrderBy('ftid', 'ASC');
       
   442     $this->assertEntityFieldQuery($query, array(
       
   443       array('test_entity_bundle_key', 5),
       
   444       array('test_entity_bundle_key', 6),
       
   445       array('test_entity_bundle_key', 1),
       
   446       array('test_entity_bundle_key', 2),
       
   447       array('test_entity_bundle_key', 3),
       
   448       array('test_entity_bundle_key', 4),
       
   449     ), 'Test sort entity bundle in descending order, property in ascending order, with a field condition.', TRUE);
       
   450 
       
   451     // Test entity sort by bundle, field.
       
   452     $query = new EntityFieldQuery();
       
   453     $query
       
   454       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   455       ->entityOrderBy('bundle', 'ASC')
       
   456       ->fieldOrderBy($this->fields[0], 'value', 'DESC');
       
   457     $this->assertEntityFieldQuery($query, array(
       
   458       array('test_entity_bundle_key', 4),
       
   459       array('test_entity_bundle_key', 3),
       
   460       array('test_entity_bundle_key', 2),
       
   461       array('test_entity_bundle_key', 1),
       
   462       array('test_entity_bundle_key', 6),
       
   463       array('test_entity_bundle_key', 5),
       
   464     ), 'Test sort entity bundle in ascending order, field in descending order.', TRUE);
       
   465 
       
   466     $query = new EntityFieldQuery();
       
   467     $query
       
   468       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   469       ->entityOrderBy('bundle', 'DESC')
       
   470       ->fieldOrderBy($this->fields[0], 'value', 'ASC');
       
   471     $this->assertEntityFieldQuery($query, array(
       
   472       array('test_entity_bundle_key', 5),
       
   473       array('test_entity_bundle_key', 6),
       
   474       array('test_entity_bundle_key', 1),
       
   475       array('test_entity_bundle_key', 2),
       
   476       array('test_entity_bundle_key', 3),
       
   477       array('test_entity_bundle_key', 4),
       
   478     ), 'Test sort entity bundle in descending order, field in ascending order.', TRUE);
       
   479 
       
   480     // Test entity sort by revision_id.
       
   481     $query = new EntityFieldQuery();
       
   482     $query
       
   483       ->entityCondition('entity_type', 'test_entity')
       
   484       ->entityOrderBy('revision_id', 'ASC');
       
   485     $this->assertEntityFieldQuery($query, array(
       
   486       array('test_entity', 1),
       
   487       array('test_entity', 2),
       
   488       array('test_entity', 3),
       
   489       array('test_entity', 4),
       
   490     ), 'Test sort entity revision_id in ascending order.', TRUE);
       
   491 
       
   492     $query = new EntityFieldQuery();
       
   493     $query
       
   494       ->entityCondition('entity_type', 'test_entity')
       
   495       ->entityOrderBy('revision_id', 'DESC');
       
   496     $this->assertEntityFieldQuery($query, array(
       
   497       array('test_entity', 4),
       
   498       array('test_entity', 3),
       
   499       array('test_entity', 2),
       
   500       array('test_entity', 1),
       
   501     ), 'Test sort entity revision_id in descending order.', TRUE);
       
   502 
       
   503     // Test entity sort by revision_id, with a field condition.
       
   504     $query = new EntityFieldQuery();
       
   505     $query
       
   506       ->entityCondition('entity_type', 'test_entity')
       
   507       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
   508       ->entityOrderBy('revision_id', 'ASC');
       
   509     $this->assertEntityFieldQuery($query, array(
       
   510       array('test_entity', 1),
       
   511       array('test_entity', 2),
       
   512       array('test_entity', 3),
       
   513       array('test_entity', 4),
       
   514     ), 'Test sort entity revision_id in ascending order, with a field condition.', TRUE);
       
   515 
       
   516     $query = new EntityFieldQuery();
       
   517     $query
       
   518       ->entityCondition('entity_type', 'test_entity')
       
   519       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
   520       ->entityOrderBy('revision_id', 'DESC');
       
   521     $this->assertEntityFieldQuery($query, array(
       
   522       array('test_entity', 4),
       
   523       array('test_entity', 3),
       
   524       array('test_entity', 2),
       
   525       array('test_entity', 1),
       
   526     ), 'Test sort entity revision_id in descending order, with a field condition.', TRUE);
       
   527 
       
   528     // Test property sort by revision_id.
       
   529     $query = new EntityFieldQuery();
       
   530     $query
       
   531       ->entityCondition('entity_type', 'test_entity')
       
   532       ->propertyOrderBy('ftvid', 'ASC');
       
   533     $this->assertEntityFieldQuery($query, array(
       
   534       array('test_entity', 1),
       
   535       array('test_entity', 2),
       
   536       array('test_entity', 3),
       
   537       array('test_entity', 4),
       
   538     ), 'Test sort entity revision_id property in ascending order.', TRUE);
       
   539 
       
   540     $query = new EntityFieldQuery();
       
   541     $query
       
   542       ->entityCondition('entity_type', 'test_entity')
       
   543       ->propertyOrderBy('ftvid', 'DESC');
       
   544     $this->assertEntityFieldQuery($query, array(
       
   545       array('test_entity', 4),
       
   546       array('test_entity', 3),
       
   547       array('test_entity', 2),
       
   548       array('test_entity', 1),
       
   549     ), 'Test sort entity revision_id property in descending order.', TRUE);
       
   550 
       
   551     // Test property sort by revision_id, with a field condition.
       
   552     $query = new EntityFieldQuery();
       
   553     $query
       
   554       ->entityCondition('entity_type', 'test_entity')
       
   555       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
   556       ->propertyOrderBy('ftvid', 'ASC');
       
   557     $this->assertEntityFieldQuery($query, array(
       
   558       array('test_entity', 1),
       
   559       array('test_entity', 2),
       
   560       array('test_entity', 3),
       
   561       array('test_entity', 4),
       
   562     ), 'Test sort entity revision_id property in ascending order, with a field condition.', TRUE);
       
   563 
       
   564     $query = new EntityFieldQuery();
       
   565     $query
       
   566       ->entityCondition('entity_type', 'test_entity')
       
   567       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
   568       ->propertyOrderBy('ftvid', 'DESC');
       
   569     $this->assertEntityFieldQuery($query, array(
       
   570       array('test_entity', 4),
       
   571       array('test_entity', 3),
       
   572       array('test_entity', 2),
       
   573       array('test_entity', 1),
       
   574     ), 'Test sort entity revision_id property in descending order, with a field condition.', TRUE);
       
   575 
       
   576     $query = new EntityFieldQuery();
       
   577     $query
       
   578       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   579       ->fieldOrderBy($this->fields[0], 'value', 'ASC');
       
   580     $this->assertEntityFieldQuery($query, array(
       
   581       array('test_entity_bundle_key', 1),
       
   582       array('test_entity_bundle_key', 2),
       
   583       array('test_entity_bundle_key', 3),
       
   584       array('test_entity_bundle_key', 4),
       
   585       array('test_entity_bundle_key', 5),
       
   586       array('test_entity_bundle_key', 6),
       
   587     ), 'Test sort field in ascending order without field condition.', TRUE);
       
   588 
       
   589     $query = new EntityFieldQuery();
       
   590     $query
       
   591       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   592       ->fieldOrderBy($this->fields[0], 'value', 'DESC');
       
   593     $this->assertEntityFieldQuery($query, array(
       
   594       array('test_entity_bundle_key', 6),
       
   595       array('test_entity_bundle_key', 5),
       
   596       array('test_entity_bundle_key', 4),
       
   597       array('test_entity_bundle_key', 3),
       
   598       array('test_entity_bundle_key', 2),
       
   599       array('test_entity_bundle_key', 1),
       
   600     ), 'Test sort field in descending order without field condition.', TRUE);
       
   601 
       
   602     $query = new EntityFieldQuery();
       
   603     $query
       
   604       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   605       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
   606       ->fieldOrderBy($this->fields[0], 'value', 'ASC');
       
   607     $this->assertEntityFieldQuery($query, array(
       
   608       array('test_entity_bundle_key', 1),
       
   609       array('test_entity_bundle_key', 2),
       
   610       array('test_entity_bundle_key', 3),
       
   611       array('test_entity_bundle_key', 4),
       
   612       array('test_entity_bundle_key', 5),
       
   613       array('test_entity_bundle_key', 6),
       
   614     ), 'Test sort field in ascending order.', TRUE);
       
   615 
       
   616     $query = new EntityFieldQuery();
       
   617     $query
       
   618       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   619       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
   620       ->fieldOrderBy($this->fields[0], 'value', 'DESC');
       
   621     $this->assertEntityFieldQuery($query, array(
       
   622       array('test_entity_bundle_key', 6),
       
   623       array('test_entity_bundle_key', 5),
       
   624       array('test_entity_bundle_key', 4),
       
   625       array('test_entity_bundle_key', 3),
       
   626       array('test_entity_bundle_key', 2),
       
   627       array('test_entity_bundle_key', 1),
       
   628     ), 'Test sort field in descending order.', TRUE);
       
   629 
       
   630     // Test "in" operation with entity entity_type condition and entity_id
       
   631     // property condition.
       
   632     $query = new EntityFieldQuery();
       
   633     $query
       
   634       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   635       ->propertyCondition('ftid', array(1, 3, 4), 'IN');
       
   636     $this->assertEntityFieldQuery($query, array(
       
   637       array('test_entity_bundle_key', 1),
       
   638       array('test_entity_bundle_key', 3),
       
   639       array('test_entity_bundle_key', 4),
       
   640     ), 'Test "in" operation with entity entity_type condition and entity_id property condition.');
       
   641 
       
   642     // Test "in" operation with entity entity_type condition and entity_id
       
   643     // property condition. Sort in descending order by entity_id.
       
   644     $query = new EntityFieldQuery();
       
   645     $query
       
   646       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   647       ->propertyCondition('ftid', array(1, 3, 4), 'IN')
       
   648       ->propertyOrderBy('ftid', 'DESC');
       
   649     $this->assertEntityFieldQuery($query, array(
       
   650       array('test_entity_bundle_key', 4),
       
   651       array('test_entity_bundle_key', 3),
       
   652       array('test_entity_bundle_key', 1),
       
   653     ), 'Test "in" operation with entity entity_type condition and entity_id property condition. Sort entity_id in descending order.', TRUE);
       
   654 
       
   655     // Test query count
       
   656     $query = new EntityFieldQuery();
       
   657     $query_count = $query
       
   658       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   659       ->count()
       
   660       ->execute();
       
   661     $this->assertEqual($query_count, 6, 'Test query count on entity condition.');
       
   662 
       
   663     $query = new EntityFieldQuery();
       
   664     $query_count = $query
       
   665       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   666       ->propertyCondition('ftid', '1')
       
   667       ->count()
       
   668       ->execute();
       
   669     $this->assertEqual($query_count, 1, 'Test query count on entity and property condition.');
       
   670 
       
   671     $query = new EntityFieldQuery();
       
   672     $query_count = $query
       
   673       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   674       ->propertyCondition('ftid', '4', '>')
       
   675       ->count()
       
   676       ->execute();
       
   677     $this->assertEqual($query_count, 2, 'Test query count on entity and property condition with operator.');
       
   678 
       
   679     $query = new EntityFieldQuery();
       
   680     $query_count = $query
       
   681       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   682       ->fieldCondition($this->fields[0], 'value', 3, '=')
       
   683       ->count()
       
   684       ->execute();
       
   685     $this->assertEqual($query_count, 1, 'Test query count on field condition.');
       
   686 
       
   687     // First, test without options.
       
   688     $query = new EntityFieldQuery();
       
   689     $query
       
   690       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   691       ->propertyCondition('fttype', 'und', 'CONTAINS');
       
   692     $this->assertEntityFieldQuery($query, array(
       
   693       array('test_entity_bundle_key', 1),
       
   694       array('test_entity_bundle_key', 2),
       
   695       array('test_entity_bundle_key', 3),
       
   696       array('test_entity_bundle_key', 4),
       
   697       array('test_entity_bundle_key', 5),
       
   698       array('test_entity_bundle_key', 6),
       
   699     ), 'Test the "contains" operation on a property.');
       
   700 
       
   701     $query = new EntityFieldQuery();
       
   702     $query->fieldCondition($this->fields[1], 'shape', 'uar', 'CONTAINS');
       
   703     $this->assertEntityFieldQuery($query, array(
       
   704       array('test_entity_bundle', 5),
       
   705     ), 'Test the "contains" operation on a field.');
       
   706 
       
   707     $query = new EntityFieldQuery();
       
   708     $query
       
   709       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   710       ->propertyCondition('ftid', 1, '=');
       
   711     $this->assertEntityFieldQuery($query, array(
       
   712       array('test_entity_bundle_key', 1),
       
   713     ), 'Test the "equal to" operation on a property.');
       
   714 
       
   715     $query = new EntityFieldQuery();
       
   716     $query->fieldCondition($this->fields[0], 'value', 3, '=');
       
   717     $this->assertEntityFieldQuery($query, array(
       
   718       array('test_entity_bundle_key', 3),
       
   719       array('test_entity', 3),
       
   720     ), 'Test the "equal to" operation on a field.');
       
   721 
       
   722     $query = new EntityFieldQuery();
       
   723     $query
       
   724       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   725       ->propertyCondition('ftid', 3, '<>');
       
   726     $this->assertEntityFieldQuery($query, array(
       
   727       array('test_entity_bundle_key', 1),
       
   728       array('test_entity_bundle_key', 2),
       
   729       array('test_entity_bundle_key', 4),
       
   730       array('test_entity_bundle_key', 5),
       
   731       array('test_entity_bundle_key', 6),
       
   732     ), 'Test the "not equal to" operation on a property.');
       
   733 
       
   734     $query = new EntityFieldQuery();
       
   735     $query->fieldCondition($this->fields[0], 'value', 3, '<>');
       
   736     $this->assertEntityFieldQuery($query, array(
       
   737       array('test_entity_bundle_key', 1),
       
   738       array('test_entity_bundle_key', 2),
       
   739       array('test_entity_bundle_key', 4),
       
   740       array('test_entity_bundle_key', 5),
       
   741       array('test_entity_bundle_key', 6),
       
   742       array('test_entity', 1),
       
   743       array('test_entity', 2),
       
   744       array('test_entity', 4),
       
   745     ), 'Test the "not equal to" operation on a field.');
       
   746 
       
   747     $query = new EntityFieldQuery();
       
   748     $query
       
   749       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   750       ->propertyCondition('ftid', 3, '!=');
       
   751     $this->assertEntityFieldQuery($query, array(
       
   752       array('test_entity_bundle_key', 1),
       
   753       array('test_entity_bundle_key', 2),
       
   754       array('test_entity_bundle_key', 4),
       
   755       array('test_entity_bundle_key', 5),
       
   756       array('test_entity_bundle_key', 6),
       
   757     ), 'Test the "not equal to" operation on a property.');
       
   758 
       
   759     $query = new EntityFieldQuery();
       
   760     $query->fieldCondition($this->fields[0], 'value', 3, '!=');
       
   761     $this->assertEntityFieldQuery($query, array(
       
   762       array('test_entity_bundle_key', 1),
       
   763       array('test_entity_bundle_key', 2),
       
   764       array('test_entity_bundle_key', 4),
       
   765       array('test_entity_bundle_key', 5),
       
   766       array('test_entity_bundle_key', 6),
       
   767       array('test_entity', 1),
       
   768       array('test_entity', 2),
       
   769       array('test_entity', 4),
       
   770     ), 'Test the "not equal to" operation on a field.');
       
   771 
       
   772     $query = new EntityFieldQuery();
       
   773     $query
       
   774       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   775       ->propertyCondition('ftid', 2, '<');
       
   776     $this->assertEntityFieldQuery($query, array(
       
   777       array('test_entity_bundle_key', 1),
       
   778     ), 'Test the "less than" operation on a property.');
       
   779 
       
   780     $query = new EntityFieldQuery();
       
   781     $query->fieldCondition($this->fields[0], 'value', 2, '<');
       
   782     $this->assertEntityFieldQuery($query, array(
       
   783       array('test_entity_bundle_key', 1),
       
   784       array('test_entity', 1),
       
   785     ), 'Test the "less than" operation on a field.');
       
   786 
       
   787     $query = new EntityFieldQuery();
       
   788     $query
       
   789       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   790       ->propertyCondition('ftid', 2, '<=');
       
   791     $this->assertEntityFieldQuery($query, array(
       
   792       array('test_entity_bundle_key', 1),
       
   793       array('test_entity_bundle_key', 2),
       
   794     ), 'Test the "less than or equal to" operation on a property.');
       
   795 
       
   796     $query = new EntityFieldQuery();
       
   797     $query->fieldCondition($this->fields[0], 'value', 2, '<=');
       
   798     $this->assertEntityFieldQuery($query, array(
       
   799       array('test_entity_bundle_key', 1),
       
   800       array('test_entity_bundle_key', 2),
       
   801       array('test_entity', 1),
       
   802       array('test_entity', 2),
       
   803     ), 'Test the "less than or equal to" operation on a field.');
       
   804 
       
   805     $query = new EntityFieldQuery();
       
   806     $query
       
   807       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   808       ->propertyCondition('ftid', 4, '>');
       
   809     $this->assertEntityFieldQuery($query, array(
       
   810       array('test_entity_bundle_key', 5),
       
   811       array('test_entity_bundle_key', 6),
       
   812     ), 'Test the "greater than" operation on a property.');
       
   813 
       
   814     $query = new EntityFieldQuery();
       
   815     $query->fieldCondition($this->fields[0], 'value', 2, '>');
       
   816     $this->assertEntityFieldQuery($query, array(
       
   817       array('test_entity_bundle_key', 3),
       
   818       array('test_entity_bundle_key', 4),
       
   819       array('test_entity_bundle_key', 5),
       
   820       array('test_entity_bundle_key', 6),
       
   821       array('test_entity', 3),
       
   822       array('test_entity', 4),
       
   823     ), 'Test the "greater than" operation on a field.');
       
   824 
       
   825     $query = new EntityFieldQuery();
       
   826     $query
       
   827       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   828       ->propertyCondition('ftid', 4, '>=');
       
   829     $this->assertEntityFieldQuery($query, array(
       
   830       array('test_entity_bundle_key', 4),
       
   831       array('test_entity_bundle_key', 5),
       
   832       array('test_entity_bundle_key', 6),
       
   833     ), 'Test the "greater than or equal to" operation on a property.');
       
   834 
       
   835     $query = new EntityFieldQuery();
       
   836     $query->fieldCondition($this->fields[0], 'value', 3, '>=');
       
   837     $this->assertEntityFieldQuery($query, array(
       
   838       array('test_entity_bundle_key', 3),
       
   839       array('test_entity_bundle_key', 4),
       
   840       array('test_entity_bundle_key', 5),
       
   841       array('test_entity_bundle_key', 6),
       
   842       array('test_entity', 3),
       
   843       array('test_entity', 4),
       
   844     ), 'Test the "greater than or equal to" operation on a field.');
       
   845 
       
   846     $query = new EntityFieldQuery();
       
   847     $query
       
   848       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   849       ->propertyCondition('ftid', array(3, 4), 'NOT IN');
       
   850     $this->assertEntityFieldQuery($query, array(
       
   851       array('test_entity_bundle_key', 1),
       
   852       array('test_entity_bundle_key', 2),
       
   853       array('test_entity_bundle_key', 5),
       
   854       array('test_entity_bundle_key', 6),
       
   855     ), 'Test the "not in" operation on a property.');
       
   856 
       
   857     $query = new EntityFieldQuery();
       
   858     $query->fieldCondition($this->fields[0], 'value', array(3, 4, 100, 101), 'NOT IN');
       
   859     $this->assertEntityFieldQuery($query, array(
       
   860       array('test_entity_bundle_key', 1),
       
   861       array('test_entity_bundle_key', 2),
       
   862       array('test_entity_bundle_key', 5),
       
   863       array('test_entity_bundle_key', 6),
       
   864       array('test_entity', 1),
       
   865       array('test_entity', 2),
       
   866     ), 'Test the "not in" operation on a field.');
       
   867 
       
   868     $query = new EntityFieldQuery();
       
   869     $query
       
   870       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   871       ->propertyCondition('ftid', array(3, 4), 'IN');
       
   872     $this->assertEntityFieldQuery($query, array(
       
   873       array('test_entity_bundle_key', 3),
       
   874       array('test_entity_bundle_key', 4),
       
   875     ), 'Test the "in" operation on a property.');
       
   876 
       
   877     $query = new EntityFieldQuery();
       
   878     $query->fieldCondition($this->fields[0], 'value', array(2, 3), 'IN');
       
   879     $this->assertEntityFieldQuery($query, array(
       
   880       array('test_entity_bundle_key', 2),
       
   881       array('test_entity_bundle_key', 3),
       
   882       array('test_entity', 2),
       
   883       array('test_entity', 3),
       
   884     ), 'Test the "in" operation on a field.');
       
   885 
       
   886     $query = new EntityFieldQuery();
       
   887     $query
       
   888       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   889       ->propertyCondition('ftid', array(1, 3), 'BETWEEN');
       
   890     $this->assertEntityFieldQuery($query, array(
       
   891       array('test_entity_bundle_key', 1),
       
   892       array('test_entity_bundle_key', 2),
       
   893       array('test_entity_bundle_key', 3),
       
   894     ), 'Test the "between" operation on a property.');
       
   895 
       
   896     $query = new EntityFieldQuery();
       
   897     $query->fieldCondition($this->fields[0], 'value', array(1, 3), 'BETWEEN');
       
   898     $this->assertEntityFieldQuery($query, array(
       
   899       array('test_entity_bundle_key', 1),
       
   900       array('test_entity_bundle_key', 2),
       
   901       array('test_entity_bundle_key', 3),
       
   902       array('test_entity', 1),
       
   903       array('test_entity', 2),
       
   904       array('test_entity', 3),
       
   905     ), 'Test the "between" operation on a field.');
       
   906 
       
   907     $query = new EntityFieldQuery();
       
   908     $query
       
   909       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   910       ->propertyCondition('fttype', 'bun', 'STARTS_WITH');
       
   911     $this->assertEntityFieldQuery($query, array(
       
   912       array('test_entity_bundle_key', 1),
       
   913       array('test_entity_bundle_key', 2),
       
   914       array('test_entity_bundle_key', 3),
       
   915       array('test_entity_bundle_key', 4),
       
   916       array('test_entity_bundle_key', 5),
       
   917       array('test_entity_bundle_key', 6),
       
   918     ), 'Test the "starts_with" operation on a property.');
       
   919 
       
   920     $query = new EntityFieldQuery();
       
   921     $query->fieldCondition($this->fields[1], 'shape', 'squ', 'STARTS_WITH');
       
   922     $this->assertEntityFieldQuery($query, array(
       
   923       array('test_entity_bundle', 5),
       
   924     ), 'Test the "starts_with" operation on a field.');
       
   925 
       
   926     $query = new EntityFieldQuery();
       
   927     $query->fieldCondition($this->fields[0], 'value', 3);
       
   928     $this->assertEntityFieldQuery($query, array(
       
   929       array('test_entity_bundle_key', 3),
       
   930       array('test_entity', 3),
       
   931     ), 'Test omission of an operator with a single item.');
       
   932 
       
   933     $query = new EntityFieldQuery();
       
   934     $query->fieldCondition($this->fields[0], 'value', array(2, 3));
       
   935     $this->assertEntityFieldQuery($query, array(
       
   936       array('test_entity_bundle_key', 2),
       
   937       array('test_entity_bundle_key', 3),
       
   938       array('test_entity', 2),
       
   939       array('test_entity', 3),
       
   940     ), 'Test omission of an operator with multiple items.');
       
   941 
       
   942     $query = new EntityFieldQuery();
       
   943     $query
       
   944       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   945       ->propertyCondition('ftid', 1, '>')
       
   946       ->fieldCondition($this->fields[0], 'value', 4, '<');
       
   947     $this->assertEntityFieldQuery($query, array(
       
   948       array('test_entity_bundle_key', 2),
       
   949       array('test_entity_bundle_key', 3),
       
   950     ), 'Test entity, property and field conditions.');
       
   951 
       
   952     $query = new EntityFieldQuery();
       
   953     $query
       
   954       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   955       ->entityCondition('bundle', 'bundle', 'STARTS_WITH')
       
   956       ->propertyCondition('ftid', 4)
       
   957       ->fieldCondition($this->fields[0], 'value', 4);
       
   958     $this->assertEntityFieldQuery($query, array(
       
   959       array('test_entity_bundle_key', 4),
       
   960     ), 'Test entity condition with "starts_with" operation, and property and field conditions.');
       
   961 
       
   962     $query = new EntityFieldQuery();
       
   963     $query
       
   964       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   965       ->propertyOrderBy('ftid', 'ASC')
       
   966       ->range(0, 2);
       
   967     $this->assertEntityFieldQuery($query, array(
       
   968       array('test_entity_bundle_key', 1),
       
   969       array('test_entity_bundle_key', 2),
       
   970     ), 'Test limit on a property.', TRUE);
       
   971 
       
   972     $query = new EntityFieldQuery();
       
   973     $query
       
   974       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   975       ->fieldCondition($this->fields[0], 'value', 0, '>=')
       
   976       ->fieldOrderBy($this->fields[0], 'value', 'ASC')
       
   977       ->range(0, 2);
       
   978     $this->assertEntityFieldQuery($query, array(
       
   979       array('test_entity_bundle_key', 1),
       
   980       array('test_entity_bundle_key', 2),
       
   981     ), 'Test limit on a field.', TRUE);
       
   982 
       
   983     $query = new EntityFieldQuery();
       
   984     $query
       
   985       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   986       ->propertyOrderBy('ftid', 'ASC')
       
   987       ->range(4, 6);
       
   988     $this->assertEntityFieldQuery($query, array(
       
   989       array('test_entity_bundle_key', 5),
       
   990       array('test_entity_bundle_key', 6),
       
   991     ), 'Test offset on a property.', TRUE);
       
   992 
       
   993     $query = new EntityFieldQuery();
       
   994     $query
       
   995       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
   996       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
   997       ->fieldOrderBy($this->fields[0], 'value', 'ASC')
       
   998       ->range(2, 4);
       
   999     $this->assertEntityFieldQuery($query, array(
       
  1000       array('test_entity_bundle_key', 3),
       
  1001       array('test_entity_bundle_key', 4),
       
  1002       array('test_entity_bundle_key', 5),
       
  1003       array('test_entity_bundle_key', 6),
       
  1004     ), 'Test offset on a field.', TRUE);
       
  1005 
       
  1006     for ($i = 6; $i < 10; $i++) {
       
  1007       $entity = new stdClass();
       
  1008       $entity->ftid = $i;
       
  1009       $entity->fttype = 'test_entity_bundle';
       
  1010       $entity->{$this->field_names[0]}[LANGUAGE_NONE][0]['value'] = $i - 5;
       
  1011       drupal_write_record('test_entity_bundle', $entity);
       
  1012       field_attach_insert('test_entity_bundle', $entity);
       
  1013     }
       
  1014 
       
  1015     $query = new EntityFieldQuery();
       
  1016     $query->fieldCondition($this->fields[0], 'value', 2, '>');
       
  1017     $this->assertEntityFieldQuery($query, array(
       
  1018       array('test_entity_bundle_key', 3),
       
  1019       array('test_entity_bundle_key', 4),
       
  1020       array('test_entity_bundle_key', 5),
       
  1021       array('test_entity_bundle_key', 6),
       
  1022       array('test_entity', 3),
       
  1023       array('test_entity', 4),
       
  1024       array('test_entity_bundle', 8),
       
  1025       array('test_entity_bundle', 9),
       
  1026     ), 'Select a field across multiple entities.');
       
  1027 
       
  1028     $query = new EntityFieldQuery();
       
  1029     $query
       
  1030       ->fieldCondition($this->fields[1], 'shape', 'square')
       
  1031       ->fieldCondition($this->fields[1], 'color', 'blue');
       
  1032     $this->assertEntityFieldQuery($query, array(
       
  1033       array('test_entity_bundle', 5),
       
  1034     ), 'Test without a delta group.');
       
  1035 
       
  1036     $query = new EntityFieldQuery();
       
  1037     $query
       
  1038       ->fieldCondition($this->fields[1], 'shape', 'square', '=', 'group')
       
  1039       ->fieldCondition($this->fields[1], 'color', 'blue', '=', 'group');
       
  1040     $this->assertEntityFieldQuery($query, array(), 'Test with a delta group.');
       
  1041 
       
  1042     // Test query on a deleted field.
       
  1043     field_attach_delete_bundle('test_entity_bundle_key', 'bundle1');
       
  1044     field_attach_delete_bundle('test_entity', 'test_bundle');
       
  1045     $query = new EntityFieldQuery();
       
  1046     $query->fieldCondition($this->fields[0], 'value', '3');
       
  1047     $this->assertEntityFieldQuery($query, array(
       
  1048       array('test_entity_bundle', 8),
       
  1049     ), 'Test query on a field after deleting field from some entities.');
       
  1050 
       
  1051     field_attach_delete_bundle('test_entity_bundle', 'test_entity_bundle');
       
  1052     $query = new EntityFieldQuery();
       
  1053     $query->fieldCondition($this->fields[0], 'value', '3');
       
  1054     $this->assertEntityFieldQuery($query, array(), 'Test query on a field after deleting field from all entities.');
       
  1055 
       
  1056     $query = new EntityFieldQuery();
       
  1057     $query
       
  1058       ->fieldCondition($this->fields[0], 'value', '3')
       
  1059       ->deleted(TRUE);
       
  1060     $this->assertEntityFieldQuery($query, array(
       
  1061       array('test_entity_bundle_key', 3),
       
  1062       array('test_entity_bundle', 8),
       
  1063       array('test_entity', 3),
       
  1064     ), 'Test query on a deleted field with deleted option set to TRUE.');
       
  1065 
       
  1066     $pass = FALSE;
       
  1067     $query = new EntityFieldQuery();
       
  1068     try {
       
  1069       $query->execute();
       
  1070     }
       
  1071     catch (EntityFieldQueryException $exception) {
       
  1072       $pass = ($exception->getMessage() == t('For this query an entity type must be specified.'));
       
  1073     }
       
  1074     $this->assertTrue($pass, "Can't query the universe.");
       
  1075   }
       
  1076 
       
  1077   /**
       
  1078    * Tests querying translatable fields.
       
  1079    */
       
  1080   function testEntityFieldQueryTranslatable() {
       
  1081 
       
  1082     // Make a test field translatable AND cardinality one.
       
  1083     $this->fields[0]['translatable'] = TRUE;
       
  1084     $this->fields[0]['cardinality'] = 1;
       
  1085     field_update_field($this->fields[0]);
       
  1086     field_test_entity_info_translatable('test_entity', TRUE);
       
  1087 
       
  1088     // Create more items with different languages.
       
  1089     $entity = new stdClass();
       
  1090     $entity->ftid = 1;
       
  1091     $entity->ftvid = 1;
       
  1092     $entity->fttype = 'test_bundle';
       
  1093 
       
  1094     // Set fields in two languages with one field value.
       
  1095     foreach (array(LANGUAGE_NONE, 'en') as $langcode) {
       
  1096       $entity->{$this->field_names[0]}[$langcode][0]['value'] = 1234;
       
  1097     }
       
  1098 
       
  1099     field_attach_update('test_entity', $entity);
       
  1100 
       
  1101     // Look up number of results when querying a single entity with multilingual
       
  1102     // field values.
       
  1103     $query = new EntityFieldQuery();
       
  1104     $query_count = $query
       
  1105       ->entityCondition('entity_type', 'test_entity')
       
  1106       ->entityCondition('bundle', 'test_bundle')
       
  1107       ->entityCondition('entity_id', '1')
       
  1108       ->fieldCondition($this->fields[0])
       
  1109       ->count()
       
  1110       ->execute();
       
  1111 
       
  1112     $this->assertEqual($query_count, 1, "Count on translatable cardinality one field is correct.");
       
  1113   }
       
  1114 
       
  1115   /**
       
  1116    * Tests field meta conditions.
       
  1117    */
       
  1118   function testEntityFieldQueryMetaConditions() {
       
  1119     // Make a test field translatable.
       
  1120     $this->fields[0]['translatable'] = TRUE;
       
  1121     field_update_field($this->fields[0]);
       
  1122     field_test_entity_info_translatable('test_entity', TRUE);
       
  1123 
       
  1124     // Create more items with different languages.
       
  1125     $entity = new stdClass();
       
  1126     $entity->ftid = 1;
       
  1127     $entity->ftvid = 1;
       
  1128     $entity->fttype = 'test_bundle';
       
  1129     $j = 0;
       
  1130 
       
  1131     foreach (array(LANGUAGE_NONE, 'en') as $langcode) {
       
  1132       for ($i = 0; $i < 4; $i++) {
       
  1133         $entity->{$this->field_names[0]}[$langcode][$i]['value'] = $i + $j;
       
  1134       }
       
  1135       $j += 4;
       
  1136     }
       
  1137 
       
  1138     field_attach_update('test_entity', $entity);
       
  1139 
       
  1140     // Test delta field meta condition.
       
  1141     $query = new EntityFieldQuery();
       
  1142     $query
       
  1143       ->entityCondition('entity_type', 'test_entity', '=')
       
  1144       ->fieldDeltaCondition($this->fields[0], 0, '>');
       
  1145     $this->assertEntityFieldQuery($query, array(
       
  1146       array('test_entity', 1),
       
  1147     ), 'Test with a delta meta condition.');
       
  1148 
       
  1149     // Test language field meta condition.
       
  1150     $query = new EntityFieldQuery();
       
  1151     $query
       
  1152       ->entityCondition('entity_type', 'test_entity', '=')
       
  1153       ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '<>');
       
  1154     $this->assertEntityFieldQuery($query, array(
       
  1155       array('test_entity', 1),
       
  1156     ), 'Test with a language meta condition.');
       
  1157 
       
  1158     // Test language field meta condition.
       
  1159     $query = new EntityFieldQuery();
       
  1160     $query
       
  1161       ->entityCondition('entity_type', 'test_entity', '=')
       
  1162       ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '!=');
       
  1163     $this->assertEntityFieldQuery($query, array(
       
  1164       array('test_entity', 1),
       
  1165     ), 'Test with a language meta condition.');
       
  1166 
       
  1167     // Test delta grouping.
       
  1168     $query = new EntityFieldQuery();
       
  1169     $query
       
  1170       ->entityCondition('entity_type', 'test_entity', '=')
       
  1171       ->fieldCondition($this->fields[0], 'value', 0, '=', 'group')
       
  1172       ->fieldDeltaCondition($this->fields[0], 1, '<', 'group');
       
  1173     $this->assertEntityFieldQuery($query, array(
       
  1174       array('test_entity', 1),
       
  1175     ), 'Test with a grouped delta meta condition.');
       
  1176 
       
  1177     $query = new EntityFieldQuery();
       
  1178     $query
       
  1179       ->entityCondition('entity_type', 'test_entity', '=')
       
  1180       ->fieldCondition($this->fields[0], 'value', 0, '=', 'group')
       
  1181       ->fieldDeltaCondition($this->fields[0], 1, '>=', 'group');
       
  1182     $this->assertEntityFieldQuery($query, array(), 'Test with a grouped delta meta condition (empty result set).');
       
  1183 
       
  1184     // Test language grouping.
       
  1185     $query = new EntityFieldQuery();
       
  1186     $query
       
  1187       ->entityCondition('entity_type', 'test_entity', '=')
       
  1188       ->fieldCondition($this->fields[0], 'value', 0, '=', NULL, 'group')
       
  1189       ->fieldLanguageCondition($this->fields[0], 'en', '<>', NULL, 'group');
       
  1190     $this->assertEntityFieldQuery($query, array(
       
  1191       array('test_entity', 1),
       
  1192     ), 'Test with a grouped language meta condition.');
       
  1193 
       
  1194     // Test language grouping.
       
  1195     $query = new EntityFieldQuery();
       
  1196     $query
       
  1197       ->entityCondition('entity_type', 'test_entity', '=')
       
  1198       ->fieldCondition($this->fields[0], 'value', 0, '=', NULL, 'group')
       
  1199       ->fieldLanguageCondition($this->fields[0], 'en', '!=', NULL, 'group');
       
  1200     $this->assertEntityFieldQuery($query, array(
       
  1201       array('test_entity', 1),
       
  1202     ), 'Test with a grouped language meta condition.');
       
  1203 
       
  1204     $query = new EntityFieldQuery();
       
  1205     $query
       
  1206       ->entityCondition('entity_type', 'test_entity', '=')
       
  1207       ->fieldCondition($this->fields[0], 'value', 0, '=', NULL, 'group')
       
  1208       ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '<>', NULL, 'group');
       
  1209     $this->assertEntityFieldQuery($query, array(), 'Test with a grouped language meta condition (empty result set).');
       
  1210 
       
  1211     $query = new EntityFieldQuery();
       
  1212     $query
       
  1213       ->entityCondition('entity_type', 'test_entity', '=')
       
  1214       ->fieldCondition($this->fields[0], 'value', 0, '=', NULL, 'group')
       
  1215       ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '!=', NULL, 'group');
       
  1216     $this->assertEntityFieldQuery($query, array(), 'Test with a grouped language meta condition (empty result set).');
       
  1217 
       
  1218     // Test delta and language grouping.
       
  1219     $query = new EntityFieldQuery();
       
  1220     $query
       
  1221       ->entityCondition('entity_type', 'test_entity', '=')
       
  1222       ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language')
       
  1223       ->fieldDeltaCondition($this->fields[0], 1, '<', 'delta', 'language')
       
  1224       ->fieldLanguageCondition($this->fields[0], 'en', '<>', 'delta', 'language');
       
  1225     $this->assertEntityFieldQuery($query, array(
       
  1226       array('test_entity', 1),
       
  1227     ), 'Test with a grouped delta + language meta condition.');
       
  1228 
       
  1229     // Test delta and language grouping.
       
  1230     $query = new EntityFieldQuery();
       
  1231     $query
       
  1232       ->entityCondition('entity_type', 'test_entity', '=')
       
  1233       ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language')
       
  1234       ->fieldDeltaCondition($this->fields[0], 1, '<', 'delta', 'language')
       
  1235       ->fieldLanguageCondition($this->fields[0], 'en', '!=', 'delta', 'language');
       
  1236     $this->assertEntityFieldQuery($query, array(
       
  1237       array('test_entity', 1),
       
  1238     ), 'Test with a grouped delta + language meta condition.');
       
  1239 
       
  1240     $query = new EntityFieldQuery();
       
  1241     $query
       
  1242       ->entityCondition('entity_type', 'test_entity', '=')
       
  1243       ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language')
       
  1244       ->fieldDeltaCondition($this->fields[0], 1, '>=', 'delta', 'language')
       
  1245       ->fieldLanguageCondition($this->fields[0], 'en', '<>', 'delta', 'language');
       
  1246     $this->assertEntityFieldQuery($query, array(), 'Test with a grouped delta + language meta condition (empty result set, delta condition unsatisifed).');
       
  1247 
       
  1248     $query = new EntityFieldQuery();
       
  1249     $query
       
  1250       ->entityCondition('entity_type', 'test_entity', '=')
       
  1251       ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language')
       
  1252       ->fieldDeltaCondition($this->fields[0], 1, '>=', 'delta', 'language')
       
  1253       ->fieldLanguageCondition($this->fields[0], 'en', '!=', 'delta', 'language');
       
  1254     $this->assertEntityFieldQuery($query, array(), 'Test with a grouped delta + language meta condition (empty result set, delta condition unsatisifed).');
       
  1255 
       
  1256     $query = new EntityFieldQuery();
       
  1257     $query
       
  1258       ->entityCondition('entity_type', 'test_entity', '=')
       
  1259       ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language')
       
  1260       ->fieldDeltaCondition($this->fields[0], 1, '<', 'delta', 'language')
       
  1261       ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '<>', 'delta', 'language');
       
  1262     $this->assertEntityFieldQuery($query, array(), 'Test with a grouped delta + language meta condition (empty result set, language condition unsatisifed).');
       
  1263 
       
  1264     $query = new EntityFieldQuery();
       
  1265     $query
       
  1266       ->entityCondition('entity_type', 'test_entity', '=')
       
  1267       ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language')
       
  1268       ->fieldDeltaCondition($this->fields[0], 1, '<', 'delta', 'language')
       
  1269       ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '!=', 'delta', 'language');
       
  1270     $this->assertEntityFieldQuery($query, array(), 'Test with a grouped delta + language meta condition (empty result set, language condition unsatisifed).');
       
  1271 
       
  1272     $query = new EntityFieldQuery();
       
  1273     $query
       
  1274       ->entityCondition('entity_type', 'test_entity', '=')
       
  1275       ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language')
       
  1276       ->fieldDeltaCondition($this->fields[0], 1, '>=', 'delta', 'language')
       
  1277       ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '<>', 'delta', 'language');
       
  1278     $this->assertEntityFieldQuery($query, array(), 'Test with a grouped delta + language meta condition (empty result set, both conditions unsatisifed).');
       
  1279 
       
  1280     $query = new EntityFieldQuery();
       
  1281     $query
       
  1282       ->entityCondition('entity_type', 'test_entity', '=')
       
  1283       ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language')
       
  1284       ->fieldDeltaCondition($this->fields[0], 1, '>=', 'delta', 'language')
       
  1285       ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '!=', 'delta', 'language');
       
  1286     $this->assertEntityFieldQuery($query, array(), 'Test with a grouped delta + language meta condition (empty result set, both conditions unsatisifed).');
       
  1287 
       
  1288     // Test grouping with another field to ensure that grouping cache is reset
       
  1289     // properly.
       
  1290     $query = new EntityFieldQuery();
       
  1291     $query
       
  1292       ->entityCondition('entity_type', 'test_entity_bundle', '=')
       
  1293       ->fieldCondition($this->fields[1], 'shape', 'circle', '=', 'delta', 'language')
       
  1294       ->fieldCondition($this->fields[1], 'color', 'blue', '=', 'delta', 'language')
       
  1295       ->fieldDeltaCondition($this->fields[1], 1, '=', 'delta', 'language')
       
  1296       ->fieldLanguageCondition($this->fields[1], LANGUAGE_NONE, '=', 'delta', 'language');
       
  1297     $this->assertEntityFieldQuery($query, array(
       
  1298       array('test_entity_bundle', 5),
       
  1299     ), 'Test grouping cache.');
       
  1300   }
       
  1301 
       
  1302   /**
       
  1303    * Tests the routing feature of EntityFieldQuery.
       
  1304    */
       
  1305   function testEntityFieldQueryRouting() {
       
  1306     // Entity-only query.
       
  1307     $query = new EntityFieldQuery();
       
  1308     $query->entityCondition('entity_type', 'test_entity_bundle_key');
       
  1309     $this->assertIdentical($query->queryCallback(), array($query, 'propertyQuery'), 'Entity-only queries are handled by the propertyQuery handler.');
       
  1310 
       
  1311     // Field-only query.
       
  1312     $query = new EntityFieldQuery();
       
  1313     $query->fieldCondition($this->fields[0], 'value', '3');
       
  1314     $this->assertIdentical($query->queryCallback(), 'field_sql_storage_field_storage_query', 'Pure field queries are handled by the Field storage handler.');
       
  1315 
       
  1316     // Mixed entity and field query.
       
  1317     $query = new EntityFieldQuery();
       
  1318     $query
       
  1319       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
  1320       ->fieldCondition($this->fields[0], 'value', '3');
       
  1321     $this->assertIdentical($query->queryCallback(), 'field_sql_storage_field_storage_query', 'Mixed queries are handled by the Field storage handler.');
       
  1322 
       
  1323     // Overriding with $query->executeCallback.
       
  1324     $query = new EntityFieldQuery();
       
  1325     $query->entityCondition('entity_type', 'test_entity_bundle_key');
       
  1326     $query->executeCallback = 'field_test_dummy_field_storage_query';
       
  1327     $this->assertEntityFieldQuery($query, array(
       
  1328       array('user', 1),
       
  1329     ), 'executeCallback can override the query handler.');
       
  1330 
       
  1331     // Overriding with $query->executeCallback via hook_entity_query_alter().
       
  1332     $query = new EntityFieldQuery();
       
  1333     $query->entityCondition('entity_type', 'test_entity_bundle_key');
       
  1334     // Add a flag that will be caught by field_test_entity_query_alter().
       
  1335     $query->alterMyExecuteCallbackPlease = TRUE;
       
  1336     $this->assertEntityFieldQuery($query, array(
       
  1337       array('user', 1),
       
  1338     ), 'executeCallback can override the query handler when set in a hook_entity_query_alter().');
       
  1339 
       
  1340     // Mixed-storage queries.
       
  1341     $query = new EntityFieldQuery();
       
  1342     $query
       
  1343       ->fieldCondition($this->fields[0], 'value', '3')
       
  1344       ->fieldCondition($this->fields[1], 'shape', 'squ', 'STARTS_WITH');
       
  1345     // Alter the storage of the field.
       
  1346     $query->fields[1]['storage']['module'] = 'dummy_storage';
       
  1347     try {
       
  1348       $query->queryCallback();
       
  1349     }
       
  1350     catch (EntityFieldQueryException $exception) {
       
  1351       $pass = ($exception->getMessage() == t("Can't handle more than one field storage engine"));
       
  1352     }
       
  1353     $this->assertTrue($pass, 'Cannot query across field storage engines.');
       
  1354   }
       
  1355 
       
  1356   /**
       
  1357    * Tests the pager integration of EntityFieldQuery.
       
  1358    */
       
  1359   function testEntityFieldQueryPager() {
       
  1360     // Test pager in propertyQuery
       
  1361     $_GET['page'] = '0,1';
       
  1362     $query = new EntityFieldQuery();
       
  1363     $query
       
  1364       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
  1365       ->propertyOrderBy('ftid', 'ASC')
       
  1366       ->pager(3, 0);
       
  1367     $this->assertEntityFieldQuery($query, array(
       
  1368       array('test_entity_bundle_key', 1),
       
  1369       array('test_entity_bundle_key', 2),
       
  1370       array('test_entity_bundle_key', 3),
       
  1371     ), 'Test pager integration in propertyQuery: page 1.', TRUE);
       
  1372 
       
  1373     $query = new EntityFieldQuery();
       
  1374     $query
       
  1375       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
  1376       ->propertyOrderBy('ftid', 'ASC')
       
  1377       ->pager(3, 1);
       
  1378     $this->assertEntityFieldQuery($query, array(
       
  1379       array('test_entity_bundle_key', 4),
       
  1380       array('test_entity_bundle_key', 5),
       
  1381       array('test_entity_bundle_key', 6),
       
  1382     ), 'Test pager integration in propertyQuery: page 2.', TRUE);
       
  1383 
       
  1384     // Test pager in field storage
       
  1385     $_GET['page'] = '0,1';
       
  1386     $query = new EntityFieldQuery();
       
  1387     $query
       
  1388       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
  1389       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
  1390       ->propertyOrderBy('ftid', 'ASC')
       
  1391       ->pager(2, 0);
       
  1392     $this->assertEntityFieldQuery($query, array(
       
  1393       array('test_entity_bundle_key', 1),
       
  1394       array('test_entity_bundle_key', 2),
       
  1395     ), 'Test pager integration in field storage: page 1.', TRUE);
       
  1396 
       
  1397     $query = new EntityFieldQuery();
       
  1398     $query
       
  1399       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
  1400       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
  1401       ->propertyOrderBy('ftid', 'ASC')
       
  1402       ->pager(2, 1);
       
  1403     $this->assertEntityFieldQuery($query, array(
       
  1404       array('test_entity_bundle_key', 3),
       
  1405       array('test_entity_bundle_key', 4),
       
  1406     ), 'Test pager integration in field storage: page 2.', TRUE);
       
  1407 
       
  1408     unset($_GET['page']);
       
  1409   }
       
  1410 
       
  1411   /**
       
  1412    * Tests disabling the pager in EntityFieldQuery.
       
  1413    */
       
  1414   function testEntityFieldQueryDisablePager() {
       
  1415     // Test enabling a pager and then disabling it.
       
  1416     $query = new EntityFieldQuery();
       
  1417     $query
       
  1418       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
  1419       ->propertyOrderBy('ftid', 'ASC')
       
  1420       ->pager(1)
       
  1421       ->pager(0);
       
  1422     $this->assertEntityFieldQuery($query, array(
       
  1423       array('test_entity_bundle_key', 1),
       
  1424       array('test_entity_bundle_key', 2),
       
  1425       array('test_entity_bundle_key', 3),
       
  1426       array('test_entity_bundle_key', 4),
       
  1427       array('test_entity_bundle_key', 5),
       
  1428       array('test_entity_bundle_key', 6),
       
  1429     ), 'All test entities are listed when the pager is enabled and then disabled.', TRUE);
       
  1430   }
       
  1431 
       
  1432   /**
       
  1433    * Tests the TableSort integration of EntityFieldQuery.
       
  1434    */
       
  1435   function testEntityFieldQueryTableSort() {
       
  1436     // Test TableSort in propertyQuery
       
  1437     $_GET['sort'] = 'asc';
       
  1438     $_GET['order'] = 'Id';
       
  1439     $header = array(
       
  1440       'id' => array('data' => 'Id', 'type' => 'property',  'specifier' => 'ftid'),
       
  1441       'type' => array('data' => 'Type', 'type' => 'entity', 'specifier' => 'bundle'),
       
  1442     );
       
  1443     $query = new EntityFieldQuery();
       
  1444     $query
       
  1445       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
  1446       ->tableSort($header);
       
  1447     $this->assertEntityFieldQuery($query, array(
       
  1448       array('test_entity_bundle_key', 1),
       
  1449       array('test_entity_bundle_key', 2),
       
  1450       array('test_entity_bundle_key', 3),
       
  1451       array('test_entity_bundle_key', 4),
       
  1452       array('test_entity_bundle_key', 5),
       
  1453       array('test_entity_bundle_key', 6),
       
  1454     ), 'Test TableSort by property: ftid ASC in propertyQuery.', TRUE);
       
  1455 
       
  1456     $_GET['sort'] = 'desc';
       
  1457     $_GET['order'] = 'Id';
       
  1458     $query = new EntityFieldQuery();
       
  1459     $query
       
  1460       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
  1461       ->tableSort($header);
       
  1462     $this->assertEntityFieldQuery($query, array(
       
  1463       array('test_entity_bundle_key', 6),
       
  1464       array('test_entity_bundle_key', 5),
       
  1465       array('test_entity_bundle_key', 4),
       
  1466       array('test_entity_bundle_key', 3),
       
  1467       array('test_entity_bundle_key', 2),
       
  1468       array('test_entity_bundle_key', 1),
       
  1469     ), 'Test TableSort by property: ftid DESC in propertyQuery.', TRUE);
       
  1470 
       
  1471     $_GET['sort'] = 'asc';
       
  1472     $_GET['order'] = 'Type';
       
  1473     $query = new EntityFieldQuery();
       
  1474     $query
       
  1475       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
  1476       ->tableSort($header);
       
  1477     $this->assertEntityFieldQuery($query, array(
       
  1478       array('test_entity_bundle_key', 1),
       
  1479       array('test_entity_bundle_key', 2),
       
  1480       array('test_entity_bundle_key', 3),
       
  1481       array('test_entity_bundle_key', 4),
       
  1482       array('test_entity_bundle_key', 5),
       
  1483       array('test_entity_bundle_key', 6),
       
  1484     ), 'Test TableSort by entity: bundle ASC in propertyQuery.', TRUE);
       
  1485 
       
  1486     $_GET['sort'] = 'desc';
       
  1487     $_GET['order'] = 'Type';
       
  1488     $query = new EntityFieldQuery();
       
  1489     $query
       
  1490       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
  1491       ->tableSort($header);
       
  1492     $this->assertEntityFieldQuery($query, array(
       
  1493       array('test_entity_bundle_key', 5),
       
  1494       array('test_entity_bundle_key', 6),
       
  1495       array('test_entity_bundle_key', 1),
       
  1496       array('test_entity_bundle_key', 2),
       
  1497       array('test_entity_bundle_key', 3),
       
  1498       array('test_entity_bundle_key', 4),
       
  1499     ), 'Test TableSort by entity: bundle DESC in propertyQuery.', TRUE);
       
  1500 
       
  1501     // Test TableSort in field storage
       
  1502     $_GET['sort'] = 'asc';
       
  1503     $_GET['order'] = 'Id';
       
  1504     $header = array(
       
  1505       'id' => array('data' => 'Id', 'type' => 'property',  'specifier' => 'ftid'),
       
  1506       'type' => array('data' => 'Type', 'type' => 'entity', 'specifier' => 'bundle'),
       
  1507       'field' => array('data' => 'Field', 'type' => 'field', 'specifier' => array('field' => $this->field_names[0], 'column' => 'value')),
       
  1508     );
       
  1509     $query = new EntityFieldQuery();
       
  1510     $query
       
  1511       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
  1512       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
  1513       ->tableSort($header);
       
  1514     $this->assertEntityFieldQuery($query, array(
       
  1515       array('test_entity_bundle_key', 1),
       
  1516       array('test_entity_bundle_key', 2),
       
  1517       array('test_entity_bundle_key', 3),
       
  1518       array('test_entity_bundle_key', 4),
       
  1519       array('test_entity_bundle_key', 5),
       
  1520       array('test_entity_bundle_key', 6),
       
  1521     ), 'Test TableSort by property: ftid ASC in field storage.', TRUE);
       
  1522 
       
  1523     $_GET['sort'] = 'desc';
       
  1524     $_GET['order'] = 'Id';
       
  1525     $query = new EntityFieldQuery();
       
  1526     $query
       
  1527       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
  1528       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
  1529       ->tableSort($header);
       
  1530     $this->assertEntityFieldQuery($query, array(
       
  1531       array('test_entity_bundle_key', 6),
       
  1532       array('test_entity_bundle_key', 5),
       
  1533       array('test_entity_bundle_key', 4),
       
  1534       array('test_entity_bundle_key', 3),
       
  1535       array('test_entity_bundle_key', 2),
       
  1536       array('test_entity_bundle_key', 1),
       
  1537     ), 'Test TableSort by property: ftid DESC in field storage.', TRUE);
       
  1538 
       
  1539     $_GET['sort'] = 'asc';
       
  1540     $_GET['order'] = 'Type';
       
  1541     $query = new EntityFieldQuery();
       
  1542     $query
       
  1543       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
  1544       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
  1545       ->tableSort($header)
       
  1546       ->entityOrderBy('entity_id', 'DESC');
       
  1547     $this->assertEntityFieldQuery($query, array(
       
  1548       array('test_entity_bundle_key', 4),
       
  1549       array('test_entity_bundle_key', 3),
       
  1550       array('test_entity_bundle_key', 2),
       
  1551       array('test_entity_bundle_key', 1),
       
  1552       array('test_entity_bundle_key', 6),
       
  1553       array('test_entity_bundle_key', 5),
       
  1554     ), 'Test TableSort by entity: bundle ASC in field storage.', TRUE);
       
  1555 
       
  1556     $_GET['sort'] = 'desc';
       
  1557     $_GET['order'] = 'Type';
       
  1558     $query = new EntityFieldQuery();
       
  1559     $query
       
  1560       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
  1561       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
  1562       ->tableSort($header)
       
  1563       ->entityOrderBy('entity_id', 'ASC');
       
  1564     $this->assertEntityFieldQuery($query, array(
       
  1565       array('test_entity_bundle_key', 5),
       
  1566       array('test_entity_bundle_key', 6),
       
  1567       array('test_entity_bundle_key', 1),
       
  1568       array('test_entity_bundle_key', 2),
       
  1569       array('test_entity_bundle_key', 3),
       
  1570       array('test_entity_bundle_key', 4),
       
  1571     ), 'Test TableSort by entity: bundle DESC in field storage.', TRUE);
       
  1572 
       
  1573     $_GET['sort'] = 'asc';
       
  1574     $_GET['order'] = 'Field';
       
  1575     $query = new EntityFieldQuery();
       
  1576     $query
       
  1577       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
  1578       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
  1579       ->tableSort($header);
       
  1580     $this->assertEntityFieldQuery($query, array(
       
  1581       array('test_entity_bundle_key', 1),
       
  1582       array('test_entity_bundle_key', 2),
       
  1583       array('test_entity_bundle_key', 3),
       
  1584       array('test_entity_bundle_key', 4),
       
  1585       array('test_entity_bundle_key', 5),
       
  1586       array('test_entity_bundle_key', 6),
       
  1587     ), 'Test TableSort by field ASC.', TRUE);
       
  1588 
       
  1589     $_GET['sort'] = 'desc';
       
  1590     $_GET['order'] = 'Field';
       
  1591     $query = new EntityFieldQuery();
       
  1592     $query
       
  1593       ->entityCondition('entity_type', 'test_entity_bundle_key')
       
  1594       ->fieldCondition($this->fields[0], 'value', 0, '>')
       
  1595       ->tableSort($header);
       
  1596     $this->assertEntityFieldQuery($query, array(
       
  1597       array('test_entity_bundle_key', 6),
       
  1598       array('test_entity_bundle_key', 5),
       
  1599       array('test_entity_bundle_key', 4),
       
  1600       array('test_entity_bundle_key', 3),
       
  1601       array('test_entity_bundle_key', 2),
       
  1602       array('test_entity_bundle_key', 1),
       
  1603     ), 'Test TableSort by field DESC.', TRUE);
       
  1604 
       
  1605     unset($_GET['sort']);
       
  1606     unset($_GET['order']);
       
  1607   }
       
  1608 
       
  1609   /**
       
  1610    * Tests EntityFieldQuery access on non-node entities.
       
  1611    */
       
  1612   function testEntityFieldQueryAccess() {
       
  1613     // Test as a user with ability to bypass node access.
       
  1614     $privileged_user = $this->drupalCreateUser(array('bypass node access', 'access content'));
       
  1615     $this->drupalLogin($privileged_user);
       
  1616     $this->drupalGet('entity-query-access/test/' . $this->fields[0]['field_name']);
       
  1617     $this->assertText('Found entity', 'Returned access response with entities.');
       
  1618     $this->drupalLogout();
       
  1619 
       
  1620     // Test as a user that does not have ability to bypass node access or view
       
  1621     // all nodes.
       
  1622     $regular_user = $this->drupalCreateUser(array('access content'));
       
  1623     $this->drupalLogin($regular_user);
       
  1624     $this->drupalGet('entity-query-access/test/' . $this->fields[0]['field_name']);
       
  1625     $this->assertText('Found entity', 'Returned access response with entities.');
       
  1626     $this->drupalLogout();
       
  1627   }
       
  1628 
       
  1629   /**
       
  1630    * Fetches the results of an EntityFieldQuery and compares.
       
  1631    *
       
  1632    * @param $query
       
  1633    *   An EntityFieldQuery to run.
       
  1634    * @param $intended_results
       
  1635    *   A list of results, every entry is again a list, first being the entity
       
  1636    *   type, the second being the entity_id.
       
  1637    * @param $message
       
  1638    *   The message to be displayed as the result of this test.
       
  1639    * @param $ordered
       
  1640    *   If FALSE then the result of EntityFieldQuery will match
       
  1641    *   $intended_results even if the order is not the same. If TRUE then order
       
  1642    *   should match too.
       
  1643    */
       
  1644   function assertEntityFieldQuery($query, $intended_results, $message, $ordered = FALSE) {
       
  1645     $results = array();
       
  1646     try {
       
  1647       foreach ($query->execute() as $entity_type => $entity_ids) {
       
  1648         foreach ($entity_ids as $entity_id => $stub_entity) {
       
  1649           $results[] = array($entity_type, $entity_id);
       
  1650         }
       
  1651       }
       
  1652       if (!isset($ordered) || !$ordered) {
       
  1653         sort($results);
       
  1654         sort($intended_results);
       
  1655       }
       
  1656       $this->assertEqual($results, $intended_results, $message);
       
  1657     }
       
  1658     catch (Exception $e) {
       
  1659       $this->fail('Exception thrown: '. $e->getMessage());
       
  1660     }
       
  1661   }
       
  1662 
       
  1663   /**
       
  1664    * Tests EFQ table prefixing with multiple conditions and an altered join.
       
  1665    *
       
  1666    * @see field_test_query_efq_table_prefixing_test_alter()
       
  1667    */
       
  1668   function testTablePrefixing() {
       
  1669     $query = new EntityFieldQuery();
       
  1670     $query = $query
       
  1671       ->entityCondition('entity_type', 'test_entity')
       
  1672       ->entityCondition('bundle', 'test_bundle')
       
  1673       ->entityCondition('entity_id', '1')
       
  1674       ->addTag('efq_table_prefixing_test');
       
  1675 
       
  1676     $expected = array(array('test_entity', 1));
       
  1677 
       
  1678     $this->assertEntityFieldQuery($query, $expected, 'An EntityFieldQuery returns the expected results when altered with an additional join on the base table.');
       
  1679   }
       
  1680 
       
  1681 }