]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Refactor fts2 loadSegmentLeaf() in preparation for prefix-searching.
authorshess <shess@noemail.net>
Fri, 27 Apr 2007 21:01:59 +0000 (21:01 +0000)
committershess <shess@noemail.net>
Fri, 27 Apr 2007 21:01:59 +0000 (21:01 +0000)
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

ext/fts2/fts2.c
manifest
manifest.uuid

index 3c14e8f8bc58eedf0d8c143948f8f16561440dbb..828a091e803394cdf302e044ea220f1e29d1f264 100644 (file)
@@ -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
index 24215d2264d3bb5a9f0899f3533f367834f8e1c3..9e0f4819c8ea40aff81f26de49e91e8b3c65a537 100644 (file)
--- 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
index b27b17606858b0903a78ee867587ccf07b9b99df..e10c96a34c61a765d35228847d813ef74960175f 100644 (file)
@@ -1 +1 @@
-e92bd97a3726bbb7978489e2994747127c4aefcf
\ No newline at end of file
+22ffdae4b6f3d0ea584dafa5268af7aa6fdcdc6e
\ No newline at end of file