summaryrefslogtreecommitdiffstats
path: root/src/storage
diff options
context:
space:
mode:
authorPeng Wu <alexepico@gmail.com>2016-05-19 14:49:28 +0800
committerPeng Wu <alexepico@gmail.com>2016-05-19 14:49:28 +0800
commite3fd3425a8402752f8b3bbef8bf1784e970a8712 (patch)
tree055ce071bbecee500617b8430341601c376d3c47 /src/storage
parent0768d5ca04b4a3b79abf050b8d07709902517139 (diff)
downloadlibpinyin-e3fd3425a8402752f8b3bbef8bf1784e970a8712.tar.gz
libpinyin-e3fd3425a8402752f8b3bbef8bf1784e970a8712.tar.xz
libpinyin-e3fd3425a8402752f8b3bbef8bf1784e970a8712.zip
write search_matrix function
Diffstat (limited to 'src/storage')
-rw-r--r--src/storage/phonetic_key_matrix.cpp85
-rw-r--r--src/storage/phonetic_key_matrix.h5
2 files changed, 90 insertions, 0 deletions
diff --git a/src/storage/phonetic_key_matrix.cpp b/src/storage/phonetic_key_matrix.cpp
index 6f92e45..150ba5d 100644
--- a/src/storage/phonetic_key_matrix.cpp
+++ b/src/storage/phonetic_key_matrix.cpp
@@ -194,4 +194,89 @@ bool dump_phonetic_key_matrix(PhoneticKeyMatrix * matrix) {
return true;
}
+int search_matrix_recur(GArray * cached_keys,
+ FacadeChewingTable2 * table,
+ PhoneticKeyMatrix * matrix,
+ size_t start, size_t end,
+ PhraseIndexRanges ranges,
+ size_t & longest) {
+ if (start > end)
+ return SEARCH_NONE;
+
+ /* only do chewing table search with 'start' and 'end'. */
+ if (start == end) {
+ /* exceed the maximum phrase length. */
+ if (cached_keys->len > MAX_PHRASE_LENGTH)
+ return SEARCH_NONE;
+
+ return table->search(cached_keys->len,
+ (ChewingKey *)cached_keys->data, ranges);
+ }
+
+ int result = SEARCH_NONE;
+ GArray * keys = g_array_new(TRUE, TRUE, sizeof(ChewingKey));
+ GArray * key_rests = g_array_new(TRUE, TRUE, sizeof(ChewingKeyRest));
+
+ matrix->get_items(start, keys, key_rests);
+ assert(keys->len == key_rests->len);
+ /* assume pinyin parsers will filter invalid keys. */
+ assert(0 != keys->len);
+
+ for (size_t i = 0; i < keys->len; ++i) {
+ const ChewingKey key = g_array_index(keys, ChewingKey, i);
+ const ChewingKeyRest key_rest = g_array_index(key_rests,
+ ChewingKeyRest, i);
+
+ /* push value */
+ g_array_append_val(cached_keys, key);
+ size_t newstart = key_rest.m_raw_end;
+ longest = std_lite::max(longest, newstart);
+
+ result |= search_matrix_recur(cached_keys, table, matrix,
+ newstart, end, ranges, longest);
+
+ /* pop value */
+ g_array_set_size(cached_keys, cached_keys->len - 1);
+ }
+
+ g_array_free(keys, TRUE);
+ g_array_free(key_rests, TRUE);
+ return true;
+}
+
+int search_matrix(FacadeChewingTable2 * table,
+ PhoneticKeyMatrix * matrix,
+ size_t start, size_t end,
+ PhraseIndexRanges ranges) {
+ assert(end < matrix->size());
+
+ GArray * keys = g_array_new(TRUE, TRUE, sizeof(ChewingKey));
+ GArray * key_rests = g_array_new(TRUE, TRUE, sizeof(ChewingKeyRest));
+
+ matrix->get_items(start, keys, key_rests);
+ assert(keys->len == key_rests->len);
+ const size_t len = keys->len;
+
+ g_array_free(keys, TRUE);
+ g_array_free(key_rests, TRUE);
+
+ /* for empty column simply return SEARCH_CONTINUED. */
+ if (0 == len)
+ return SEARCH_CONTINUED;
+
+ GArray * cached_keys = g_array_new(TRUE, TRUE, sizeof(ChewingKey));
+
+ size_t longest = 0;
+ int result = search_matrix_recur(cached_keys, table, matrix,
+ start, end, ranges, longest);
+
+ /* if any recur search return SEARCH_CONTINUED or longest > end,
+ then return SEARCH_CONTINUED. */
+ if (longest > end)
+ result |= SEARCH_CONTINUED;
+
+ g_array_free(cached_keys, TRUE);
+ return result;
+}
+
};
diff --git a/src/storage/phonetic_key_matrix.h b/src/storage/phonetic_key_matrix.h
index 9e1e1d6..328cee2 100644
--- a/src/storage/phonetic_key_matrix.h
+++ b/src/storage/phonetic_key_matrix.h
@@ -25,6 +25,7 @@
#include <assert.h>
#include "novel_types.h"
#include "chewing_key.h"
+#include "facade_chewing_table2.h"
namespace pinyin {
@@ -171,6 +172,10 @@ bool fuzzy_syllable_step(pinyin_option_t options,
bool dump_phonetic_key_matrix(PhoneticKeyMatrix * matrix);
+int search_matrix(FacadeChewingTable2 * table,
+ PhoneticKeyMatrix * matrix,
+ size_t start, size_t end,
+ PhraseIndexRanges ranges);
};
#endif