[tritonn-commit] [svn] [12] added full implementation for snippet native sql function.

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2007年 8月 31日 (金) 22:55:07 JST


Revision: 12
          http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=tritonn&view=rev&rev=12
Author:   mir
Date:     2007-08-31 22:55:07 +0900 (Fri, 31 Aug 2007)

Log Message:
-----------
added full implementation for snippet native sql function.
added test codes for snippet native sql function.

Modified Paths:
--------------
    mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/r/senna_snippet.result
    mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/t/senna_snippet.test
    mysql-5.0.45-tritonn-1.0.5/sql/item_strfunc.cc

Modified: mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/r/senna_snippet.result
===================================================================
--- mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/r/senna_snippet.result	2007-08-30 04:15:06 UTC (rev 11)
+++ mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/r/senna_snippet.result	2007-08-31 13:55:07 UTC (rev 12)
@@ -11,7 +11,7 @@
 今日は<span class='word'>東京</span> &gt;&gt;&gt; 明日は
 SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 45, 1, 0, "... "," ...", "東京", "<span class='word'>", "</span>");
 SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 45, 1, 0, "... "," ...", "東京", "<span class='word'>", "</span>")
-... 今日は<span class='word'>東京</span> >>> 明日は埼玉 ...
+... 今日は<span class='word'>東京</span> >>> 明日は埼玉に行き ...
 CREATE TABLE t1 (c1 CHAR(100)) DEFAULT CHARSET utf8;
 INSERT INTO t1 VALUES("今日は東京 >>> 明日は埼玉に行きます。");
 SELECT SNIPPET(c1, 30, 1, 0, "","", "東京", "<span class='word'>", "</span>") FROM t1;
@@ -25,7 +25,7 @@
 今日は<span class='word'>東京</span> &gt;&gt;&gt; 明日は
 SELECT SNIPPET(c1, 45, 1, 0, "... "," ...", "東京", "<span class='word'>", "</span>") FROM t1;
 SNIPPET(c1, 45, 1, 0, "... "," ...", "東京", "<span class='word'>", "</span>")
-... 今日は<span class='word'>東京</span> >>> 明日は埼玉 ...
+... 今日は<span class='word'>東京</span> >>> 明日は埼玉に行き ...
 DROP TABLE t1;
 CREATE TABLE t1 (c1 VARCHAR(100)) DEFAULT CHARSET utf8;
 INSERT INTO t1 VALUES("今日は東京 >>> 明日は埼玉に行きます。");
@@ -40,7 +40,7 @@
 今日は<span class='word'>東京</span> &gt;&gt;&gt; 明日は
 SELECT SNIPPET(c1, 45, 1, 0, "... "," ...", "東京", "<span class='word'>", "</span>") FROM t1;
 SNIPPET(c1, 45, 1, 0, "... "," ...", "東京", "<span class='word'>", "</span>")
-... 今日は<span class='word'>東京</span> >>> 明日は埼玉 ...
+... 今日は<span class='word'>東京</span> >>> 明日は埼玉に行き ...
 DROP TABLE t1;
 CREATE TABLE t1 (c1 TEXT) DEFAULT CHARSET utf8;
 INSERT INTO t1 VALUES("今日は東京 >>> 明日は埼玉に行きます。");
@@ -55,7 +55,7 @@
 今日は<span class='word'>東京</span> &gt;&gt;&gt; 明日は
 SELECT SNIPPET(c1, 45, 1, 0, "... "," ...", "東京", "<span class='word'>", "</span>") FROM t1;
 SNIPPET(c1, 45, 1, 0, "... "," ...", "東京", "<span class='word'>", "</span>")
-... 今日は<span class='word'>東京</span> >>> 明日は埼玉 ...
+... 今日は<span class='word'>東京</span> >>> 明日は埼玉に行き ...
 DROP TABLE t1;
 CREATE TABLE t1 (c1 TEXT) DEFAULT CHARSET utf8;
 INSERT INTO t1 VALUES("今日は東京 >>> 明日は埼玉に行きます。");
