Index: apachesolr.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/apachesolr/apachesolr.module,v
retrieving revision 1.1.2.12.2.130
diff -u -p -r1.1.2.12.2.130 apachesolr.module
--- apachesolr.module	16 Apr 2009 18:11:30 -0000	1.1.2.12.2.130
+++ apachesolr.module	17 Apr 2009 01:29:29 -0000
@@ -513,9 +513,10 @@ function apachesolr_facet_block($respons
     foreach ($response->facet_counts->facet_fields->$facet_field as $facet => $count) {
       $countsort = 1000000 - $count;
       $options = array();
+      $prefix = '';
       // Solr sends this back if it's empty.
       if ($facet == '_empty_') {
-         $field_name = '-'. $facet_field;
+         $prefix = '-';
          $facet = '[* TO *]';
          $facet_text = theme('placeholder', t('Missing this field'));
          $options['html'] = TRUE;
@@ -523,7 +524,6 @@ function apachesolr_facet_block($respons
          $countsort = 1;
        }
        else {
-         $field_name = $facet_field;
          $facet_text = $facet;
       }
 
@@ -533,17 +533,17 @@ function apachesolr_facet_block($respons
       $unclick_link = '';
       $active = FALSE;
       $new_query = clone $query;
-      if ($query->has_filter($field_name, $facet)) {
+      if ($query->has_filter($facet_field, $facet)) {
         $contains_active = $active = TRUE;
         $countsort = 0;
-        $new_query->remove_filter($field_name, $facet);
+        $new_query->remove_filter($facet_field, $facet);
         // TODO: don't assume 'search' - find the real path.
         $path = $new_query->get_path();
         $querystring = $new_query->get_url_querystring();
         $unclick_link = theme('apachesolr_unclick_link', $path, $querystring);
       }
       else {
-        $new_query->add_filter($field_name, $facet);
+        $new_query->add_filter($facet_field, $facet, $prefix);
         $path = $new_query->get_path();
         $querystring = $new_query->get_url_querystring();
       }
@@ -856,7 +856,7 @@ function apachesolr_facetcount_save($edi
 function apachesolr_modify_query(&$query, &$params, $caller) {
 
   foreach (module_implements('apachesolr_modify_query') as $module) {
-    $function_name = "{$module}_apachesolr_modify_query";
+    $function_name = $module . '_apachesolr_modify_query';
     $function_name($query, $params, $caller);
   }
   // Add array of fq parameters.
Index: Solr_Base_Query.php
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/apachesolr/Solr_Base_Query.php,v
retrieving revision 1.1.4.28
diff -u -p -r1.1.4.28 Solr_Base_Query.php
--- Solr_Base_Query.php	16 Apr 2009 15:26:44 -0000	1.1.4.28
+++ Solr_Base_Query.php	17 Apr 2009 01:29:29 -0000
@@ -9,16 +9,17 @@ class Solr_Base_Query implements Drupal_
   public function filter_extract(&$filterstring, $name) {
     $extracted = array();
     // Range queries.  The "TO" is case-sensitive.
-    $patterns[] = '/(^| )'. $name .':([\[\{](\S+) TO (\S+)[\]\}])/';
+    $patterns[] = '/(^| |-)'. $name .':([\[\{](\S+) TO (\S+)[\]\}])/';
     // Match quoted values.
-    $patterns[] = '/(^| )'. $name .':"([^"]*)"/';
+    $patterns[] = '/(^| |-)'. $name .':"([^"]*)"/';
     // Match unquoted values.
-    $patterns[] = '/(^| )'. $name .':([^ ]*)/';
+    $patterns[] = '/(^| |-)'. $name .':([^ ]*)/';
     foreach ($patterns as $p) {
       if (preg_match_all($p, $filterstring, $matches, PREG_SET_ORDER)) {
         foreach($matches as $match) {
           $filter = array();
           $filter['#query'] = $match[0];
+          $filter['#prefix'] = trim($match[1]);
           $filter['#value'] = trim($match[2]);
           if (isset($match[3])) {
             // Extra data for range queries
@@ -44,7 +45,7 @@ class Solr_Base_Query implements Drupal_
     if (preg_match('/[ :]/', $filter['#value']) && !isset($filter['#start']) && !preg_match('/[\[\{]\S+ TO \S+[\]\}]/', $filter['#value'])) {
       $filter['#value'] = '"'. $filter['#value']. '"';
     }
-    return $filter['#name'] . ':' . $filter['#value'];
+    return $filter['#prefix'] . $filter['#name'] . ':' . $filter['#value'];
   }
 
   /**
@@ -123,10 +124,16 @@ class Solr_Base_Query implements Drupal_
     $this->id = ++self::$idCount;
   }
 
-  public function add_filter($field, $value) {
-    $this->fields[] = array('#name' => $field, '#value' => trim($value));
+  public function add_filter($field, $value, $prefix = '') {
+    $this->fields[] = array('#prefix' => $prefix, '#name' => $field, '#value' => trim($value));
   }
 
+  /**
+   * Get all filters, or the subset of filters for one field.
+   *
+   * @param $name
+   *   Optional name of a Solr field.
+   */
   public function get_filters($name = NULL) {
     if (empty($name)) {
       return $this->fields;
@@ -297,19 +304,13 @@ class Solr_Base_Query implements Drupal_
 
     foreach ($this->fields as $field) {
       $name = $field['#name'];
-      $prefix = '';
-      // Handle negative queries.
-      if ($name[0] == '-') {
-        $name = substr($name, 1);
-        $prefix = '-';
-      }
       // Look for a field alias.
       if (isset($this->field_map[$name])) {
-        $field['#name'] = $prefix . $this->field_map[$name];
+        $field['#name'] = $this->field_map[$name];
       }
       $progressive_crumb[] = $this->make_filter($field);
       $options = array('query' => 'filters=' . implode(' ', $progressive_crumb));
-      if ($themed = theme("apachesolr_breadcrumb_{$name}", $field['#value'])) {
+      if ($themed = theme("apachesolr_breadcrumb_{$name}", $field['#value'], $field['#prefix'])) {
         $breadcrumb[] = l($themed, $base, $options);
       }
       else {
@@ -338,18 +339,15 @@ class Solr_Base_Query implements Drupal_
     foreach ((array) $index_fields as $name => $data) {
       // Look for a field alias.
       $alias = isset($this->field_map[$name]) ? $this->field_map[$name] : $name;
-      // Look for normal and negative queries for the same field.
-      foreach(array('', '-') as $prefix) {
-        // Get the values for $name
-        $extracted = $this->filter_extract($filterstring, $prefix . $alias);
-        if (count($extracted)) {
-          foreach ($extracted as $filter) {
-            $pos = strpos($this->filterstring, $filter['#query']);
-            // $solr_keys and $solr_crumbs are keyed on $pos so that query order
-            // is maintained. This is important for breadcrumbs.
-            $filter['#name'] = $prefix . $name;
-            $this->fields[$pos] = $filter;
-          }
+      // Get the values for $name
+      $extracted = $this->filter_extract($filterstring, $alias);
+      if (count($extracted)) {
+        foreach ($extracted as $filter) {
+          $pos = strpos($this->filterstring, $filter['#query']);
+          // $solr_keys and $solr_crumbs are keyed on $pos so that query order
+          // is maintained. This is important for breadcrumbs.
+          $filter['#name'] = $name;
+          $this->fields[$pos] = $filter;
         }
       }
     }
