tracker r2389 - in trunk: . src/tracker-fts utils/tracker-fts
- From: pvanhoof svn gnome org
- To: svn-commits-list gnome org
- Subject: tracker r2389 - in trunk: . src/tracker-fts utils/tracker-fts
- Date: Mon, 20 Oct 2008 08:20:55 +0000 (UTC)
Author: pvanhoof
Date: Mon Oct 20 08:20:55 2008
New Revision: 2389
URL: http://svn.gnome.org/viewvc/tracker?rev=2389&view=rev
Log:
2008-10-20 Philip Van Hoof <philip codeminded be>
* src/tracker-fts/tracker-fts.c
* utils/tracker-fts/tracker-fts-test.c: Simple rank() impl. without
weighting (just counting). It seems the last matching row ain't being
counted but I haven't found howcome yet (sqlite is just not calling
the functions for this one).
Modified:
trunk/ChangeLog
trunk/src/tracker-fts/tracker-fts.c
trunk/utils/tracker-fts/tracker-fts-test.c
Modified: trunk/src/tracker-fts/tracker-fts.c
==============================================================================
--- trunk/src/tracker-fts/tracker-fts.c (original)
+++ trunk/src/tracker-fts/tracker-fts.c Mon Oct 20 08:20:55 2008
@@ -3980,6 +3980,60 @@
trimSnippetOffsetsForNear(&p->q, &p->snippet);
}
+static void snippetJustCount (fulltext_cursor *p){
+ int iColumn, i;
+ fulltext_vtab *pFts;
+ int hit_column = 0;
+ int hit_column_count;
+ PLReader plReader;
+ int col_array[255];
+ gpointer pos_array[255];
+ int iPos = 0;
+ const char *zDoc;
+ int nDoc;
+
+ if( p->snippet.nMatch ) return;
+ if( p->q.nTerms==0 ) return;
+ pFts = p->q.pFts;
+
+ for (i=0; i<255; i++) {
+ col_array[i] = 0;
+ pos_array[i] = NULL;
+ }
+
+ if (dlrAtEnd (&p->reader)) return;
+
+ plrInit(&plReader, &p->reader);
+
+ if (plrAtEnd(&plReader)) return;
+
+ iColumn = -1;
+
+ for ( ; !plrAtEnd(&plReader); plrStep(&plReader) ){
+ if (plrColumn (&plReader) != iColumn) {
+ iColumn = plrColumn(&plReader);
+ col_array[iColumn] += 1;
+ }
+ iPos = plrPosition(&plReader);
+ }
+
+ plrEndAndDestroy(&plReader);
+
+ hit_column_count = col_array[0];
+
+ for (i=0; i<255; i++) {
+ if (col_array [i] > hit_column_count) {
+ hit_column = i;
+ hit_column_count =col_array[i];
+ }
+ }
+
+ zDoc = (const char*)sqlite3_column_text(p->pStmt, hit_column+1);
+ printf ("%s\n", zDoc);
+ nDoc = sqlite3_column_bytes(p->pStmt, hit_column+1);
+ snippetOffsetsOfColumn(&p->q, &p->snippet, hit_column, zDoc, nDoc, iPos);
+
+}
/*
** Convert the information in the aMatch[] array of the snippet
** into the string zOffset[0..nOffset-1].
@@ -7012,6 +7066,30 @@
}
}
+
+/*
+** Implementation of the rank() function for FTS3
+*/
+static void rankFunc(
+ sqlite3_context *pContext,
+ int argc,
+ sqlite3_value **argv
+){
+
+ // TODO
+
+ fulltext_cursor *pCursor;
+ if( argc<1 ) return;
+ if( sqlite3_value_type(argv[0])!=SQLITE_BLOB ||
+ sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){
+ sqlite3_result_error(pContext, "illegal first argument to html_snippet",-1);
+ }else{
+ memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor));
+ snippetJustCount(pCursor);
+ sqlite3_result_int(pContext, pCursor->snippet.nMatch);
+ }
+}
+
/*
** Implementation of the offsets() function for FTS3
** altered by tracker to omit query term position as that
@@ -7713,6 +7791,9 @@
}else if( strcmp(zName,"offsets")==0 ){
*pxFunc = snippetOffsetsFunc;
return 1;
+ }else if( strcmp(zName,"rank")==0 ){
+ *pxFunc = rankFunc;
+ return 1;
}else if( strcmp(zName,"optimize")==0 ){
*pxFunc = optimizeFunc;
return 1;
@@ -7797,6 +7878,7 @@
** module with sqlite.
*/
if( SQLITE_OK==rc
+ && SQLITE_OK==(rc = sqlite3_overload_function(db, "rank", -1))
&& SQLITE_OK==(rc = sqlite3_overload_function(db, "snippet", -1))
&& SQLITE_OK==(rc = sqlite3_overload_function(db, "offsets", -1))
&& SQLITE_OK==(rc = sqlite3_overload_function(db, "optimize", -1))
Modified: trunk/utils/tracker-fts/tracker-fts-test.c
==============================================================================
--- trunk/utils/tracker-fts/tracker-fts-test.c (original)
+++ trunk/utils/tracker-fts/tracker-fts-test.c Mon Oct 20 08:20:55 2008
@@ -76,7 +76,7 @@
g_printerr ("EG: %s stew\n", argv[0]);
return EXIT_FAILURE;
}
-
+ g_unlink ("/tmp/test.db");
db_exists = g_file_test ("/tmp/test.db", G_FILE_TEST_EXISTS);
rc = sqlite3_open ("/tmp/test.db", &db);
@@ -96,15 +96,16 @@
if (!db_exists) {
exec_sql (db, "create virtual table recipe using trackerfts (cat, name, ingredients)");
- exec_sql (db, "insert into recipe (cat, name, ingredients) values (3, 'broccoli stew', 'broccoli,peppers,cheese and tomatoes')");
- exec_sql (db, "insert into recipe (cat, name, ingredients) values (4, 'pumpkin stew', 'pumpkin,onions,garlic and celery')");
- exec_sql (db, "insert into recipe (cat, name, ingredients) values (2, 'broccoli pie', 'broccoli,cheese,onions and flour.')");
- exec_sql (db, "insert into recipe (cat, name, ingredients) values (7, 'pumpkin pie', 'pumpkin,sugar,flour and butter.')");
+ exec_sql (db, "insert into recipe (cat, name, ingredients) values (3, 'broccoli stew stew stew', 'broccoli,peppers,cheese and tomatoes')");
+ exec_sql (db, "insert into recipe (cat, name, ingredients) values (4, 'pumpkin stew stew stew', 'pumpkin,onions,garlic and celery')");
+ exec_sql (db, "insert into recipe (cat, name, ingredients) values (2, 'broccoli pie stew', 'broccoli,cheese,onions and flour.')");
+ exec_sql (db, "insert into recipe (cat, name, ingredients) values (7, 'stew pumpkin pie stew', 'pumpkin,sugar,flour and butter.')");
+ exec_sql (db, "insert into recipe (cat, name, ingredients) values (6, 'stew pumpkin pie stew', 'pumpkin,sugar,flour and butter.')");
}
// sql = g_strdup_printf ("select cat, count (*) from recipe where recipe match '%s' group by Cat", argv[1]);
// exec_sql (db, sql);
// g_free (sql);
- sql = g_strdup_printf ("select rowid, cat, name, ingredients, offsets(recipe) from recipe where recipe match '%s' and Cat<8", argv[1]);
+ sql = g_strdup_printf ("select rowid, cat, name, ingredients, offsets(recipe), rank(recipe) from recipe where recipe match '%s' and Cat<8", argv[1]);
exec_sql (db, sql);
g_free (sql);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]