@@ -65,3 +65,48 @@
 SNIPPET(c1, 30, 1, 0, "","", ?, "<span class='word'>", "</span>")
 今日は<span class='word'>東京</span> >>> 明日は
 DROP TABLE t1;
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word'>", "</span>"),
+SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word'>", "</span>");
+SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word'>", "</span>")	SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word'>", "</span>")
+今日は<span class='word'>東京</span> >>> 明日は	今日は<span class='word'>東京</span> >>> 明日は
+SELECT SNIPPET(SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word'>", "</span>"),
+30, 1, 0, "","", "東京", "<span class='word'>", "</span>");
+SNIPPET(SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word'>", "</span>"),
+30, 1, 0, "","", "東京", "<span class='word'>", "</span>")
+lass='word'><span class='word'>東京</span></span> >>> 
+SELECT SNIPPET(null, 30, 1, 0, "","", "東京", "<span class='word'>", "</span>");
+SNIPPET(null, 30, 1, 0, "","", "東京", "<span class='word'>", "</span>")
+NULL
+SELECT SNIPPET(null, null, null, null, null, null, null, null, null);
+SNIPPET(null, null, null, null, null, null, null, null, null)
+NULL
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word'>");
+SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word'>")
+
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word'>", "</span>", "");
+SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word'>", "</span>", "")
+
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word1'>", "</span>", "埼玉", "<span class='word2'>");
+SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word1'>", "</span>", "埼玉", "<span class='word2'>")
+
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word1'>", "</span>", "埼玉", "<span class='word2'>", "</span>", "");
+SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word1'>", "</span>", "埼玉", "<span class='word2'>", "</span>", "")
+
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 0, 1, 0, "","", "東京", "<span class='word'>", "</span>", "");
+SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 0, 1, 0, "","", "東京", "<span class='word'>", "</span>", "")
+
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", -10, 1, 0, "","", "東京", "<span class='word'>", "</span>", "");
+SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", -10, 1, 0, "","", "東京", "<span class='word'>", "</span>", "")
+
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 0, 0, "","", "東京", "<span class='word'>", "</span>", "");
+SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 0, 0, "","", "東京", "<span class='word'>", "</span>", "")
+
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, -10, 0, "","", "東京", "<span class='word'>", "</span>", "");
+SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, -10, 0, "","", "東京", "<span class='word'>", "</span>", "")
+
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 10, "","", "東京", "<span class='word'>", "</span>", "");
+SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 10, "","", "東京", "<span class='word'>", "</span>", "")
+
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, -30, "","", "東京", "<span class='word'>", "</span>", "");
+SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, -30, "","", "東京", "<span class='word'>", "</span>", "")
+

Modified: mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/t/senna_snippet.test
===================================================================
--- mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/t/senna_snippet.test	2007-08-30 04:15:06 UTC (rev 11)
+++ mysql-5.0.45-tritonn-1.0.5/mysql-test/suite/senna/t/senna_snippet.test	2007-08-31 13:55:07 UTC (rev 12)
@@ -45,3 +45,31 @@
 SET @a = "東京";
 EXECUTE pstmt USING @a;
 DROP TABLE t1;
+
+# twice in one query
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word'>", "</span>"),
+SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word'>", "</span>");
+
+# nested
+SELECT SNIPPET(SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word'>", "</span>"),
+30, 1, 0, "","", "東京", "<span class='word'>", "</span>");
+
+# null
+SELECT SNIPPET(null, 30, 1, 0, "","", "東京", "<span class='word'>", "</span>");
+SELECT SNIPPET(null, null, null, null, null, null, null, null, null);
+
+# invalid number of arguments
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word'>");
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word'>", "</span>", "");
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word1'>", "</span>", "埼玉", "<span class='word2'>");
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 0, "","", "東京", "<span class='word1'>", "</span>", "埼玉", "<span class='word2'>", "</span>", "");
+
+# invalid value of arguments
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 0, 1, 0, "","", "東京", "<span class='word'>", "</span>", "");
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", -10, 1, 0, "","", "東京", "<span class='word'>", "</span>", "");
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 0, 0, "","", "東京", "<span class='word'>", "</span>", "");
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, -10, 0, "","", "東京", "<span class='word'>", "</span>", "");
+
+# this is acceptable
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, 10, "","", "東京", "<span class='word'>", "</span>", "");
+SELECT SNIPPET("今日は東京 >>> 明日は埼玉に行きます。", 30, 1, -30, "","", "東京", "<span class='word'>", "</span>", "");

