7502512001-05-22Per Hedbor #include "global.h" #include "stralloc.h" #include "global.h"
7ce8552001-05-22Per Hedbor RCSID("$Id: whitefish.c,v 1.6 2001/05/22 14:03:31 per Exp $");
7502512001-05-22Per Hedbor #include "pike_macros.h" #include "interpret.h" #include "program.h" #include "program_id.h" #include "object.h" #include "operators.h"
4ad07e2001-05-22Per Hedbor #include "array.h" #include "module_support.h"
7502512001-05-22Per Hedbor 
0853842001-05-22Per Hedbor #include "config.h"
7502512001-05-22Per Hedbor #include "whitefish.h" #include "resultset.h"
4926f72001-05-22Per Hedbor #include "blob.h"
7502512001-05-22Per Hedbor  /* must be included last */ #include "module_magic.h"
4ad07e2001-05-22Per Hedbor struct tofree { Blob **blobs; int nblobs; struct object *res; }; void free_stuff( void *_t ) { struct tofree *t= (struct tofree *)_t; int i; if( t->res ) free_object( t->res ); for( i = 0; i<t->nblobs; i++ ) wf_blob_free( t->blobs[i] ); free( t ); } static struct object *low_do_query_merge( Blob **blobs, int nblobs, int field_c[68],
7ce8552001-05-22Per Hedbor  int prox_c[8])
4ad07e2001-05-22Per Hedbor { struct object *res = wf_resultset_new(); struct tofree *__f = malloc( sizeof( struct tofree ) ); ONERROR e; __f->res = res; __f->blobs = blobs; __f->nblobs = nblobs; SET_ONERROR( e, free_stuff, __f );
3693062001-05-22Per Hedbor  /* Time to do the real work. :-) */
4ad07e2001-05-22Per Hedbor  UNSET_ONERROR( e ); __f->res = 0; free_stuff( __f ); return res; }
7502512001-05-22Per Hedbor 
4926f72001-05-22Per Hedbor static void f_do_query_merge( INT32 args ) /*! @decl ResultSet do_query_merge( array(int) musthave, @ *! array(int) field_coefficients, @ *! array(int) proximity_coefficients, @ *! function(int:string) blobfeeder, @ *! int field) *! @[musthave] *! *! Arrays of word ids. Note that the order is significant *! for the ranking. *! *! @[field_coefficients] *! *! An array of ranking coefficients for the different fields. *! In the range of [0x0000-0xffff]. The array (always) has 68 *! elements: *! *! Index Coefficient for field *! ----- --------------------- *! 0..63 Special field 0..63 *! 64 Large body text *! 65 Medium body text *! 66 Small body text *! 67 Anchor *! *! @[proximity_coefficients] *! *! An array of ranking coefficients for the different *! proximity categories. Always has 8 elements, in the range *! of [0x0000-0xffff]. *! *! Index Meaning *! ----- ------- *! 0 spread: 0 (Perfect hit) *! 1 spread: 1-5 *! 2 spread: 6-10 *! 3 spread: 11-20 *! 4 spread: 21-40 *! 5 spread: 41-80 *! 6 spread: 81-160 *! 7 spread: 161- *! *! The 'spread' value should be defined somehow. *! *! @[blobfeeder] *! *! This function returns a Pike string containing the word hits *! for a certain word_id. Call repeatedly until it returns 0. */ { int proximity_coefficients[8];
4ad07e2001-05-22Per Hedbor  int field_coefficients[68]; int numblobs, i; Blob **blobs; struct svalue *cb; struct array *_words, *_field, *_prox; /* 1: Get all arguments. */
7ce8552001-05-22Per Hedbor  get_all_args( "do_query_merge", args, "%a%a%a%O", &_words, &_field, &_prox, &cb);
4ad07e2001-05-22Per Hedbor  if( _field->size != 68 ) Pike_error("Illegal size of field_coefficients array (expected 68)\n" ); if( _prox->size != 8 ) Pike_error("Illegal size of proximity_coefficients array (expected 8)\n" ); numblobs = _words->size; if( !numblobs ) { struct object *o = wf_resultset_new( ); pop_n_elems( args ); push_object( o ); return; } blobs = malloc( sizeof(Blob *) * numblobs ); for( i = 0; i<numblobs; i++ ) blobs[i] = wf_blob_new( cb, _words->item[i].u.integer ); for( i = 0; i<8; i++ ) proximity_coefficients[i] = _prox->item[i].u.integer; for( i = 0; i<48; i++ ) field_coefficients[i] = _field->item[i].u.integer;
4926f72001-05-22Per Hedbor 
4ad07e2001-05-22Per Hedbor  push_object(low_do_query_merge(blobs,numblobs, field_coefficients,
7ce8552001-05-22Per Hedbor  proximity_coefficients ));
4926f72001-05-22Per Hedbor }
7502512001-05-22Per Hedbor void pike_module_init(void) { init_resultset_program();
4926f72001-05-22Per Hedbor  add_function( "do_query_merge", f_do_query_merge, "function(array(int),array(int),array(int)"
7ce8552001-05-22Per Hedbor  ",function(int:string):object)",
4926f72001-05-22Per Hedbor  0 );
7502512001-05-22Per Hedbor } void pike_module_exit(void) {
0853842001-05-22Per Hedbor  exit_resultset_program();
7502512001-05-22Per Hedbor }