diff --git a/includes/entity.inc b/includes/entity.inc index 1eb40c5..e6242bb 100644 --- a/includes/entity.inc +++ b/includes/entity.inc @@ -606,7 +606,7 @@ class EntityFieldQuery { * dependent on $operator. * @param $operator * Possible values: - * - '=', '!=', '>', '>=', '<', '<=', 'STARTS_WITH', 'CONTAINS': These + * - '=', '<>', '>', '>=', '<', '<=', 'STARTS_WITH', 'CONTAINS': These * operators expect $value to be a literal of the same type as the * column. * - 'IN', 'NOT IN': These operators expect $value to be an array of @@ -618,6 +618,13 @@ class EntityFieldQuery { * The called object. */ public function entityCondition($name, $value, $operator = NULL) { + // The '!=' operator is deprecated in favour of the '<>' operator since the + // latter is ANSI SQL compatible. However in earlier versions of Drupal 7 + // this was not the case, so to avoid an API change, convert '<>' back to + // '!=' before it is passed to storage modules. + if ($operator == '<>') { + $operator = '!='; + } $this->entityConditions[$name] = array( 'value' => $value, 'operator' => $operator, @@ -724,7 +731,7 @@ class EntityFieldQuery { * element in the array is dependent on $operator. * @param $operator * Possible values: - * - '=', '!=', '>', '>=', '<', '<=', 'STARTS_WITH', 'CONTAINS': These + * - '=', '<>', '>', '>=', '<', '<=', 'STARTS_WITH', 'CONTAINS': These * operators expect $value to be a literal of the same type as the * column. * - 'IN', 'NOT IN': These operators expect $value to be an array of @@ -749,6 +756,13 @@ class EntityFieldQuery { * The called object. */ protected function addFieldCondition(&$conditions, $field, $column = NULL, $value = NULL, $operator = NULL, $delta_group = NULL, $language_group = NULL) { + // The '!=' operator is deprecated in favour of the '<>' operator since the + // latter is ANSI SQL compatible. However in earlier versions of Drupal 7 + // this was not the case, so to avoid an API change, convert '<>' back to + // '!=' before it is passed to storage modules. + if ($operator == '<>') { + $operator = '!='; + } if (is_scalar($field)) { $field_definition = field_info_field($field); if (empty($field_definition)) { @@ -789,7 +803,7 @@ class EntityFieldQuery { * array is dependent on $operator. * @param $operator * Possible values: - * - '=', '!=', '>', '>=', '<', '<=', 'STARTS_WITH', 'CONTAINS': These + * - '=', '<>', '>', '>=', '<', '<=', 'STARTS_WITH', 'CONTAINS': These * operators expect $value to be a literal of the same type as the * column. * - 'IN', 'NOT IN': These operators expect $value to be an array of @@ -803,6 +817,13 @@ class EntityFieldQuery { * The called object. */ public function propertyCondition($column, $value, $operator = NULL) { + // The '!=' operator is deprecated in favour of the '<>' operator since the + // latter is ANSI SQL compatible. However in earlier versions of Drupal 7 + // this was not the case, so to avoid an API change, convert '<>' back to + // '!=' before it is passed to storage modules. + if ($operator == '<>') { + $operator = '!='; + } $this->propertyConditions[] = array( 'column' => $column, 'value' => $value, @@ -1313,6 +1334,10 @@ class EntityFieldQuery { * conditions on aliased columns. */ public function addCondition(SelectQuery $select_query, $sql_field, $condition, $having = FALSE) { + // Convert the '!=' operator to its ANSI SQL equivalent. + if ($condition['operator'] == '!=') { + $condition['operator'] = '<>'; + } $method = $having ? 'havingCondition' : 'condition'; $like_prefix = ''; switch ($condition['operator']) { @@ -1325,7 +1350,6 @@ class EntityFieldQuery { $select_query->$method($sql_field, $condition['value'], $condition['operator']); } } - } /** diff --git a/includes/update.inc b/includes/update.inc index 1eb7a1d..fb1f1bf 100644 --- a/includes/update.inc +++ b/includes/update.inc @@ -1397,7 +1397,7 @@ function update_retrieve_dependencies() { $return = array(); // Get a list of installed modules, arranged so that we invoke their hooks in // the same order that module_invoke_all() does. - $modules = db_query("SELECT name FROM {system} WHERE type = 'module' AND schema_version != :schema ORDER BY weight ASC, name ASC", array(':schema' => SCHEMA_UNINSTALLED))->fetchCol(); + $modules = db_query("SELECT name FROM {system} WHERE type = 'module' AND schema_version <> :schema ORDER BY weight ASC, name ASC", array(':schema' => SCHEMA_UNINSTALLED))->fetchCol(); foreach ($modules as $module) { $function = $module . '_update_dependencies'; if (function_exists($function)) { diff --git a/modules/simpletest/tests/entity_query.test b/modules/simpletest/tests/entity_query.test index 0fe8106..10e2a0e 100644 --- a/modules/simpletest/tests/entity_query.test +++ b/modules/simpletest/tests/entity_query.test @@ -722,6 +722,32 @@ class EntityFieldQueryTestCase extends DrupalWebTestCase { $query = new EntityFieldQuery(); $query ->entityCondition('entity_type', 'test_entity_bundle_key') + ->propertyCondition('ftid', 3, '<>'); + $this->assertEntityFieldQuery($query, array( + array('test_entity_bundle_key', 1), + array('test_entity_bundle_key', 2), + array('test_entity_bundle_key', 4), + array('test_entity_bundle_key', 5), + array('test_entity_bundle_key', 6), + ), t('Test the "not equal to" operation on a property.')); + + $query = new EntityFieldQuery(); + $query->fieldCondition($this->fields[0], 'value', 3, '<>'); + $this->assertEntityFieldQuery($query, array( + array('test_entity_bundle_key', 1), + array('test_entity_bundle_key', 2), + array('test_entity_bundle_key', 4), + array('test_entity_bundle_key', 5), + array('test_entity_bundle_key', 6), + array('test_entity', 1), + array('test_entity', 2), + array('test_entity', 4), + ), t('Test the "not equal to" operation on a field.')); + + + $query = new EntityFieldQuery(); + $query + ->entityCondition('entity_type', 'test_entity_bundle_key') ->propertyCondition('ftid', 3, '!='); $this->assertEntityFieldQuery($query, array( array('test_entity_bundle_key', 1), @@ -1088,6 +1114,15 @@ class EntityFieldQueryTestCase extends DrupalWebTestCase { $query = new EntityFieldQuery(); $query ->entityCondition('entity_type', 'test_entity', '=') + ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '<>'); + $this->assertEntityFieldQuery($query, array( + array('test_entity', 1), + ), t('Test with a language meta condition.')); + + // Test language field meta condition. + $query = new EntityFieldQuery(); + $query + ->entityCondition('entity_type', 'test_entity', '=') ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '!='); $this->assertEntityFieldQuery($query, array( array('test_entity', 1), @@ -1115,6 +1150,17 @@ class EntityFieldQueryTestCase extends DrupalWebTestCase { $query ->entityCondition('entity_type', 'test_entity', '=') ->fieldCondition($this->fields[0], 'value', 0, '=', NULL, 'group') + ->fieldLanguageCondition($this->fields[0], 'en', '<>', NULL, 'group'); + $this->assertEntityFieldQuery($query, array( + array('test_entity', 1), + ), t('Test with a grouped language meta condition.')); + + + // Test language grouping. + $query = new EntityFieldQuery(); + $query + ->entityCondition('entity_type', 'test_entity', '=') + ->fieldCondition($this->fields[0], 'value', 0, '=', NULL, 'group') ->fieldLanguageCondition($this->fields[0], 'en', '!=', NULL, 'group'); $this->assertEntityFieldQuery($query, array( array('test_entity', 1), @@ -1124,6 +1170,13 @@ class EntityFieldQueryTestCase extends DrupalWebTestCase { $query ->entityCondition('entity_type', 'test_entity', '=') ->fieldCondition($this->fields[0], 'value', 0, '=', NULL, 'group') + ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '<>', NULL, 'group'); + $this->assertEntityFieldQuery($query, array(), t('Test with a grouped language meta condition (empty result set).')); + + $query = new EntityFieldQuery(); + $query + ->entityCondition('entity_type', 'test_entity', '=') + ->fieldCondition($this->fields[0], 'value', 0, '=', NULL, 'group') ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '!=', NULL, 'group'); $this->assertEntityFieldQuery($query, array(), t('Test with a grouped language meta condition (empty result set).')); @@ -1133,6 +1186,17 @@ class EntityFieldQueryTestCase extends DrupalWebTestCase { ->entityCondition('entity_type', 'test_entity', '=') ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language') ->fieldDeltaCondition($this->fields[0], 1, '<', 'delta', 'language') + ->fieldLanguageCondition($this->fields[0], 'en', '<>', 'delta', 'language'); + $this->assertEntityFieldQuery($query, array( + array('test_entity', 1), + ), t('Test with a grouped delta + language meta condition.')); + + // Test delta and language grouping. + $query = new EntityFieldQuery(); + $query + ->entityCondition('entity_type', 'test_entity', '=') + ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language') + ->fieldDeltaCondition($this->fields[0], 1, '<', 'delta', 'language') ->fieldLanguageCondition($this->fields[0], 'en', '!=', 'delta', 'language'); $this->assertEntityFieldQuery($query, array( array('test_entity', 1), @@ -1143,6 +1207,14 @@ class EntityFieldQueryTestCase extends DrupalWebTestCase { ->entityCondition('entity_type', 'test_entity', '=') ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language') ->fieldDeltaCondition($this->fields[0], 1, '>=', 'delta', 'language') + ->fieldLanguageCondition($this->fields[0], 'en', '<>', 'delta', 'language'); + $this->assertEntityFieldQuery($query, array(), t('Test with a grouped delta + language meta condition (empty result set, delta condition unsatisifed).')); + + $query = new EntityFieldQuery(); + $query + ->entityCondition('entity_type', 'test_entity', '=') + ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language') + ->fieldDeltaCondition($this->fields[0], 1, '>=', 'delta', 'language') ->fieldLanguageCondition($this->fields[0], 'en', '!=', 'delta', 'language'); $this->assertEntityFieldQuery($query, array(), t('Test with a grouped delta + language meta condition (empty result set, delta condition unsatisifed).')); @@ -1151,6 +1223,14 @@ class EntityFieldQueryTestCase extends DrupalWebTestCase { ->entityCondition('entity_type', 'test_entity', '=') ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language') ->fieldDeltaCondition($this->fields[0], 1, '<', 'delta', 'language') + ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '<>', 'delta', 'language'); + $this->assertEntityFieldQuery($query, array(), t('Test with a grouped delta + language meta condition (empty result set, language condition unsatisifed).')); + + $query = new EntityFieldQuery(); + $query + ->entityCondition('entity_type', 'test_entity', '=') + ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language') + ->fieldDeltaCondition($this->fields[0], 1, '<', 'delta', 'language') ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '!=', 'delta', 'language'); $this->assertEntityFieldQuery($query, array(), t('Test with a grouped delta + language meta condition (empty result set, language condition unsatisifed).')); @@ -1159,6 +1239,14 @@ class EntityFieldQueryTestCase extends DrupalWebTestCase { ->entityCondition('entity_type', 'test_entity', '=') ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language') ->fieldDeltaCondition($this->fields[0], 1, '>=', 'delta', 'language') + ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '<>', 'delta', 'language'); + $this->assertEntityFieldQuery($query, array(), t('Test with a grouped delta + language meta condition (empty result set, both conditions unsatisifed).')); + + $query = new EntityFieldQuery(); + $query + ->entityCondition('entity_type', 'test_entity', '=') + ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language') + ->fieldDeltaCondition($this->fields[0], 1, '>=', 'delta', 'language') ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '!=', 'delta', 'language'); $this->assertEntityFieldQuery($query, array(), t('Test with a grouped delta + language meta condition (empty result set, both conditions unsatisifed).')); diff --git a/modules/system/system.admin.inc b/modules/system/system.admin.inc index 0d3a8d7..3313f5a 100644 --- a/modules/system/system.admin.inc +++ b/modules/system/system.admin.inc @@ -19,7 +19,7 @@ function system_admin_config_page() { SELECT m.*, ml.* FROM {menu_links} ml INNER JOIN {menu_router} m ON ml.router_path = m.path - WHERE ml.link_path != 'admin/help' AND menu_name = :menu_name AND ml.plid = :mlid AND hidden = 0", $admin, array('fetch' => PDO::FETCH_ASSOC)); + WHERE ml.link_path <> 'admin/help' AND menu_name = :menu_name AND ml.plid = :mlid AND hidden = 0", $admin, array('fetch' => PDO::FETCH_ASSOC)); foreach ($result as $item) { _menu_link_translate($item); if (!$item['access']) { diff --git a/modules/system/system.api.php b/modules/system/system.api.php index 179f123..1720e3f 100644 --- a/modules/system/system.api.php +++ b/modules/system/system.api.php @@ -544,7 +544,7 @@ function hook_cron() { // Long-running operation example, leveraging a queue: // Fetch feeds from other sites. - $result = db_query('SELECT * FROM {aggregator_feed} WHERE checked + refresh < :time AND refresh != :never', array( + $result = db_query('SELECT * FROM {aggregator_feed} WHERE checked + refresh < :time AND refresh <> :never', array( ':time' => REQUEST_TIME, ':never' => AGGREGATOR_CLEAR_NEVER, )); diff --git a/modules/system/system.module b/modules/system/system.module index 4136ecd..87625c5 100644 --- a/modules/system/system.module +++ b/modules/system/system.module @@ -2912,7 +2912,7 @@ function system_get_module_admin_tasks($module, $info) { ->condition('ml.hidden', 0, '>=') ->condition('ml.module', 'system') ->condition('m.number_parts', 1, '>') - ->condition('m.page_callback', 'system_admin_menu_block_page', '!='); + ->condition('m.page_callback', 'system_admin_menu_block_page', '<>'); foreach ($query->execute() as $link) { _menu_link_translate($link); if ($link['access']) {