Modified: mysql-5.0.45-tritonn-1.0.5/sql/item_strfunc.cc
===================================================================
--- mysql-5.0.45-tritonn-1.0.5/sql/item_strfunc.cc	2007-08-30 04:15:06 UTC (rev 11)
+++ mysql-5.0.45-tritonn-1.0.5/sql/item_strfunc.cc	2007-08-31 13:55:07 UTC (rev 12)
@@ -3402,11 +3402,10 @@
 
 String *Item_func_senna_snippet::val_str(String *str)
 {
-  /* for arguments */
   String *target, target_tmp;
-  uint max_snip_len;
-  uint max_snips;
-  bool html_encoding;
+  int max_snip_len;
+  int max_snips;
+  int html_encoding;
   String *start, start_tmp;
   String *end, end_tmp;
   String *keyword, keyword_tmp;
@@ -3418,60 +3417,141 @@
   sen_rc rc;
   uint nresults;
   uint max_tagged_len;
-  uint real_snip_len;
-  sen_snip_mapping *map;
+  sen_snip_mapping *mapping;
 
   char *result;
   uint result_len;
   int i;
 
-  /* checking arguments */
-  if (arg_count < 9) goto err;
-  if (arg_count % 3 != 0) goto err;
+  if (str == NULL) {
+    SEN_LOG(sen_log_warning, "Item_func_senna_snipet::val_str(null) is called");
+    goto err_null;
+  }
 
+  if (arg_count < 9 || arg_count % 3 != 0) {
+    SEN_LOG(sen_log_warning, "Incorrect number of arguments for snippet: %d", arg_count);
+    return &my_empty_string;
+  }
+
+  for (i = 0; i < arg_count; i++) {
+    SEN_LOG(sen_log_warning, "snippet argument #%d is null", i+1);
+    if (args[i]->null_value) goto err_null;
+  }
+
   target        = args[0]->str_result(&target_tmp);
-  max_snip_len  = args[1]->val_uint();
-  max_snips     = args[2]->val_uint();
-  html_encoding = args[3]->val_bool();
+  max_snip_len  = args[1]->val_int();
+  max_snips     = args[2]->val_int();
+  html_encoding = args[3]->val_int();
   start         = args[4]->str_result(&start_tmp);
   end           = args[5]->str_result(&end_tmp);
 
+  if (max_snip_len <= 0) {
+    SEN_LOG(sen_log_warning, "snippet argument #2 must be positive value, passed %d", max_snip_len);
+    return &my_empty_string;
+  }
 
+  if (max_snips <= 0) {
+    SEN_LOG(sen_log_warning, "snippet argument #3 must be positive value, passed %d", max_snips);
+    return &my_empty_string;
+  }
+
   encoding = senna_enc_type(target->charset()->csname);
-  real_snip_len = max_snip_len - start->length() - end->length();
-  if (real_snip_len <= 0) goto err;
   if (html_encoding == 1) {
-    map = (sen_snip_mapping *) -1;
+    mapping = (sen_snip_mapping *) -1;
   } else {
-    map = NULL;
+    mapping = NULL;
   }
 
-  if (!(snip = sen_snip_open(encoding, SEN_SNIP_NORMALIZE, real_snip_len, 
-			    max_snips, "", 0, "", 0, map))) goto err;
+  SEN_LOG(sen_log_debug, "Item_func_senna_snippet::val_str => sen_snip_open: " \
+	  "%d, SEN_SNIP_NORMALIZE, %d, %d, \"\", 0, \"\", 0, %p",
+	  encoding, max_snip_len, max_snips, mapping);
+  if (!(snip = sen_snip_open(encoding, SEN_SNIP_NORMALIZE,
+			     max_snip_len, max_snips, "", 0,
+			     "", 0, mapping))) {
+    SEN_LOG(sen_log_error, "sen_snip_open failed: snip = %p", snip);
+    return &my_empty_string;
+  }
 
   for (i = 6; i < arg_count; i+=3) {
     keyword       = args[i]->str_result(&keyword_tmp);
     open_tag      = args[i+1]->str_result(&open_tmp);
     close_tag     = args[i+2]->str_result(&close_tmp);
+
+    SEN_LOG(sen_log_debug, "Item_func_senna_snippet::val_str => sen_snip_add_cond: " \
+	    "%p, %p, %d, %p, %d, %p, %d", snip, keyword->ptr(), keyword->length(),
+	    open_tag->ptr(), open_tag->length(), close_tag->ptr(), close_tag->length());
     if ((rc = sen_snip_add_cond(snip, keyword->ptr(), keyword->length(),
 				open_tag->ptr(), open_tag->length(),
-				close_tag->ptr(), close_tag->length()))) goto err;
+				close_tag->ptr(), close_tag->length()))) {
+      SEN_LOG(sen_log_error, "sen_snip_add_cond failed: sen_rc= %d", rc);
+      SEN_LOG(sen_log_debug, "Item_func_senna_snippet::val_str => sen_snip_close: " \
+	      "snip = %p", snip);
+      if ((rc = sen_snip_close(snip))) {
+	SEN_LOG(sen_log_error, "sen_snip_close failed: sen_rc = %d", rc);
+      }
+      return &my_empty_string;
+    }
   }
 
