Skip to content

Instantly share code, notes, and snippets.

@gibrown
Created February 26, 2016 20:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gibrown/8fb630a63cade28b21d2 to your computer and use it in GitHub Desktop.
Save gibrown/8fb630a63cade28b21d2 to your computer and use it in GitHub Desktop.
<?php
class Theme_Support_Index_Builder extends WPES_Abstract_Index_Builder {
public function get_config( $args ) {
$defaults = array(
'lang' => 'en',
);
$args = wp_parse_args( $args, $defaults );
$config = array();
$config['index_name'] = $args['index_name'] . '-' . $args['version'];
$config['rd_index_name'] = $config['index_name'] . '-rd';
$config['wr_index_name'] = $config['index_name'] . '-wr';
$config['settings_json'] = json_encode( array(
'settings' => $this->get_settings( $args ),
) );
$config['mappings_json'] = json_encode( $this->get_mappings( $args ) );
$config['doc_callbacks_serial'] = serialize( $this->get_doc_callbacks() );
$config['rd_alias_json'] = json_encode( array(
'index' => $config['index_name'],
'alias' => $config['rd_index_name'],
) );
$config['wr_alias_json'] = json_encode( array(
'index' => $config['index_name'],
'alias' => $config['wr_index_name'],
) );
return $config;
}
public function get_settings( $args ) {
$defaults = array(
'lang' => 'en',
);
$args = wp_parse_args( $args, $defaults );
$analyzer_builder = new WPES_Analyzer_Builder();
$analyzers = $analyzer_builder->build_analyzers( array( $args['lang'], 'lowercase' ) );
//use the lang analyzer as the default analyzer for this index
$analyzer_name = $analyzer_builder->get_analyzer_name( $args['lang'] );
$analyzers['analyzer']['default'] = $analyzers['analyzer'][$analyzer_name];
//optimized for VIP cluster
$global_settings = array(
'number_of_shards' => 2,
'number_of_replicas' => 1,
'analysis' => $analyzers,
);
return $global_settings;
}
public function get_mappings( $args ) {
$post_fld_bldr = new WPES_WPCOM_Post_Field_Builder();
////////////////Post Mapping//////////////////
$post_mapping = $post_fld_bldr->get_mappings( array(
'index_meta' => true,
'index_mlt_content' => true,
) );
$post_mapping['properties']['base_forum_id'] = array(
'type' => 'integer',
'index' => 'not_analyzed'
);
$post_mapping['properties']['base_forum_title'] = array(
'type' => 'string',
'index' => 'not_analyzed'
);
$post_mapping['properties']['base_forum_url'] = array(
'type' => 'string',
'index' => 'not_analyzed'
);
$post_mapping['properties']['forum_id'] = array(
'type' => 'integer',
'index' => 'not_analyzed'
);
$post_mapping['properties']['forum_title'] = array(
'type' => 'string',
'index' => 'not_analyzed'
);
$post_mapping['properties']['forum_url'] = array(
'type' => 'string',
'index' => 'not_analyzed'
);
unset( $post_mapping['properties']['blog'] );
return array(
'post' => $post_mapping,
);
}
public function get_doc_callbacks() {
return array(
'post' => 'Theme_Support_Post_Doc_Builder',
);
}
}
class Theme_Support_Post_Doc_Builder extends WPES_Abstract_Document_Builder {
public function get_id( $args ) {
return $args['blog_id'] . '-p-' . $args['id'];
}
public function get_type( $args ) {
return 'post';
}
public function get_parent_id( $args ) {
return false;
}
public function doc( $args ) {
// Attempt to register the bbPress CPTs here until we find a better way
$post_type_opts = array(
'public' => true,
'exclude_from_search' => false,
);
register_post_type( 'forum', $post_type_opts );
register_post_type( 'topic', $post_type_opts );
register_post_type( 'reply', $post_type_opts );
$post_fld_bldr = new WPES_WPCOM_Post_Field_Builder();
switch_to_blog( $args['blog_id'] );
$fld_args = array(
'blog_id' => $args['blog_id'],
'post_id' => $args['id'],
'index_meta' => true,
'index_mlt_content' => true,
);
$data = $post_fld_bldr->get_all_fields( $fld_args );
unset( $data['blog'] );
$parent_id = $data['parent_post_id'];
$this->add_parents( $parent_id, $data);
restore_current_blog();
return $data;
}
public function update( $args ) {
$post_fld_bldr = new WPES_WPCOM_Post_Field_Builder();
return $post_fld_bldr->get_update_script( $args );
}
public function is_indexable( $args ) {
switch_to_blog( $args['blog_id'] );
$post = get_post( $args['id'] );
restore_current_blog();
return $post->post_type == 'topic';
}
public function get_doc_iterator( $args ) {
$it = new WPES_WP_Post_Iterator();
$it->init( array(
'blog_id' => $args['blog_id'],
'sql_where' => "post_status NOT IN ('auto-draft','inherit', 'draft', 'spam', 'trash') AND post_type = 'topic'",
'doc_builder' => $this,
'start' => $args['start'],
) );
return $it;
}
private function add_parents( $parent_id, &$data ) {
if ( is_numeric( $parent_id ) ) {
$post = get_post( $parent_id );
if ( $post->post_parent > 0 ) {
$data["forum_id"] = $post->ID;
$data["forum_title"] = $post->post_title;
$data["forum_url"] = get_post_permalink( $parent_id );
$this->add_parents( $post->post_parent, $data );
} else {
$data["base_forum_id"] = $post->ID;
$data["base_forum_title"] = $post->post_title;
$data["base_forum_url"] = get_post_permalink( $parent_id );
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment