From 9fe3bf8d659adc5c0623185779272d933fc51d15 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Tue, 17 Oct 1995 18:02:07 +0000 Subject: [PATCH] New feature: databases. Implemented as prefix to words in dictionary. --- index/extract.c | 15 +++- index/index.h | 16 +++- index/kcompare.c | 29 +++++- index/main.c | 28 ++++-- index/trav.c | 50 ++++++----- index/zrpn.c | 260 ++++++++++++++++++++++++++++++++++++------------------ index/zserver.c | 11 ++- index/zserver.h | 13 ++- index/zsets.c | 15 ++-- 9 files changed, 293 insertions(+), 144 deletions(-) diff --git a/index/extract.c b/index/extract.c index 1830850..b557a7f 100644 --- a/index/extract.c +++ b/index/extract.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: extract.c,v $ - * Revision 1.21 1995-10-10 12:24:38 adam + * Revision 1.22 1995-10-17 18:02:07 adam + * New feature: databases. Implemented as prefix to words in dictionary. + * + * Revision 1.21 1995/10/10 12:24:38 adam * Temporary sort files are compressed. * * Revision 1.20 1995/10/06 13:52:05 adam @@ -88,6 +91,7 @@ static int sys_idx_fd = -1; static int key_cmd; static int key_sysno; +static char *key_databaseName; static char **key_buf; static size_t ptr_top; static size_t ptr_i; @@ -182,7 +186,7 @@ void encode_key_write (char *k, struct encode_info *i, FILE *outf) exit (1); } } - + void key_flush (void) { FILE *outf; @@ -257,7 +261,8 @@ static void wordAdd (const RecWord *p) ++ptr_i; key_buf[ptr_top-ptr_i] = (char*)key_buf + kused; kused += index_word_prefix ((char*)key_buf + kused, - p->attrSet, p->attrUse); + p->attrSet, p->attrUse, + 1, &key_databaseName); switch (p->which) { case Word_String: @@ -358,7 +363,8 @@ static int file_read (int fd, char *buf, size_t count) return read (fd, buf, count); } #endif -void file_extract (int cmd, const char *fname, const char *kname) +void file_extract (int cmd, const char *fname, const char *kname, + char *databaseName) { int i, r; char ext[128]; @@ -369,6 +375,7 @@ void file_extract (int cmd, const char *fname, const char *kname) struct recExtractCtrl extractCtrl; RecType rt; + key_databaseName = databaseName; for (i = strlen(fname); --i >= 0; ) if (fname[i] == '/') { diff --git a/index/index.h b/index/index.h index 6ac14c2..7f4d5cc 100644 --- a/index/index.h +++ b/index/index.h @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: index.h,v $ - * Revision 1.17 1995-10-13 16:01:49 adam + * Revision 1.18 1995-10-17 18:02:08 adam + * New feature: databases. Implemented as prefix to words in dictionary. + * + * Revision 1.17 1995/10/13 16:01:49 adam * Work on relations. * * Revision 1.16 1995/10/10 12:24:38 adam @@ -80,9 +83,11 @@ struct dir_entry { struct dir_entry *dir_open (const char *rep); void dir_sort (struct dir_entry *e); void dir_free (struct dir_entry **e_p); -void repository (int cmd, const char *rep, const char *base_path); +void repository (int cmd, const char *rep, const char *base_path, + char *databaseName); -void file_extract (int cmd, const char *fname, const char *kname); +void file_extract (int cmd, const char *fname, const char *kname, + char *databaseName); void key_open (int mem); int key_close (void); @@ -107,4 +112,7 @@ void strtab_del (struct strtab *t, void (*func)(const char *name, void *info, void *data), void *data); int index_char_cvt (int c); -int index_word_prefix (char *string, int attrSet, int attrUse); +int index_word_prefix (char *string, int attset_ordinal, + int local_attribute, + int numbases, + char **databaseNames); diff --git a/index/kcompare.c b/index/kcompare.c index c0575ba..82f9343 100644 --- a/index/kcompare.c +++ b/index/kcompare.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: kcompare.c,v $ - * Revision 1.11 1995-10-06 16:33:37 adam + * Revision 1.12 1995-10-17 18:02:08 adam + * New feature: databases. Implemented as prefix to words in dictionary. + * + * Revision 1.11 1995/10/06 16:33:37 adam * Use attribute mappings. * * Revision 1.10 1995/09/29 14:01:41 adam @@ -113,9 +116,27 @@ int index_char_cvt (int c) } int index_word_prefix (char *string, int attset_ordinal, - int local_attribute) + int local_attribute, + int num_bases, + char **databaseNames) { - sprintf (string, "%c%04d", attset_ordinal + '0', local_attribute); - return 5; + int i; + if (num_bases > 1) + { + sprintf (string, "%c%04d(", attset_ordinal + '0', local_attribute); + strcat (string, databaseNames[i]); + for (i = 1; i < num_bases; i++) + { + strcat (string, "|"); + strcat (string, databaseNames[i]); + } + strcat (string, ")@"); + } + else + sprintf (string, "%c%04d%s@", attset_ordinal + '0', local_attribute, + *databaseNames); + for (i = 0; string[i]; i++) + string[i] = index_char_cvt (string[i]); + return i; } diff --git a/index/main.c b/index/main.c index e0fa497..fb53375 100644 --- a/index/main.c +++ b/index/main.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: main.c,v $ - * Revision 1.13 1995-10-10 12:24:39 adam + * Revision 1.14 1995-10-17 18:02:09 adam + * New feature: databases. Implemented as prefix to words in dictionary. + * + * Revision 1.13 1995/10/10 12:24:39 adam * Temporary sort files are compressed. * * Revision 1.12 1995/10/04 16:57:20 adam @@ -63,10 +66,12 @@ int main (int argc, char **argv) char *arg; char *base_name = NULL; char *base_path = NULL; + char *databaseName = "Default"; int nsections; + int key_open_flag = 0; prog = *argv; - while ((ret = options ("r:v:m:", argv, argc, &arg)) != -2) + while ((ret = options ("r:v:m:d:", argv, argc, &arg)) != -2) { if (ret == 0) { @@ -99,9 +104,12 @@ int main (int argc, char **argv) } else { - unlink ("keys.tmp"); - key_open (mem_max); - repository (cmd, arg, base_path); + if (!key_open_flag) + { + key_open (mem_max); + key_open_flag = 1; + } + repository (cmd, arg, base_path, databaseName); cmd = 0; } } @@ -117,6 +125,10 @@ int main (int argc, char **argv) { mem_max = 1024*1024*atoi(arg); } + else if (ret == 'd') + { + databaseName = arg; + } else { logf (LOG_FATAL, "Unknown option '-%s'", arg); @@ -125,10 +137,12 @@ int main (int argc, char **argv) } if (!base_name) { - fprintf (stderr, "index [-v log] [-r repository] " - "base cmd1 dir1 cmd2 dir2 ...\n"); + fprintf (stderr, "index [-v log] [-r repository] [-m meg] [-d base]" + " base cmd1 dir1 cmd2 dir2 ...\n"); exit (1); } + if (!key_open_flag) + exit (0); nsections = key_close (); if (!nsections) exit (0); diff --git a/index/trav.c b/index/trav.c index c3e8c49..2d888c9 100644 --- a/index/trav.c +++ b/index/trav.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: trav.c,v $ - * Revision 1.4 1995-09-28 09:19:46 adam + * Revision 1.5 1995-10-17 18:02:09 adam + * New feature: databases. Implemented as prefix to words in dictionary. + * + * Revision 1.4 1995/09/28 09:19:46 adam * xfree/xmalloc used everywhere. * Extract/retrieve method seems to work for text records. * @@ -30,7 +33,7 @@ #include #include "index.h" -static void repository_extract_r (int cmd, char *rep) +static void repository_extract_r (int cmd, char *rep, char *databaseName) { struct dir_entry *e; int i; @@ -51,10 +54,10 @@ static void repository_extract_r (int cmd, char *rep) switch (fs.st_mode & S_IFMT) { case S_IFREG: - file_extract (cmd, rep, rep); + file_extract (cmd, rep, rep, databaseName); break; case S_IFDIR: - repository_extract_r (cmd, rep); + repository_extract_r (cmd, rep, databaseName); break; } } @@ -111,15 +114,15 @@ void del_dir (const char *dst) logf (LOG_ERRNO|LOG_WARN, "rmdir"); } -void repository_update_r (int cmd, char *dst, char *src); +void repository_update_r (int cmd, char *dst, char *src, char *databaseName); -void repository_add_tree (int cmd, char *dst, char *src) +void repository_add_tree (int cmd, char *dst, char *src, char *databaseName) { mkdir (dst, 0755); - repository_update_r (cmd, dst, src); + repository_update_r (cmd, dst, src, databaseName); } -void repository_del_tree (int cmd, char *dst, char *src) +void repository_del_tree (int cmd, char *dst, char *src, char *databaseName) { size_t dst_len = strlen (dst); size_t src_len = strlen (src); @@ -148,11 +151,11 @@ void repository_del_tree (int cmd, char *dst, char *src) switch (fs_dst.st_mode & S_IFMT) { case S_IFREG: - file_extract ('d', dst, dst); + file_extract ('d', dst, dst, databaseName); del_file (dst); break; case S_IFDIR: - repository_del_tree (cmd, dst, src); + repository_del_tree (cmd, dst, src, databaseName); break; } i_dst++; @@ -165,7 +168,7 @@ void repository_del_tree (int cmd, char *dst, char *src) } } -void repository_update_r (int cmd, char *dst, char *src) +void repository_update_r (int cmd, char *dst, char *src, char *databaseName) { struct dir_entry *e_dst, *e_src; int i_dst = 0, i_src = 0; @@ -181,13 +184,13 @@ void repository_update_r (int cmd, char *dst, char *src) if (!e_dst) { dir_free (&e_src); - repository_add_tree (cmd, dst, src); + repository_add_tree (cmd, dst, src, databaseName); return; } else if (!e_src) { dir_free (&e_dst); - repository_del_tree (cmd, dst, src); + repository_del_tree (cmd, dst, src, databaseName); return; } @@ -228,13 +231,13 @@ void repository_update_r (int cmd, char *dst, char *src) case S_IFREG: if (fs_src.st_ctime > fs_dst.st_ctime) { - file_extract ('d', dst, dst); - file_extract ('a', src, dst); + file_extract ('d', dst, dst, databaseName); + file_extract ('a', src, dst, databaseName); copy_file (dst, src); } break; case S_IFDIR: - repository_update_r (cmd, dst, src); + repository_update_r (cmd, dst, src, databaseName); break; } i_src++; @@ -249,11 +252,11 @@ void repository_update_r (int cmd, char *dst, char *src) switch (fs_src.st_mode & S_IFMT) { case S_IFREG: - file_extract ('a', src, dst); + file_extract ('a', src, dst, databaseName); copy_file (dst, src); break; case S_IFDIR: - repository_add_tree (cmd, dst, src); + repository_add_tree (cmd, dst, src, databaseName); break; } i_src++; @@ -267,11 +270,11 @@ void repository_update_r (int cmd, char *dst, char *src) switch (fs_dst.st_mode & S_IFMT) { case S_IFREG: - file_extract ('d', dst, dst); + file_extract ('d', dst, dst, databaseName); del_file (dst); break; case S_IFDIR: - repository_del_tree (cmd, dst, src); + repository_del_tree (cmd, dst, src, databaseName); break; } i_dst++; @@ -281,7 +284,8 @@ void repository_update_r (int cmd, char *dst, char *src) dir_free (&e_src); } -void repository (int cmd, const char *rep, const char *base_path) +void repository (int cmd, const char *rep, const char *base_path, + char *databaseName) { char rep_tmp1[2048]; char rep_tmp2[2048]; @@ -290,9 +294,9 @@ void repository (int cmd, const char *rep, const char *base_path) if (base_path) { strcpy (rep_tmp2, base_path); - repository_update_r (cmd, rep_tmp2, rep_tmp1); + repository_update_r (cmd, rep_tmp2, rep_tmp1, databaseName); } else - repository_extract_r (cmd, rep_tmp1); + repository_extract_r (cmd, rep_tmp1, databaseName); } diff --git a/index/zrpn.c b/index/zrpn.c index 0f385e1..698dae1 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: zrpn.c,v $ - * Revision 1.30 1995-10-16 09:32:38 adam + * Revision 1.31 1995-10-17 18:02:10 adam + * New feature: databases. Implemented as prefix to words in dictionary. + * + * Revision 1.30 1995/10/16 09:32:38 adam * More work on relational op. * * Revision 1.29 1995/10/13 16:01:49 adam @@ -114,7 +117,8 @@ #include #include -int index_word_prefix_map (char *string, oid_value attrSet, int attrUse) +int index_word_prefix_map (char *string, oid_value attrSet, int attrUse, + int num_bases, char **basenames) { attent *attp; @@ -124,7 +128,8 @@ int index_word_prefix_map (char *string, oid_value attrSet, int attrUse) return -1; logf (LOG_DEBUG, "ord=%d", attp->attset_ordinal); return index_word_prefix (string, attp->attset_ordinal, - attp->local_attribute); + attp->local_attribute, + num_bases, basenames); } /* @@ -504,7 +509,7 @@ static int grep_handle (Dict_char *name, const char *info, void *p) return 0; } -static void gen_regular_ge (char *dst, int val) +static void gen_regular_rel (char *dst, int val, int islt) { int dst_p = 1; int w, d, i; @@ -512,33 +517,55 @@ static void gen_regular_ge (char *dst, int val) char numstr[20]; *dst = '('; - if (val < 0) - val = 0; sprintf (numstr, "%d", val); for (w = strlen(numstr); --w >= 0; pos++) { d = numstr[w]; if (pos > 0) { - if (d == '9') - continue; - d++; + if (islt) + { + if (d == '0') + continue; + d--; + } + else + { + if (d == '9') + continue; + d++; + } } strcpy (dst + dst_p, numstr); dst_p = strlen(dst) - pos - 1; - if (d <= '8') - { - dst[dst_p++] = '['; - dst[dst_p++] = d; - dst[dst_p++] = '-'; - dst[dst_p++] = '9'; - dst[dst_p++] = ']'; + if (islt) + { + if (d != '0') + { + dst[dst_p++] = '['; + dst[dst_p++] = '0'; + dst[dst_p++] = '-'; + dst[dst_p++] = d; + dst[dst_p++] = ']'; + } + else + dst[dst_p++] = d; } else - dst[dst_p++] = d; - + { + if (d != '9') + { + dst[dst_p++] = '['; + dst[dst_p++] = d; + dst[dst_p++] = '-'; + dst[dst_p++] = '9'; + dst[dst_p++] = ']'; + } + else + dst[dst_p++] = d; + } for (i = 0; i="); + gen_regular_rel (term_dict + strlen(term_dict), term_value, 0); + break; + case 5: + if (term_value < 0) + term_value = 0; + logf (LOG_DEBUG, "Relation >"); + gen_regular_rel (term_dict + strlen(term_dict), term_value+1, 0); + break; + default: + return 0; + } + logf (LOG_DEBUG, "dict_lookup_grep: %s", term_dict); + r = dict_lookup_grep (zi->wordDict, term_dict, 0, grep_info, + grep_handle); + if (r) + logf (LOG_WARN, "dict_lookup_grep fail, rel=gt: %d", r); + logf (LOG_DEBUG, "%d positions", grep_info->isam_p_indx); + return 1; } static int trunc_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, const char *term_sub, - oid_value attributeSet, struct grep_info *grep_info) + oid_value attributeSet, struct grep_info *grep_info, + int num_bases, char **basenames) { - char term_dict[10*IT_MAX_WORD+2]; + char term_dict[2*IT_MAX_WORD+2]; int i, j, r; - const char *info; AttrType truncation; int truncation_value; AttrType use; int use_value; - AttrType relation; - int relation_value; oid_value curAttributeSet = attributeSet; attr_init (&use, zapt, 1); @@ -577,51 +664,31 @@ static int trunc_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, truncation_value = attr_find (&truncation, NULL); logf (LOG_DEBUG, "truncation value %d", truncation_value); - attr_init (&relation, zapt, 2); - relation_value = attr_find (&relation, NULL); - if (use_value == -1) use_value = 1016; - i = index_word_prefix_map (term_dict, curAttributeSet, use_value); + i = index_word_prefix_map (term_dict, curAttributeSet, use_value, + num_bases, basenames); if (i < 0) { zi->errCode = 114; return -1; } - switch (relation_value) - { - case 1: - case 2: - break; - case 4: - logf (LOG_LOG, "Relation ge"); - gen_regular_ge (term_dict + strlen(term_dict), atoi(term_sub)); - logf (LOG_LOG, "dict_lookup_grep: %s", term_dict); - r = dict_lookup_grep (zi->wordDict, term_dict, 0, grep_info, - grep_handle); - if (r) - logf (LOG_WARN, "dict_lookup_grep fail, rel=ge: %d", r); - logf (LOG_LOG, "%d positions", grep_info->isam_p_indx); - return 0; - case 5: - logf (LOG_LOG, "Relation gt"); - gen_regular_ge (term_dict + strlen(term_dict), atoi(term_sub)+1); - logf (LOG_LOG, "dict_lookup_grep: %s", term_dict); - r = dict_lookup_grep (zi->wordDict, term_dict, 0, grep_info, - grep_handle); - if (r) - logf (LOG_WARN, "dict_lookup_grep fail, rel=gt: %d", r); - logf (LOG_LOG, "%d positions", grep_info->isam_p_indx); + + if (relational_term (zi, zapt, term_sub, term_dict, + attributeSet, grep_info)) return 0; - } switch (truncation_value) { case -1: /* not specified */ case 100: /* do not truncate */ + strcat (term_dict, "("); strcat (term_dict, term_sub); - logf (LOG_DEBUG, "dict_lookup: %s", term_dict); - if ((info = dict_lookup (zi->wordDict, term_dict))) - add_isam_p (info, grep_info); + strcat (term_dict, ")"); + logf (LOG_DEBUG, "dict_lookup_grep: %s", term_dict); + r = dict_lookup_grep (zi->wordDict, term_dict, 0, grep_info, + grep_handle); + if (r) + logf (LOG_WARN, "dict_lookup_grep fail, trunc=none: %d", r); break; case 1: /* right truncation */ strcat (term_dict, term_sub); @@ -650,14 +717,14 @@ static int trunc_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, strcat (term_dict, "("); strcat (term_dict, term_sub); strcat (term_dict, ")"); - logf (LOG_LOG, "dict_lookup_grep: %s", term_dict); + logf (LOG_DEBUG, "dict_lookup_grep: %s", term_dict); r = dict_lookup_grep (zi->wordDict, term_dict, 0, grep_info, grep_handle); if (r) - logf (LOG_WARN, "dict_lookup_grep fail, truncation=regular: %d", r); + logf (LOG_WARN, "dict_lookup_grep fail, trunc=regular: %d", r); break; } - logf (LOG_LOG, "%d positions", grep_info->isam_p_indx); + logf (LOG_DEBUG, "%d positions", grep_info->isam_p_indx); return 0; } @@ -677,7 +744,8 @@ static void trans_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, static RSET rpn_search_APT_relevance (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, - oid_value attributeSet) + oid_value attributeSet, + int num_bases, char **basenames) { rset_relevance_parms parms; char termz[IT_MAX_WORD+1]; @@ -709,7 +777,8 @@ static RSET rpn_search_APT_relevance (ZServerInfo *zi, } else strcpy (term_sub, p0); - if (trunc_term (zi, zapt, term_sub, attributeSet, &grep_info)) + if (trunc_term (zi, zapt, term_sub, attributeSet, &grep_info, + num_bases, basenames)) return NULL; if (!p1) break; @@ -729,7 +798,8 @@ static RSET rpn_search_APT_relevance (ZServerInfo *zi, static RSET rpn_search_APT_word (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, - oid_value attributeSet) + oid_value attributeSet, + int num_bases, char **basenames) { rset_isam_parms parms; char termz[IT_MAX_WORD+1]; @@ -747,7 +817,8 @@ static RSET rpn_search_APT_word (ZServerInfo *zi, grep_info.isam_p_size = 0; grep_info.isam_p_buf = NULL; - if (trunc_term (zi, zapt, termz, attributeSet, &grep_info)) + if (trunc_term (zi, zapt, termz, attributeSet, &grep_info, + num_bases, basenames)) return NULL; if (grep_info.isam_p_indx < 1) result = rset_create (rset_kind_null, NULL); @@ -852,7 +923,8 @@ static RSET rpn_prox (RSET *rset, int rset_no) static RSET rpn_search_APT_phrase (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, - oid_value attributeSet) + oid_value attributeSet, + int num_bases, char **basenames) { char termz[IT_MAX_WORD+1]; char term_sub[IT_MAX_WORD+1]; @@ -882,7 +954,8 @@ static RSET rpn_search_APT_phrase (ZServerInfo *zi, strcpy (term_sub, p0); grep_info.isam_p_indx = 0; - if (trunc_term (zi, zapt, term_sub, attributeSet, &grep_info)) + if (trunc_term (zi, zapt, term_sub, attributeSet, &grep_info, + num_bases, basenames)) return NULL; if (grep_info.isam_p_indx == 0) rset[rset_no] = rset_create (rset_kind_null, NULL); @@ -947,7 +1020,8 @@ static RSET rpn_search_APT_local (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, } static RSET rpn_search_APT (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, - oid_value attributeSet) + oid_value attributeSet, + int num_bases, char **basenames) { AttrType relation; AttrType structure; @@ -962,17 +1036,23 @@ static RSET rpn_search_APT (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, { case -1: if (relation_value == 102) /* relevance relation */ - return rpn_search_APT_relevance (zi, zapt, attributeSet); - return rpn_search_APT_phrase (zi, zapt, attributeSet); + return rpn_search_APT_relevance (zi, zapt, attributeSet, + num_bases, basenames); + return rpn_search_APT_phrase (zi, zapt, attributeSet, + num_bases, basenames); case 1: /* phrase */ if (relation_value == 102) /* relevance relation */ - return rpn_search_APT_relevance (zi, zapt, attributeSet); - return rpn_search_APT_phrase (zi, zapt, attributeSet); + return rpn_search_APT_relevance (zi, zapt, attributeSet, + num_bases, basenames); + return rpn_search_APT_phrase (zi, zapt, attributeSet, + num_bases, basenames); break; case 2: /* word */ if (relation_value == 102) /* relevance relation */ - return rpn_search_APT_relevance (zi, zapt, attributeSet); - return rpn_search_APT_word (zi, zapt, attributeSet); + return rpn_search_APT_relevance (zi, zapt, attributeSet, + num_bases, basenames); + return rpn_search_APT_word (zi, zapt, attributeSet, + num_bases, basenames); case 3: /* key */ break; case 4: /* year */ @@ -980,7 +1060,8 @@ static RSET rpn_search_APT (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, case 5: /* date - normalized */ break; case 6: /* word list */ - return rpn_search_APT_relevance (zi, zapt, attributeSet); + return rpn_search_APT_relevance (zi, zapt, attributeSet, + num_bases, basenames); case 100: /* date - un-normalized */ break; case 101: /* name - normalized */ @@ -992,13 +1073,16 @@ static RSET rpn_search_APT (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, case 104: /* urx */ break; case 105: /* free-form-text */ - return rpn_search_APT_relevance (zi, zapt, attributeSet); + return rpn_search_APT_relevance (zi, zapt, attributeSet, + num_bases, basenames); case 106: /* document-text */ - return rpn_search_APT_relevance (zi, zapt, attributeSet); + return rpn_search_APT_relevance (zi, zapt, attributeSet, + num_bases, basenames); case 107: /* local-number */ return rpn_search_APT_local (zi, zapt, attributeSet); case 108: /* string */ - return rpn_search_APT_word (zi, zapt, attributeSet); + return rpn_search_APT_word (zi, zapt, attributeSet, + num_bases, basenames); case 109: /* numeric string */ break; } @@ -1016,7 +1100,8 @@ static RSET rpn_search_ref (ZServerInfo *zi, Z_ResultSetId *resultSetId) } static RSET rpn_search_structure (ZServerInfo *zi, Z_RPNStructure *zs, - oid_value attributeSet) + oid_value attributeSet, + int num_bases, char **basenames) { RSET r = NULL; if (zs->which == Z_RPNStructure_complex) @@ -1024,11 +1109,13 @@ static RSET rpn_search_structure (ZServerInfo *zi, Z_RPNStructure *zs, rset_bool_parms bool_parms; bool_parms.rset_l = rpn_search_structure (zi, zs->u.complex->s1, - attributeSet); + attributeSet, + num_bases, basenames); if (bool_parms.rset_l == NULL) return NULL; bool_parms.rset_r = rpn_search_structure (zi, zs->u.complex->s2, - attributeSet); + attributeSet, + num_bases, basenames); if (bool_parms.rset_r == NULL) { rset_delete (bool_parms.rset_l); @@ -1058,7 +1145,7 @@ static RSET rpn_search_structure (ZServerInfo *zi, Z_RPNStructure *zs, { logf (LOG_DEBUG, "rpn_search_APT"); r = rpn_search_APT (zi, zs->u.simple->u.attributesPlusTerm, - attributeSet); + attributeSet, num_bases, basenames); } else if (zs->u.simple->which == Z_Operand_resultSetId) { @@ -1112,7 +1199,8 @@ int rpn_search (ZServerInfo *zi, attrset = oid_getentbyoid (rpn->attributeSetId); attributeSet = attrset->value; - rset = rpn_search_structure (zi, rpn->RPNStructure, attributeSet); + rset = rpn_search_structure (zi, rpn->RPNStructure, attributeSet, + num_bases, basenames); if (!rset) return zi->errCode; count_set (rset, hits); @@ -1166,6 +1254,7 @@ static int scan_handle (Dict_char *name, const char *info, int pos, } int rpn_scan (ZServerInfo *zi, ODR odr, Z_AttributesPlusTerm *zapt, + int num_bases, char **basenames, int *position, int *num_entries, struct scan_entry **list, int *status) { @@ -1181,6 +1270,9 @@ int rpn_scan (ZServerInfo *zi, ODR odr, Z_AttributesPlusTerm *zapt, struct scan_info scan_info; logf (LOG_DEBUG, "scan, position = %d, num = %d", pos, num); + + if (num_bases != 1) + return 111; scan_info.before = before = pos-1; scan_info.after = after = 1+num-pos; scan_info.odr = odr; @@ -1197,7 +1289,7 @@ int rpn_scan (ZServerInfo *zi, ODR odr, Z_AttributesPlusTerm *zapt, if (use_value == -1) use_value = 1016; - i = index_word_prefix (termz, 1, use_value); + i = index_word_prefix (termz, 1, use_value, num_bases, basenames); strcpy (scan_info.prefix, termz); sizez = term->u.general->len; if (sizez > IT_MAX_WORD) diff --git a/index/zserver.c b/index/zserver.c index 90a8057..07f5961 100644 --- a/index/zserver.c +++ b/index/zserver.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: zserver.c,v $ - * Revision 1.18 1995-10-16 14:03:09 quinn + * Revision 1.19 1995-10-17 18:02:11 adam + * New feature: databases. Implemented as prefix to words in dictionary. + * + * Revision 1.18 1995/10/16 14:03:09 quinn * Changes to support element set names and espec1 * * Revision 1.17 1995/10/16 09:32:40 adam @@ -231,8 +234,9 @@ bend_fetchresult *bend_fetch (void *handle, bend_fetchrequest *q, int *num) return &r; } r.errcode = record_fetch (&server_info, records[0].sysno, - records[0].score, q->stream, - q->format, q->comp, &r.format, &r.record, &r.len); + records[0].score, q->stream, q->format, + q->comp, &r.format, &r.record, &r.len); + resultSetSysnoDel (&server_info, records, 1); return &r; } @@ -253,6 +257,7 @@ bend_scanresult *bend_scan (void *handle, bend_scanrequest *q, int *num) r.term_position = q->term_position; r.num_entries = q->num_entries; r.errcode = rpn_scan (&server_info, server_info.odr, q->term, + q->num_bases, q->basenames, &r.term_position, &r.num_entries, &r.entries, &status); r.status = status; diff --git a/index/zserver.h b/index/zserver.h index d5d4cec..565965a 100644 --- a/index/zserver.h +++ b/index/zserver.h @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: zserver.h,v $ - * Revision 1.10 1995-10-09 16:18:38 adam + * Revision 1.11 1995-10-17 18:02:12 adam + * New feature: databases. Implemented as prefix to words in dictionary. + * + * Revision 1.10 1995/10/09 16:18:38 adam * Function dict_lookup_grep got extra client data parameter. * * Revision 1.9 1995/10/06 14:38:01 adam @@ -43,11 +46,6 @@ #include typedef struct { - size_t size; - char *buf; -} ZServerRecord; - -typedef struct { int sysno; int score; } ZServerSetSysno; @@ -75,6 +73,7 @@ int rpn_search (ZServerInfo *zi, const char *setname, int *hits); int rpn_scan (ZServerInfo *zi, ODR odr, Z_AttributesPlusTerm *zapt, + int num_bases, char **basenames, int *position, int *num_entries, struct scan_entry **list, int *status); @@ -83,4 +82,4 @@ ZServerSet *resultSetAdd (ZServerInfo *zi, const char *name, ZServerSet *resultSetGet (ZServerInfo *zi, const char *name); ZServerSetSysno *resultSetSysnoGet (ZServerInfo *zi, const char *name, int num, int *positions); -void resultSetRecordDel (ZServerInfo *zi, ZServerRecord *records, int num); +void resultSetSysnoDel (ZServerInfo *zi, ZServerSetSysno *records, int num); diff --git a/index/zsets.c b/index/zsets.c index 1e0a590..f4f21e8 100644 --- a/index/zsets.c +++ b/index/zsets.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: zsets.c,v $ - * Revision 1.8 1995-10-10 13:59:25 adam + * Revision 1.9 1995-10-17 18:02:14 adam + * New feature: databases. Implemented as prefix to words in dictionary. + * + * Revision 1.8 1995/10/10 13:59:25 adam * Function rset_open changed its wflag parameter to general flags. * * Revision 1.7 1995/10/06 14:38:01 adam @@ -73,8 +76,8 @@ ZServerSet *resultSetGet (ZServerInfo *zi, const char *name) return NULL; } -ZServerSetSysno *resultSetSysnoGet (ZServerInfo *zi, const char *name, - int num, int *positions) +ZServerSetSysno *resultSetSysnoGet (ZServerInfo *zi, const char *name, + int num, int *positions) { ZServerSet *sset; ZServerSetSysno *sr; @@ -117,11 +120,7 @@ ZServerSetSysno *resultSetSysnoGet (ZServerInfo *zi, const char *name, return sr; } -void resultSetRecordDel (ZServerInfo *zi, ZServerRecord *records, int num) +void resultSetSysnoDel (ZServerInfo *zi, ZServerSetSysno *records, int num) { - int i; - - for (i = 0; i