]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
More optimization for the 'y' and 'b' matchinfo directives.
authordan <dan@noemail.net>
Wed, 6 May 2015 17:41:19 +0000 (17:41 +0000)
committerdan <dan@noemail.net>
Wed, 6 May 2015 17:41:19 +0000 (17:41 +0000)
FossilOrigin-Name: 8c5b9fedfcee3ac22a222819dceb981ad94a9903

ext/fts3/fts3Int.h
ext/fts3/fts3_snippet.c
manifest
manifest.uuid

index 9e98c0410f82123ac09ebe7572b2afbd016e220b..6db20b9fae2a3e0c6defb223918ac66c0dd1f87e 100644 (file)
@@ -428,7 +428,9 @@ struct Fts3Expr {
   u8 bStart;                 /* True if iDocid is valid */
   u8 bDeferred;              /* True if this expression is entirely deferred */
 
-  u32 *aMI;
+  /* The following are used by the fts3_snippet.c module. */
+  int iPhrase;               /* Index of this phrase in matchinfo() results */
+  u32 *aMI;                  /* See above */
 };
 
 /*
index a317b9a3e9e79aedca3200946171b1750d032348..90752d50373b666ec74ed3c9c189d43e9f4ac678 100644 (file)
@@ -288,6 +288,7 @@ static int fts3ExprIterate(
   return fts3ExprIterate2(pExpr, &iPhrase, x, pCtx);
 }
 
+
 /*
 ** This is an fts3ExprIterate() callback used while loading the doclists
 ** for each phrase into Fts3Expr.aDoclist[]/nDoclist. See also
@@ -332,8 +333,7 @@ static int fts3ExprLoadDoclists(
 
 static int fts3ExprPhraseCountCb(Fts3Expr *pExpr, int iPhrase, void *ctx){
   (*(int *)ctx)++;
-  UNUSED_PARAMETER(pExpr);
-  UNUSED_PARAMETER(iPhrase);
+  pExpr->iPhrase = iPhrase;
   return SQLITE_OK;
 }
 static int fts3ExprPhraseCount(Fts3Expr *pExpr){
@@ -855,6 +855,60 @@ static int fts3ColumnlistCount(char **ppCollist){
   return nEntry;
 }
 
+/*
+** This function gathers 'y' or 'b' data for a single phrase.
+*/
+static void fts3ExprLHits(
+  Fts3Expr *pExpr,                /* Phrase expression node */
+  MatchInfo *p                    /* Matchinfo context */
+){
+  Fts3Table *pTab = (Fts3Table *)p->pCursor->base.pVtab;
+  int iStart;
+  Fts3Phrase *pPhrase = pExpr->pPhrase;
+  char *pIter = pPhrase->doclist.pList;
+  int iCol = 0;
+
+  assert( p->flag==FTS3_MATCHINFO_LHITS_BM || p->flag==FTS3_MATCHINFO_LHITS );
+  if( p->flag==FTS3_MATCHINFO_LHITS ){
+    iStart = pExpr->iPhrase * p->nCol;
+  }else{
+    iStart = pExpr->iPhrase * ((p->nCol + 31) / 32);
+  }
+
+  while( 1 ){
+    int nHit = fts3ColumnlistCount(&pIter);
+    if( (pPhrase->iColumn>=pTab->nColumn || pPhrase->iColumn==iCol) ){
+      if( p->flag==FTS3_MATCHINFO_LHITS ){
+        p->aMatchinfo[iStart + iCol] = (u32)nHit;
+      }else if( nHit ){
+        p->aMatchinfo[iStart + (iCol+1)/32] |= (1 << (iCol&0x1F));
+      }
+    }
+    assert( *pIter==0x00 || *pIter==0x01 );
+    if( *pIter!=0x01 ) break;
+    pIter++;
+    pIter += fts3GetVarint32(pIter, &iCol);
+  }
+}
+
+/*
+** Gather the results for matchinfo directives 'y' and 'b'.
+*/
+static void fts3ExprLHitGather(
+  Fts3Expr *pExpr,
+  MatchInfo *p
+){
+  assert( (pExpr->pLeft==0)==(pExpr->pRight==0) );
+  if( pExpr->bEof==0 && pExpr->iDocid==p->pCursor->iPrevId ){
+    if( pExpr->pLeft ){
+      fts3ExprLHitGather(pExpr->pLeft, p);
+      fts3ExprLHitGather(pExpr->pRight, p);
+    }else{
+      fts3ExprLHits(pExpr, p);
+    }
+  }
+}
+
 /*
 ** fts3ExprIterate() callback used to collect the "global" matchinfo stats
 ** for a single query. 
@@ -1272,7 +1326,7 @@ static int fts3MatchinfoValues(
       case FTS3_MATCHINFO_LHITS: {
         int nZero = fts3MatchinfoSize(pInfo, zArg[i]) * sizeof(u32);
         memset(pInfo->aMatchinfo, 0, nZero);
-        (void)fts3ExprIterate(pCsr->pExpr, fts3ExprLHitsCb, (void*)pInfo);
+        fts3ExprLHitGather(pCsr->pExpr, pInfo);
         break;
       }
 
@@ -1307,7 +1361,7 @@ static int fts3MatchinfoValues(
 ** Populate pCsr->aMatchinfo[] with data for the current row. The 
 ** 'matchinfo' data is an array of 32-bit unsigned integers (C type u32).
 */
