diff options
author | Taesu Lee <taesu82.lee@samsung.com> | 2019-05-29 14:09:11 +0900 |
---|---|---|
committer | Hui Yu <huiyu@google.com> | 2019-07-18 17:14:50 -0700 |
commit | 33fdf2ebeaa9f26948a54d0f733719c91e907491 (patch) | |
tree | 4a606738c1197e4125534bac5ebe4e37db3b05dc /android | |
parent | 47092a72a0d07b76e6d592d71bfee993264fa42d (diff) |
Support loose comparison using minimum matched chars
Specific min match is required for each country.
Test: Manual
Change-Id: I2f1355c4ba712170464e4c23a916024e0bf58e71
Merged-In: I2f1355c4ba712170464e4c23a916024e0bf58e71
Signed-off-by: Taesu Lee <taesu82.lee@samsung.com>
Bug:134246556
Diffstat (limited to 'android')
-rw-r--r-- | android/OldPhoneNumberUtils.cpp | 15 | ||||
-rw-r--r-- | android/PhoneNumberUtils.h | 1 | ||||
-rw-r--r-- | android/sqlite3_android.cpp | 24 |
3 files changed, 30 insertions, 10 deletions
diff --git a/android/OldPhoneNumberUtils.cpp b/android/OldPhoneNumberUtils.cpp index 9846a1c..3a69e0c 100644 --- a/android/OldPhoneNumberUtils.cpp +++ b/android/OldPhoneNumberUtils.cpp @@ -159,13 +159,13 @@ static bool matchIntlPrefixAndCC(const char* a, int len) * enough for caller ID purposes. * * - Compares from right to left - * - requires MIN_MATCH (7) characters to match + * - requires minimum characters to match * - handles common trunk prefixes and international prefixes * (basically, everything except the Russian trunk prefix) * * Tolerates nulls */ -bool phone_number_compare_loose(const char* a, const char* b) +bool phone_number_compare_loose_with_minmatch(const char* a, const char* b, int min_match) { int ia, ib; int matched; @@ -216,11 +216,11 @@ bool phone_number_compare_loose(const char* a, const char* b) } } - if (matched < MIN_MATCH) { + if (matched < min_match) { const int effectiveALen = strlen(a) - numSeparatorCharsInA; const int effectiveBLen = strlen(b) - numSeparatorCharsInB; - // if the number of dialable chars in a and b match, but the matched chars < MIN_MATCH, + // if the number of dialable chars in a and b match, but the matched chars < min_match, // treat them as equal (i.e. 404-04 and 40404) if (effectiveALen == effectiveBLen && effectiveALen == matched) { return true; @@ -230,7 +230,7 @@ bool phone_number_compare_loose(const char* a, const char* b) } // At least one string has matched completely; - if (matched >= MIN_MATCH && (ia < 0 || ib < 0)) { + if (matched >= min_match && (ia < 0 || ib < 0)) { return true; } @@ -274,4 +274,9 @@ bool phone_number_compare_loose(const char* a, const char* b) return false; } +bool phone_number_compare_loose(const char* a, const char* b) +{ + return phone_number_compare_loose_with_minmatch(a, b, MIN_MATCH); +} + } // namespace android diff --git a/android/PhoneNumberUtils.h b/android/PhoneNumberUtils.h index 58b9ab8..80776bb 100644 --- a/android/PhoneNumberUtils.h +++ b/android/PhoneNumberUtils.h @@ -21,6 +21,7 @@ namespace android { bool phone_number_compare_loose(const char* a, const char* b); +bool phone_number_compare_loose_with_minmatch(const char* a, const char* b, int min_match); bool phone_number_compare_strict(const char* a, const char* b); bool phone_number_stripped_reversed_inter(const char* in, char* out, const int len, int *outlen); diff --git a/android/sqlite3_android.cpp b/android/sqlite3_android.cpp index 659ee6c..d2f1802 100644 --- a/android/sqlite3_android.cpp +++ b/android/sqlite3_android.cpp @@ -79,7 +79,7 @@ static int collate8(void *p, int n1, const void *v1, int n2, const void *v2) static void phone_numbers_equal(sqlite3_context * context, int argc, sqlite3_value ** argv) { - if (argc != 2 && argc != 3) { + if (argc != 2 && argc != 3 && argc != 4) { sqlite3_result_int(context, 0); return; } @@ -88,8 +88,12 @@ static void phone_numbers_equal(sqlite3_context * context, int argc, sqlite3_val char const * num2 = (char const *)sqlite3_value_text(argv[1]); bool use_strict = false; - if (argc == 3) { + int min_match = 0; + if (argc == 3 || argc == 4) { use_strict = (sqlite3_value_int(argv[2]) != 0); + if (!use_strict && argc == 4) { + min_match = sqlite3_value_int(argv[3]); + } } if (num1 == NULL || num2 == NULL) { @@ -98,9 +102,11 @@ static void phone_numbers_equal(sqlite3_context * context, int argc, sqlite3_val } bool equal = - (use_strict ? - android::phone_number_compare_strict(num1, num2) : - android::phone_number_compare_loose(num1, num2)); + (use_strict ? android::phone_number_compare_strict(num1, num2) + : ((min_match > 0) + ? android::phone_number_compare_loose_with_minmatch( + num1, num2, min_match) + : android::phone_number_compare_loose(num1, num2))); if (equal) { sqlite3_result_int(context, 1); @@ -543,6 +549,14 @@ extern "C" int register_android_functions(sqlite3 * handle, int utf16Storage __a return err; } + // Register the PHONE_NUM_EQUALS function with additional arguments "use_strict" and "min_match" + err = sqlite3_create_function( + handle, "PHONE_NUMBERS_EQUAL", 4, + SQLITE_UTF8, NULL, phone_numbers_equal, NULL, NULL); + if (err != SQLITE_OK) { + return err; + } + // Register the _DELETE_FILE function err = sqlite3_create_function(handle, "_DELETE_FILE", 1, SQLITE_UTF8, NULL, delete_file, NULL, NULL); if (err != SQLITE_OK) { |