[tarantool-patches] [PATCH v2 2/5] lib: introduce is_weak_cmp flag for json_path_cmp
Konstantin Osipov
kostja.osipov at gmail.com
Tue Mar 19 18:47:31 MSK 2019
* Kirill Shcherbatov <kshcherbatov at tarantool.org> [19/03/19 16:15]:
> Introduced is_weak_cmp flag for json_path_cmp routine: when this
> flag is set, strings are equal when whole b path is an a subpath
> (in terms of tokens).
Could you please provide an example in the changeset comment and
function comment?
Why did you choose "weak" as a description of this type of
comparison? Perhaps "is_prefix"? cmp is symmetrical, is the new
function symmetrical?
> * Compare two JSON paths using Lexer class.
> * - in case of paths that have same token-sequence prefix,
> * the path having more tokens is assumed to be greater
> + * (except the case when is_weak_cmp flag is set).
> * - both paths must be valid
> * (may be tested with json_path_validate).
> + *
> + * When is_weak_cmp flag is set, strings are assumed to be equal
> + * when all b path tokens are present in a path.
> */
Please add an example.
> int
Are you sure you want a flag an existing function and not an
entirely separate one?
> json_path_cmp(const char *a, int a_len, const char *b, int b_len,
> - int index_base);
> + bool is_weak_cmp, int index_base);
>
> /**
> * Check if the passed JSON path is valid.
> diff --git a/test/unit/json.c b/test/unit/json.c
> index 1db7e9364..10704451b 100644
> --- a/test/unit/json.c
> +++ b/test/unit/json.c
> @@ -479,12 +479,12 @@ test_path_cmp()
> {"Data[1][\"Info\"].fname[1]", -1},
> };
> header();
> - plan(lengthof(rc) + 6);
> + plan(lengthof(rc) + 8);
> for (size_t i = 0; i < lengthof(rc); ++i) {
> const char *path = rc[i].path;
> int errpos = rc[i].errpos;
> int rc = json_path_cmp(a, a_len, path, strlen(path),
> - INDEX_BASE);
> + false, INDEX_BASE);
> if (rc > 0) rc = 1;
> if (rc < 0) rc = -1;
> is(rc, errpos, "path cmp result \"%s\" with \"%s\": "
> @@ -493,7 +493,7 @@ test_path_cmp()
> char *multikey_a = "Data[*][\"FIO\"].fname[*]";
> char *multikey_b = "[\"Data\"][*].FIO[\"fname\"][*]";
> int ret = json_path_cmp(multikey_a, strlen(multikey_a), multikey_b,
> - strlen(multikey_b), INDEX_BASE);
> + strlen(multikey_b), false, INDEX_BASE);
> is(ret, 0, "path cmp result \"%s\" with \"%s\": have %d, expected %d",
> multikey_a, multikey_b, ret, 0);
>
> @@ -510,6 +510,13 @@ test_path_cmp()
> "test json_path_is_multikey: multikey path");
> is(ret, 8, "test json_path_is_multikey: multikey path %d/%d", ret, 8);
>
> + is(json_path_cmp(a, a_len, multikey_b, ret, false, INDEX_BASE) == 0, false,
> + "test json_path_cmp with is_weak_cmp = false: compare %s and %.*s",
> + a, ret, multikey_b);
> + is(json_path_cmp(a, a_len, multikey_b, ret, true, INDEX_BASE) == 0, true,
> + "test json_path_cmp with is_weak_cmp = true: compare %s and %.*s",
> + a, ret, multikey_b);
The tests are vastly insufficient. Left empty path, two
empty paths, right empty paths, the subpath is in the middle,
front or tail, a path with wildcards, two paths with wildcards,
multiple wildcards.
--
Konstantin Osipov, Moscow, Russia, +7 903 626 22 32
http://tarantool.io - www.twitter.com/kostja_osipov
More information about the Tarantool-patches
mailing list