+  SEN_LOG(sen_log_debug, "Item_func_senna_snippet::val_str => sen_snip_exec: " \
+	  "%p, %p, %d, %p, %p", snip, target->ptr(), target->length(),
+	  &nresults, &max_tagged_len);
   if ((rc = sen_snip_exec(snip, target->ptr(), target->length(),
-			  &nresults, &max_tagged_len))) goto err;
-  
-  result = sql_alloc(max_tagged_len);
-  sen_snip_get_result(snip, 0, result, &result_len);
+			  &nresults, &max_tagged_len))) {
+    SEN_LOG(sen_log_error, "sen_snip_exec failed: sen_rc= %d", rc);
+    SEN_LOG(sen_log_debug, "Item_func_senna_snippet::val_str => sen_snip_close: " \
+	    "snip = %p", snip);
+    if ((rc = sen_snip_close(snip))) {
+      SEN_LOG(sen_log_error, "sen_snip_close failed: sen_rc = %d", rc);
+    }
+    return &my_empty_string;
+  }
 
+  if (!(result = sql_alloc(max_tagged_len))) {
+    SEN_LOG(sen_log_error, "sql_alloc failed", rc);
+    SEN_LOG(sen_log_debug, "Item_func_senna_snippet::val_str => sen_snip_close: " \
+            "snip = %p\n", snip);
+    if ((rc = sen_snip_close(snip))) {
+      SEN_LOG(sen_log_error, "sen_snip_close failed: sen_rc = %d\n", rc);
+    }
+    return &my_empty_string;
+  }
+
+  SEN_LOG(sen_log_debug, "Item_func_senna_snippet::val_str => sen_snip_get_result: " \
+	  "%p, 0, %p, %p", snip, result, &result_len);
+  if ((rc = sen_snip_get_result(snip, 0, result, &result_len))) {
+    SEN_LOG(sen_log_error, "sen_snip_get_result failed: sen_rc= %d", rc);
+    SEN_LOG(sen_log_debug, "Item_func_senna_snippet::val_str => sen_snip_close: " \
+	    "snip = %p", snip);
+    if ((rc = sen_snip_close(snip))) {
+      SEN_LOG(sen_log_error, "sen_snip_close failed: sen_rc = %d", rc);
+    }
+    return &my_empty_string;
+  }
+
+  if (result_len <= 0) {
+    SEN_LOG(sen_log_error, "result_len is not positive value: %d", result_len);
+    SEN_LOG(sen_log_debug, "Item_func_senna_snippet::val_str => sen_snip_close: " \
+            "snip = %p", snip);
+    if ((rc = sen_snip_close(snip))) {
+      SEN_LOG(sen_log_error, "sen_snip_close failed: sen_rc = %d", rc);
+    }
+    return &my_empty_string;
+  }
+
   str->copy(start->ptr(), start->length(), target->charset());
   str->append(result, result_len, target->charset());
   str->append(end->ptr(), end->length(), target->charset());
 
+  SEN_LOG(sen_log_debug, "Item_func_senna_snippet::val_str => sen_snip_close: " \
+	  "snip = %p", snip);
+  if ((rc = sen_snip_close(snip))) {
+    SEN_LOG(sen_log_error, "sen_snip_close failed: sen_rc = %d", rc);
+  }
+
   return str;
 
-err:
-  push_warning(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,ER_WRONG_ARGUMENTS,ER(ER_WRONG_ARGUMENTS));
+err_null:
   null_value= 1;
   return 0;
 }




Tritonn-commit メーリングリストの案内
Back to archive index