-static int fts3GetMatchinfo(
+static void fts3GetMatchinfo(
   sqlite3_context *pCtx,        /* Return results here */
   Fts3Cursor *pCsr,               /* FTS3 Cursor object */
   const char *zArg                /* Second argument to matchinfo() function */
@@ -1339,7 +1393,6 @@ static int fts3GetMatchinfo(
   */
   if( pCsr->pMIBuffer==0 ){
     int nMatchinfo = 0;           /* Number of u32 elements in match-info */
-    int nArg;                     /* Bytes in zArg */
     int i;                        /* Used to iterate through zArg */
 
     /* Determine the number of phrases in the query */
@@ -1388,8 +1441,6 @@ static int fts3GetMatchinfo(
     int n = pCsr->pMIBuffer->nElem * sizeof(u32);
     sqlite3_result_blob(pCtx, aOut, n, xDestroyOut);
   }
-
-  return rc;
 }
 
 /*
@@ -1688,7 +1739,6 @@ void sqlite3Fts3Matchinfo(
 ){
   Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
   const char *zFormat;
-  int rc;
 
   if( zArg ){
     zFormat = zArg;
@@ -1701,7 +1751,7 @@ void sqlite3Fts3Matchinfo(
     return;
   }else{
     /* Retrieve matchinfo() data. */
-    rc = fts3GetMatchinfo(pContext, pCsr, zFormat);
+    fts3GetMatchinfo(pContext, pCsr, zFormat);
     sqlite3Fts3SegmentsClose(pTab);
   }
 }
index 94eecd5b55c2faa63923352564cb8513b820e58c..8865d52ac56a7174f90ece6f676bd8d2b1bd1d26 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Further\soptimizations\sfor\sthe\s'y'\sand\s'b'\smatchinfo\soperators.
-D 2015-05-06T08:43:26.741
+C More\soptimization\sfor\sthe\s'y'\sand\s'b'\smatchinfo\sdirectives.
+D 2015-05-06T17:41:19.953
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 08728ecbeddca339c77bfd564d3484b523dffdb1
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -80,14 +80,14 @@ F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314
 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d
 F ext/fts3/fts3.c 341e9d9a3c7615bac8e815a8937d576265b22f78
 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe
-F ext/fts3/fts3Int.h bf61766eeb57a6922a8458b894d85e50d1cfb04e
+F ext/fts3/fts3Int.h 142837a7544dff49121b67091a71c4f7a4546b0f
 F ext/fts3/fts3_aux.c 9edc3655fcb287f0467d0a4b886a01c6185fe9f1
 F ext/fts3/fts3_expr.c 71c063da9c2a4167fb54aec089dd5ef33a58c9cb
 F ext/fts3/fts3_hash.c 29b986e43f4e9dd40110eafa377dc0d63c422c60
 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf
 F ext/fts3/fts3_icu.c e319e108661147bcca8dd511cd562f33a1ba81b5
 F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009
-F ext/fts3/fts3_snippet.c e03db2f3eb878849aa95e9638873d057be9aad39
+F ext/fts3/fts3_snippet.c aa922977437794f1db44153a3641dc13532d70bf
 F ext/fts3/fts3_term.c 88c55a6fa1a51ab494e33dced0401a6c28791fd7
 F ext/fts3/fts3_test.c 8a3a78c4458b2d7c631fcf4b152a5cd656fa7038
 F ext/fts3/fts3_tokenize_vtab.c a27593ab19657166f6fa5ec073b678cc29a75860
@@ -1256,7 +1256,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P b9b77972d88171e4239b8194f308eb5d60b5d172
-R 34e6b7f6ad3a1ef38f2174c145dcb2ec
+P fbd038bb57322e1ed2e1ee52f3d134594b6bfcc0
+R 780f3f117425896614672c37a51cec34
 U dan
-Z b623aae8ea84248dd7625f093d4e05ab
+Z 685754dfb55ce5a995c9773000dc4c01
index 1c7e9d6f10ca0dcc99834f33963ccb5fc163edbc..61a8b2cb1cafe2fd96ffcd786f14e1751d2b461a 100644 (file)
@@ -1 +1 @@
-fbd038bb57322e1ed2e1ee52f3d134594b6bfcc0
\ No newline at end of file
+8c5b9fedfcee3ac22a222819dceb981ad94a9903
\ No newline at end of file