X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Ftermlists.c;h=fdfc7f0ea81067e27c5defeb3b658afe3f293c93;hb=b3b1946b82bece8b3aa5dedbab43afd24cfa9597;hp=19517d7778d2a0aa432d869d41208e837f7ab93e;hpb=84cf2dcc12c5f978d0563bce2e9c85e9ff3c5956;p=pazpar2-moved-to-github.git diff --git a/src/termlists.c b/src/termlists.c index 19517d7..fdfc7f0 100644 --- a/src/termlists.c +++ b/src/termlists.c @@ -1,17 +1,32 @@ -/* - * $Id: termlists.c,v 1.5 2007-01-15 19:01:15 quinn Exp $ - */ +/* This file is part of Pazpar2. + Copyright (C) 2006-2010 Index Data -#include -#include -#include -#include +Pazpar2 is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Pazpar2 is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +*/ #if HAVE_CONFIG_H -#include +#include #endif +#include +#include +#include + #include "termlists.h" +#include "jenkins_hash.h" // Discussion: // As terms are found in incoming records, they are added to (or updated in) a @@ -27,8 +42,7 @@ struct termlist_bucket struct termlist { struct termlist_bucket **hashtable; - int hashtable_size; - int hashmask; + unsigned hash_size; struct termlist_score **highscore; int highscore_size; @@ -38,42 +52,14 @@ struct termlist NMEM nmem; }; - -// Jenkins one-at-a-time hash (from wikipedia) -static unsigned int hash(const unsigned char *key) -{ - unsigned int hash = 0; - - while (*key) - { - hash += *(key++); - hash += (hash << 10); - hash ^= (hash >> 6); - } - hash += (hash << 3); - hash ^= (hash >> 11); - hash += (hash << 15); - return hash; -} - -struct termlist *termlist_create(NMEM nmem, int numterms, int highscore_size) +struct termlist *termlist_create(NMEM nmem, int highscore_size) { - int hashsize = 1; - int halfnumterms; - struct termlist *res; - - // Calculate a hash size smallest power of 2 larger than 50% of expected numterms - halfnumterms = numterms >> 1; - if (halfnumterms < 0) - halfnumterms = 1; - while (hashsize < halfnumterms) - hashsize <<= 1; - res = nmem_malloc(nmem, sizeof(struct termlist)); - res->hashtable = nmem_malloc(nmem, hashsize * sizeof(struct termlist_bucket*)); - memset(res->hashtable, 0, hashsize * sizeof(struct termlist_bucket*)); - res->hashtable_size = hashsize; + struct termlist *res = nmem_malloc(nmem, sizeof(struct termlist)); + res->hash_size = 399; + res->hashtable = + nmem_malloc(nmem, res->hash_size * sizeof(struct termlist_bucket*)); + memset(res->hashtable, 0, res->hash_size * sizeof(struct termlist_bucket*)); res->nmem = nmem; - res->hashmask = hashsize - 1; // Creates a bitmask res->highscore = nmem_malloc(nmem, highscore_size * sizeof(struct termlist_score *)); res->highscore_size = highscore_size; @@ -121,7 +107,7 @@ static void update_highscore(struct termlist *tl, struct termlist_score *t) } } -void termlist_insert(struct termlist *tl, const char *term) +void termlist_insert(struct termlist *tl, const char *term, int freq) { unsigned int bucket; struct termlist_bucket **p; @@ -130,16 +116,16 @@ void termlist_insert(struct termlist *tl, const char *term) if (strlen(term) > 255) return; strcpy(buf, term); - for (cp = buf + strlen(buf) - 1; cp > buf && - (*cp == ',' || *cp == '.' || *cp == ' '); cp--) - *cp = '\0'; - - bucket = hash((unsigned char *)buf) & tl->hashmask; + /* chop right */ + for (cp = buf + strlen(buf); cp != buf && strchr(",. -", cp[-1]); cp--) + cp[-1] = '\0'; + + bucket = jenkins_hash((unsigned char *)buf) % tl->hash_size; for (p = &tl->hashtable[bucket]; *p; p = &(*p)->next) { if (!strcmp(buf, (*p)->term.term)) { - (*p)->term.frequency++; + (*p)->term.frequency += freq; update_highscore(tl, &((*p)->term)); break; } @@ -149,7 +135,7 @@ void termlist_insert(struct termlist *tl, const char *term) struct termlist_bucket *new = nmem_malloc(tl->nmem, sizeof(struct termlist_bucket)); new->term.term = nmem_strdup(tl->nmem, buf); - new->term.frequency = 1; + new->term.frequency = freq; new->next = 0; *p = new; update_highscore(tl, &new->term); @@ -172,7 +158,9 @@ struct termlist_score **termlist_highscore(struct termlist *tl, int *len) /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab */ +