From: shess Date: Fri, 27 Apr 2007 21:01:59 +0000 (+0000) Subject: Refactor fts2 loadSegmentLeaf() in preparation for prefix-searching. X-Git-Tag: version-3.4.0~200 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1c7ebb08056c26879d962ad6d839de2ea8d7ae64;p=thirdparty%2Fsqlite.git Refactor fts2 loadSegmentLeaf() in preparation for prefix-searching. Prefix-searching will want to accumulate data across multiple leaves in the segment, using LeavesReader instead of LeafReader is the first step in that direction. (CVS 3881) FossilOrigin-Name: 22ffdae4b6f3d0ea584dafa5268af7aa6fdcdc6e --- diff --git a/ext/fts2/fts2.c b/ext/fts2/fts2.c index 3c14e8f8bc..828a091e80 100644 --- a/ext/fts2/fts2.c +++ b/ext/fts2/fts2.c @@ -5079,45 +5079,64 @@ static int segmentMerge(fulltext_vtab *v, int iLevel){ return rc; } -/* Read pData[nData] as a leaf node, and if the doclist for -** pTerm[nTerm] is present, merge it over *out (any duplicate doclists -** read from pData will overwrite those in *out). +/* Scan pReader for pTerm/nTerm, and merge the term's doclist over +** *out (any doclists with duplicate docids overwrite those in *out). +** Internal function for loadSegmentLeaf(). */ -static int loadSegmentLeaf(fulltext_vtab *v, const char *pData, int nData, - const char *pTerm, int nTerm, DataBuffer *out){ - LeafReader reader; - assert( nData>1 ); - assert( *pData=='\0' ); - - /* This code should never be called with buffered updates. */ - assert( v->nPendingData<0 ); +static int loadSegmentLeavesInt(fulltext_vtab *v, LeavesReader *pReader, + const char *pTerm, int nTerm, DataBuffer *out){ + assert( nTerm>0 ); - leafReaderInit(pData, nData, &reader); - while( !leafReaderAtEnd(&reader) ){ - int c = leafReaderTermCmp(&reader, pTerm, nTerm); + /* Process while the prefix matches. */ + while( !leavesReaderAtEnd(pReader) ){ + /* TODO(shess) Really want leavesReaderTermCmp(), but that name is + ** already taken to compare the terms of two LeavesReaders. Think + ** on a better name. [Meanwhile, break encapsulation rather than + ** use a confusing name.] + */ + int rc, c = leafReaderTermCmp(&pReader->leafReader, pTerm, nTerm); if( c==0 ){ + const char *pData = leavesReaderData(pReader); + int nData = leavesReaderDataBytes(pReader); if( out->nData==0 ){ - dataBufferReplace(out, - leafReaderData(&reader), leafReaderDataBytes(&reader)); + dataBufferReplace(out, pData, nData); }else{ DLReader readers[2]; DataBuffer result; dlrInit(&readers[0], DL_DEFAULT, out->pData, out->nData); - dlrInit(&readers[1], DL_DEFAULT, - leafReaderData(&reader), leafReaderDataBytes(&reader)); - dataBufferInit(&result, out->nData+leafReaderDataBytes(&reader)); + dlrInit(&readers[1], DL_DEFAULT, pData, nData); + dataBufferInit(&result, out->nData+nData); docListMerge(&result, readers, 2); dataBufferDestroy(out); *out = result; + dlrDestroy(&readers[0]); + dlrDestroy(&readers[1]); } - } - if( c>=0 ) break; - leafReaderStep(&reader); + } + if( c>=0 ) break; /* Past any possible matches. */ + + rc = leavesReaderStep(v, pReader); + if( rc!=SQLITE_OK ) return rc; } - leafReaderDestroy(&reader); return SQLITE_OK; } +/* Call loadSegmentLeavesInt() with pData/nData as input. */ +static int loadSegmentLeaf(fulltext_vtab *v, const char *pData, int nData, + const char *pTerm, int nTerm, DataBuffer *out){ + LeavesReader reader; + int rc; + + assert( nData>1 ); + assert( *pData=='\0' ); + rc = leavesReaderInit(v, 0, 0, 0, pData, nData, &reader); + if( rc!=SQLITE_OK ) return rc; + + rc = loadSegmentLeavesInt(v, &reader, pTerm, nTerm, out); + leavesReaderDestroy(&reader); + return rc; +} + /* Traverse the tree represented by pData[nData] looking for ** pTerm[nTerm], merging its doclist over *out if found (any duplicate ** doclists read from the segment rooted at pData will overwrite those diff --git a/manifest b/manifest index 24215d2264..9e0f4819c8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\ssqlite3_value_bytes()\sdoes\snot\sreformat\sthe\scontent\safter\sa\ncall\sto\ssqlite3_value_blob().\s\sAdd\sdocumentation\sto\sexplain\sthis\shazard.\nAdd\smany\snew\stests.\s\sTicket\s#2321.\s(CVS\s3880) -D 2007-04-27T17:16:20 +C Refactor\sfts2\sloadSegmentLeaf()\sin\spreparation\sfor\sprefix-searching.\nPrefix-searching\swill\swant\sto\saccumulate\sdata\sacross\smultiple\sleaves\nin\sthe\ssegment,\susing\sLeavesReader\sinstead\sof\sLeafReader\sis\sthe\sfirst\nstep\sin\sthat\sdirection.\s(CVS\s3881) +D 2007-04-27T21:02:00 F Makefile.in 8cab54f7c9f5af8f22fd97ddf1ecfd1e1860de62 F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028 @@ -34,7 +34,7 @@ F ext/fts1/fulltext.h 08525a47852d1d62a0be81d3fc3fe2d23b094efd F ext/fts1/simple_tokenizer.c 1844d72f7194c3fd3d7e4173053911bf0661b70d F ext/fts1/tokenizer.h 0c53421b832366d20d720d21ea3e1f6e66a36ef9 F ext/fts2/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts2/fts2.c dd35df80f4b99181d610302c5a4ac71406a02fe0 +F ext/fts2/fts2.c 430ef1093f23691604fb6648c280159bc4465d74 F ext/fts2/fts2.h 591916a822cfb6426518fdbf6069359119bc46eb F ext/fts2/fts2_hash.c b3f22116d4ef0bc8f2da6e3fdc435c86d0951a9b F ext/fts2/fts2_hash.h e283308156018329f042816eb09334df714e105e @@ -464,7 +464,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5 -P 40ba6493e9e8ba135552a2a0943ab499713ac001 -R ae6e82023418585801b4f01168703216 -U drh -Z e4fdef4577a3571a48a38a52b01018a7 +P e92bd97a3726bbb7978489e2994747127c4aefcf +R 5fb6880a5d72930ca95c09c7065e68ee +U shess +Z b6beaad154ccbe5f20864433f88b3cb0 diff --git a/manifest.uuid b/manifest.uuid index b27b176068..e10c96a34c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e92bd97a3726bbb7978489e2994747127c4aefcf \ No newline at end of file +22ffdae4b6f3d0ea584dafa5268af7aa6fdcdc6e \ No newline at end of file