/** * Converts the WP_Query to a Cloud_Search_Query * @return Cloud_Search_Query */ public function get_cs_query() { $cs_query = new Cloud_Search_Query(); $cs_query->add_facet(apply_filters('lift_search_facets', array())); $parameters = apply_filters('list_search_bq_parameters', array(sprintf("(label '%s')", $this->wp_query->get('s'))), $this); //filter to the current blog/site $parameters[] = new Lift_Expression_Set('and', array(new Lift_Expression_Field('site_id', lift_get_current_site_id(), false), new Lift_Expression_Field('blog_id', get_current_blog_id(), false))); $boolean_query = sprintf('(and %s)', trim(implode(' ', $parameters))); $cs_query->set_boolean_query($boolean_query); // size $posts_per_page = $this->wp_query->get('posts_per_page'); if ($posts_per_page < 0) { $posts_per_page = 9999999; } $cs_query->set_size($posts_per_page); // start $paged = $this->wp_query->get('paged'); $start = 0; if ($paged > 1) { $start = $posts_per_page * ($paged - 1); } $cs_query->set_start($start); $orderby_values = array('date' => 'post_date_gmt', 'relevancy' => 'text_relevance'); // rank $order = $this->wp_query->get('order'); $orderby = isset($orderby_values[$this->wp_query->get('orderby')]) ? $orderby_values[$this->wp_query->get('orderby')] : $orderby_values['relevancy']; if ($orderby) { $cs_query->add_rank($orderby, $order); } // return fields $cs_query->add_return_field('id'); do_action_ref_array('get_cs_query', array($cs_query)); return $cs_query; }
/** * Pulls the next set of items from the queue and sends a batch from it * Callback for Batch Submission Cron * * @todo Add locking */ public static function send_next_batch() { if (!self::ready_for_batch(Lift_Search::get_search_domain_name())) { delete_transient(self::BATCH_LOCK); Lift_Search::event_log('CloudSearch Not Ready for Batch ' . time(), 'The batch is locked or the search domain is either currently processing, needs indexing, or your domain does not have indexes set up.', array('send-queue', 'response-false', 'notice')); return; } $lock_key = md5(uniqid(microtime() . mt_rand(), true)); if (!get_transient(self::BATCH_LOCK)) { set_transient(self::BATCH_LOCK, $lock_key, 300); } if (get_transient(self::BATCH_LOCK) !== $lock_key) { //another cron has this lock return; } update_option(self::LAST_CRON_TIME_OPTION, time()); $closed_queue_id = Lift_Document_Update_Queue::get_closed_queue_id(); $update_query = Lift_Document_Update_Queue::query_updates(array('per_page' => self::get_queue_all_set_size(), 'queue_ids' => array($closed_queue_id))); if (!count($update_query->meta_rows)) { //no documents queued up Lift_Document_Update_Queue::close_active_queue(); delete_transient(self::BATCH_LOCK); return; } $batch = new Lift_Batch(); $batched_meta_keys = array(); $blog_id = get_current_blog_id(); $site_id = lift_get_current_site_id(); foreach ($update_query->meta_rows as $meta_row) { $update_data = get_post_meta($meta_row->post_id, $meta_row->meta_key, true); if ($update_data['document_type'] == 'post') { $action = $update_data['action']; if ($action == 'add') { $post = get_post($update_data['document_id'], ARRAY_A); $post_data = array('ID' => $update_data['document_id'], 'blog_id' => $blog_id, 'site_id' => $site_id); foreach (Lift_Search::get_indexed_post_fields($post['post_type']) as $field) { $post_data[$field] = isset($post[$field]) ? $post[$field] : null; } $sdf_field_data = apply_filters('lift_post_changes_to_data', $post_data, $update_data['fields'], $update_data['document_id']); } else { $sdf_field_data = array('ID' => intval($update_data['document_id'])); } $sdf_doc = Lift_Posts_To_SDF::format_post((object) $sdf_field_data, array('action' => $action, 'time' => time())); try { $batch->add_document((object) $sdf_doc); $batched_meta_keys[] = $meta_row->meta_key; } catch (Lift_Batch_Exception $e) { if (isset($e->errors[0]['code']) && 500 == $e->errors[0]['code']) { break; } Lift_Search::event_log('Batch Add Error ' . time(), json_encode($e), array('batch-add', 'error')); //@todo log error, stop cron? --- update_option( self::$search_semaphore, 1 ); continue; } } } //send the batch $cloud_api = Lift_Search::get_search_api(); if ($r = $cloud_api->sendBatch($batch)) { if ($r->status === "success") { $log_title = "Post Queue Sent "; $tag = 'success'; foreach ($batched_meta_keys as $meta_key) { delete_post_meta($closed_queue_id, $meta_key); } } else { $log_title = "Post Queue Send Error "; $tag = 'error'; } Lift_Search::event_log($log_title . time(), json_encode($r), array('send-queue', 'response-true', $tag)); //@todo delete sent queued items } else { $messages = $cloud_api->getErrorMessages(); Lift_Search::event_log('Post Queue Error ' . time(), $messages, array('send-queue', 'response-false', 'error')); } delete_transient(self::BATCH_LOCK); }