Index: nodequeue.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/nodequeue.module,v
retrieving revision 1.71
diff -u -p -r1.71 nodequeue.module
--- nodequeue.module	1 Feb 2009 17:17:14 -0000	1.71
+++ nodequeue.module	23 Apr 2009 00:57:49 -0000
@@ -294,13 +294,89 @@ function nodequeue_link($type, $node = N
 /**
  * Implementation of hook_views_api()
  */
-
 function nodequeue_views_api() {
   return array(
     'api' => 2,
     'path' => drupal_get_path('module', 'nodequeue') .'/includes/views',
   );
 }
+
+/**
+ * Implementation of hook_form_$form-id_alter().
+ */
+function nodequeue_form_apachesolr_search_bias_form_alter(&$form, $form_state) {
+  // setup for the form building
+  $weights = drupal_map_assoc(array('21.0', '13.0', '8.0', '5.0', '3.0', '2.0', '1.0', '0.8', '0.5', '0.3', '0.2', '0.1'));
+  $weights['0'] = t('Normal');
+  $queues = nodequeue_load_subqueues_by_queue(array_keys(nodequeue_get_all_qids()));
+  
+  // build the form
+  $form['biasing']['nodequeue_boost'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Nodequeue Biasing'),
+    '#weight' => -5,
+    '#collapsible' => TRUE, 
+    '#collapsed' => TRUE, 
+  );
+  $form['biasing']['nodequeue_boost']['nodequeue_apachesolr_boost'] = array(
+    '#type' => 'item',
+    '#description' => t("Specify to bias the search result when a node is in a queue. Any value except <em>Normal</em> will increase the socre for the given queue in the search results"),
+  );
+  foreach ($queues as $sqid => $queue) {
+    $boost = variable_get("nodequeue_apachesolr_boost_$sqid", 0);
+    // add in setting for each queue
+    $form['biasing']['nodequeue_boost']['nodequeue_apachesolr_boost']["nodequeue_apachesolr_boost_$sqid"] = array(
+      '#type' => 'select',
+      '#title' => t('Weight for %title nodequeue', array('%title' => $queue->title)),
+      '#options' => $weights,
+      '#default_value' => $boost,
+    );
+  }
+}
+
+/**
+ * Implementation of hook_apachesolr_update_index().
+ */
+function nodequeue_apachesolr_update_index(&$document, $node) {
+  $queues = nodequeue_load_queues(array_keys(nodequeue_get_all_qids()));
+  $subqueues = nodequeue_get_subqueues_by_node($queues, $node);
+
+  nodequeue_set_subqueue_positions($subqueues, $node->nid);
+  foreach ($subqueues as $sqid => $subqueue) {
+    if (!empty($subqueue->position)) {
+      $key = _nodequeue_solr_qid_key();
+      $document->$key = $sqid;
+    }
+  }
+}
+
+/**
+ * return the apachesolr index key for group id
+ */
+function _nodequeue_solr_qid_key() {
+  $qid_key = array(
+    'index_type' => 'sint',
+    'multiple' => TRUE,
+    'name' => "nodequeue",
+  );
+  
+  return apachesolr_index_key($qid_key);
+}
+
+/**
+ * Implementation of hook_apachesolr_modify_query().
+ */
+function nodequeue_apachesolr_modify_query($query, &$params, $caller) {
+  $queues = nodequeue_load_subqueues_by_queue(array_keys(nodequeue_get_all_qids()));
+  foreach ($queues as $sqid => $queue) {
+    $boost = variable_get("nodequeue_apachesolr_boost_$sqid", 0);
+    if (!empty($boost)) {
+      $params['bq'][] = _nodequeue_solr_qid_key() . ":$sqid^$boost";
+      $params['facet.field'][] = _nodequeue_solr_qid_key();
+    }
+  }
+}
+
 // --------------------------------------------------------------------------
 // Nodequeue Admin operations
 
@@ -1922,9 +1998,12 @@ function nodequeue_load_subqueues_by_que
  *   A keyed array of references to load. The key is the $qid and each value
  *   is another array of references.
  */
-function nodequeue_load_subqueues_by_reference($references) {
+function nodequeue_load_subqueues_by_reference($references, $reset = FALSE) {
   static $cache = array();
   $subqueues = array();
+  if ($reset) {
+    $cache = array();
+  }
 
   // build strings for the query based upon the qids and references.
   $keys = $values = array();
@@ -2106,6 +2185,9 @@ function nodequeue_subqueue_add($queue, 
   }
 
   db_query("INSERT INTO {nodequeue_nodes} (sqid, qid, nid, position, timestamp) VALUES (%d, %d, %d, %d, %d)", $subqueue->sqid, $queue->qid, $nid, $subqueue->count + 1, time());
+  if (module_exists('apachesolr')) {
+    apachesolr_mark_node($nid);
+  }
 }
 
 /**
@@ -2121,6 +2203,9 @@ function nodequeue_subqueue_add($queue, 
 function nodequeue_subqueue_remove_node($sqid, $nid) {
   if ($pos = nodequeue_get_subqueue_position($sqid, $nid)) {
     nodequeue_subqueue_remove($sqid, $pos);
+    if (module_exists('apachesolr')) {
+      apachesolr_mark_node($nid);
+    }
   }
 }
 /**
@@ -2289,6 +2374,7 @@ function nodequeue_set_subqueue_position
 function nodequeue_get_subqueues_by_node($queues, $node) {
   // Determine which subqueues are valid for each queue.
   $references= array();
+  static $last_nid = 0;
   foreach ($queues as $queue) {
     if ($result = nodequeue_api_subqueues($queue, $node)) {
       $references[$queue->qid] = is_array($result) ? $result : array($result);
@@ -2298,8 +2384,11 @@ function nodequeue_get_subqueues_by_node
   if (empty($references)) {
     return;
   }
-
-  return nodequeue_load_subqueues_by_reference($references);
+  // only allow the static cache to be used if the nid is the same as the last
+  $subqueues = nodequeue_load_subqueues_by_reference($references, ($last_nid != $node->nid));
+  $last_nid = $node->nid;
+  
+  return $subqueues;
 }
 
 /**
