From fad30bf53643f08aaf2658d2c8dcab967853ae33 Mon Sep 17 00:00:00 2001 From: amory Date: Thu, 30 May 2024 10:52:20 +0800 Subject: [PATCH] [cases](array_contains)add cases for array_contains supporting inverted index and fix stopwords as query string (#35299) ## Proposed changes Issue Number: close #xxx ## Further comments If this is a relatively large or complex change, kick off the discussion at [dev@doris.apache.org](mailto:dev@doris.apache.org) by explaining why you chose the solution you did and what alternatives you considered, etc... --- .../functions/array/function_array_index.h | 23 +- .../array_contains/documents-1000.json | 1000 +++++++++++ .../array_contains/test_char_replace_arr.out | 100 ++ .../array_contains/test_compound_arr.out | 7 + .../test_count_on_index_httplogs_arr.out | 46 + .../test_equal_on_fulltext_arr.out | 6 + .../test_index_bkd_null_arr.out | 5 + .../test_index_change_2_arr.out | 37 + .../test_index_change_4_arr.out | 31 + .../test_index_change_6_arr.out | 31 + .../test_index_compaction_dup_keys_arr.out | 105 ++ .../test_index_compaction_null_arr.out | 1531 +++++++++++++++++ .../test_index_compaction_unique_keys_arr.out | 69 + ...mpaction_with_multi_index_segments_arr.out | 219 +++ .../array_contains/test_index_delete_arr.out | 16 + .../test_index_empty_string_arr.out | 7 + .../test_index_equal_select_arr.out | 245 +++ .../test_index_match_phrase_edge_arr.out | 21 + .../test_index_match_regexp_arr.out | 19 + .../array_contains/test_index_null_arr.out | 11 + .../array_contains/test_invalid_param.out | 115 ++ .../test_inverted_index_null_arr.out | 130 ++ .../array_contains/test_lowercase_arr.out | 136 ++ .../test_parser_with_none_stopwords.out | 115 ++ .../test_add_drop_index_with_data_arr.groovy | 338 ++++ ...add_drop_index_with_delete_data_arr.groovy | 273 +++ .../test_char_replace_arr.groovy | 103 ++ .../array_contains/test_compound_arr.groovy | 69 + .../test_count_on_index_httplogs_arr.groovy | 204 +++ .../test_equal_on_fulltext_arr.groovy | 52 + .../test_index_bkd_null_arr.groovy | 52 + .../test_index_change_2_arr.groovy | 144 ++ .../test_index_change_4_arr.groovy | 145 ++ .../test_index_change_6_arr.groovy | 149 ++ .../test_index_compaction_dup_keys_arr.groovy | 250 +++ .../test_index_compaction_null_arr.groovy | 329 ++++ ...st_index_compaction_unique_keys_arr.groovy | 255 +++ ...ction_with_multi_index_segments_arr.groovy | 410 +++++ .../test_index_delete_arr.groovy | 80 + .../test_index_empty_string_arr.groovy | 59 + .../test_index_equal_select_arr.groovy | 247 +++ .../test_index_match_phrase_edge_arr.groovy | 76 + .../test_index_match_regexp_arr.groovy | 100 ++ .../array_contains/test_index_null_arr.groovy | 56 + .../array_contains/test_invalid_param.groovy | 118 ++ .../test_inverted_index_null_arr.groovy | 100 ++ .../array_contains/test_lowercase_arr.groovy | 249 +++ .../test_parser_with_none_stopwords.groovy | 118 ++ 48 files changed, 7999 insertions(+), 2 deletions(-) create mode 100644 regression-test/data/inverted_index_p0/array_contains/documents-1000.json create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_char_replace_arr.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_compound_arr.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_count_on_index_httplogs_arr.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_equal_on_fulltext_arr.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_index_bkd_null_arr.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_index_change_2_arr.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_index_change_4_arr.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_index_change_6_arr.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_index_compaction_dup_keys_arr.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_index_compaction_null_arr.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_index_compaction_unique_keys_arr.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_index_compaction_with_multi_index_segments_arr.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_index_delete_arr.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_index_empty_string_arr.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_index_equal_select_arr.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_index_match_phrase_edge_arr.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_index_match_regexp_arr.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_index_null_arr.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_invalid_param.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_inverted_index_null_arr.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_lowercase_arr.out create mode 100644 regression-test/data/inverted_index_p0/array_contains/test_parser_with_none_stopwords.out create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_add_drop_index_with_data_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_add_drop_index_with_delete_data_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_char_replace_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_compound_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_count_on_index_httplogs_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_equal_on_fulltext_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_index_bkd_null_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_index_change_2_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_index_change_4_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_index_change_6_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_index_compaction_dup_keys_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_index_compaction_null_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_index_compaction_unique_keys_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_index_compaction_with_multi_index_segments_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_index_delete_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_index_empty_string_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_index_equal_select_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_index_match_phrase_edge_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_index_match_regexp_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_index_null_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_invalid_param.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_inverted_index_null_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_lowercase_arr.groovy create mode 100644 regression-test/suites/inverted_index_p0/array_contains/test_parser_with_none_stopwords.groovy diff --git a/be/src/vec/functions/array/function_array_index.h b/be/src/vec/functions/array/function_array_index.h index 7090c8548cdf11..58ab7a9a341358 100644 --- a/be/src/vec/functions/array/function_array_index.h +++ b/be/src/vec/functions/array/function_array_index.h @@ -129,13 +129,32 @@ class FunctionArrayIndex : public IFunction { return Status::Error( "Inverted index evaluate skipped, param_value is nullptr or value is null"); } + if (iter->get_inverted_index_reader_type() == + segment_v2::InvertedIndexReaderType::FULLTEXT) { + // parser is not none we can not make sure the result is correct in expr combination + // for example, filter: !array_index(array, 'tall:120cm, weight: 35kg') + // here we have rows [tall:120cm, weight: 35kg, hobbies: reading book] which be tokenized + // but query is also tokenized, and FULLTEXT reader will catch this row as matched, + // so array_index(array, 'tall:120cm, weight: 35kg') return this rowid, + // but we expect it to be filtered, because we want row is equal to 'tall:120cm, weight: 35kg' + return Status::Error( + "Inverted index evaluate skipped, FULLTEXT reader can not support array_index"); + } std::unique_ptr query_param = nullptr; RETURN_IF_ERROR(InvertedIndexQueryParamFactory::create_query_value( param_value->type, ¶m_value->value, query_param)); if (is_string_type(param_value->type)) { - RETURN_IF_ERROR(iter->read_from_inverted_index( + Status st = iter->read_from_inverted_index( data_type_with_name.first, query_param->get_value(), - segment_v2::InvertedIndexQueryType::EQUAL_QUERY, num_rows, roaring)); + segment_v2::InvertedIndexQueryType::EQUAL_QUERY, num_rows, roaring); + if (st.code() == ErrorCode::INVERTED_INDEX_NO_TERMS) { + // if analyzed param with no term, we do not filter any rows + // return all rows with OK status + bitmap->addRange(0, num_rows); + return Status::OK(); + } else if (st != Status::OK()) { + return st; + } } else { RETURN_IF_ERROR(iter->read_from_inverted_index( data_type_with_name.first, query_param->get_value(), diff --git a/regression-test/data/inverted_index_p0/array_contains/documents-1000.json b/regression-test/data/inverted_index_p0/array_contains/documents-1000.json new file mode 100644 index 00000000000000..0979961dee100a --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/documents-1000.json @@ -0,0 +1,1000 @@ +{"@timestamp": 893964617, "clientip":["40.135.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893964653, "clientip":["232.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893964672, "clientip":["26.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893964679, "clientip":["247.37.0.0"], "request": ["GET /french/splash_inet.html HTTP/1.0"], "status": [200], "size": [3781]} +{"@timestamp": 893964682, "clientip":["247.37.0.0"], "request": ["GET /images/hm_nbg.jpg HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893964687, "clientip":["252.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893964689, "clientip":["247.37.0.0"], "request": ["GET /images/hm_brdl.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893964689, "clientip":["247.37.0.0"], "request": ["GET /images/hm_arw.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893964692, "clientip":["247.37.0.0"], "request": ["GET /images/nav_bg_top.gif HTTP/1.0"], "status": [200], "size": [929]} +{"@timestamp": 893964703, "clientip":["247.37.0.0"], "request": ["GET /french/images/nav_venue_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893964704, "clientip":["247.37.0.0"], "request": ["GET /french/images/nav_hosts_off.gif HTTP/1.0"], "status": [200], "size": [1139]} +{"@timestamp": 893964712, "clientip":["2.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893964712, "clientip":["247.37.0.0"], "request": ["GET /french/tickets/body.html HTTP/1.0"], "status": [200], "size": [3029]} +{"@timestamp": 893964726, "clientip":["120.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893964736, "clientip":["247.37.0.0"], "request": ["GET /french/tickets/images/ticket_hm_header.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893964736, "clientip":["247.37.0.0"], "request": ["GET /french/tickets/images/ticket_hm_nav.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893964737, "clientip":["247.37.0.0"], "request": ["GET /images/arw_lk.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893964750, "clientip":["247.37.0.0"], "request": ["GET /french/tickets/tck_0804.htm HTTP/1.0"], "status": [200], "size": [14521]} +{"@timestamp": 893964753, "clientip":["247.37.0.0"], "request": ["GET /french/tickets/images/ticket_quest_bg2.jpg HTTP/1.0"], "status": [200], "size": [11324]} +{"@timestamp": 893964755, "clientip":["126.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893964758, "clientip":["247.37.0.0"], "request": ["GET /french/tickets/images/ticket_header.gif HTTP/1.0"], "status": [200], "size": [671]} +{"@timestamp": 893964758, "clientip":["247.37.0.0"], "request": ["GET /french/tickets/images/ticket_bu_abroad2.gif HTTP/1.0"], "status": [200], "size": [1512]} +{"@timestamp": 893964758, "clientip":["247.37.0.0"], "request": ["GET /french/tickets/images/ticket_bu_infrance2.gif HTTP/1.0"], "status": [200], "size": [1136]} +{"@timestamp": 893964758, "clientip":["247.37.0.0"], "request": ["GET /french/tickets/images/hm_f98_top.gif HTTP/1.0"], "status": [200], "size": [1647]} +{"@timestamp": 893964758, "clientip":["247.37.0.0"], "request": ["GET /french/tickets/images/ticket_bu_quest2.gif HTTP/1.0"], "status": [200], "size": [1271]} +{"@timestamp": 893964772, "clientip":["247.37.0.0"], "request": ["GET /french/news/3004bres.htm HTTP/1.0"], "status": [200], "size": [5933]} +{"@timestamp": 893964778, "clientip":["247.37.0.0"], "request": ["GET /french/images/hm_f98_top.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893964779, "clientip":["247.37.0.0"], "request": ["GET /images/bord_d.gif HTTP/1.0"], "status": [200], "size": [231]} +{"@timestamp": 893964779, "clientip":["247.37.0.0"], "request": ["GET /images/bord_g.gif HTTP/1.0"], "status": [200], "size": [231]} +{"@timestamp": 893964785, "clientip":["13.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893964789, "clientip":["138.2.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893964800, "clientip":["28.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893964809, "clientip":["31.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893964812, "clientip":["55.0.0.0"], "request": ["GET /french/index.html HTTP/1.0"], "status": [200], "size": [985]} +{"@timestamp": 893964815, "clientip":["29.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893964825, "clientip":["92.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893964841, "clientip":["134.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893964844, "clientip":["55.0.0.0"], "request": ["GET /french/index.html HTTP/1.0"], "status": [200], "size": [985]} +{"@timestamp": 893964864, "clientip":["137.2.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893964932, "clientip":["167.2.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893964936, "clientip":["174.2.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893964961, "clientip":["97.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893964973, "clientip":["174.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965016, "clientip":["121.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965036, "clientip":["2.2.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965050, "clientip":["91.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965059, "clientip":["47.2.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965070, "clientip":["142.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965084, "clientip":["104.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965106, "clientip":["40.135.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965115, "clientip":["109.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965123, "clientip":["184.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965139, "clientip":["55.0.0.0"], "request": ["GET /french/index.html HTTP/1.0"], "status": [200], "size": [985]} +{"@timestamp": 893965149, "clientip":["56.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965150, "clientip":["161.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965150, "clientip":["237.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965154, "clientip":["41.135.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965162, "clientip":["131.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965172, "clientip":["55.0.0.0"], "request": ["GET /french/index.html HTTP/1.0"], "status": [200], "size": [985]} +{"@timestamp": 893965182, "clientip":["42.135.0.0"], "request": ["GET /fth.htm HTTP/1.1"], "status": [200], "size": [190]} +{"@timestamp": 893965193, "clientip":["180.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965198, "clientip":["176.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965200, "clientip":["192.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965278, "clientip":["4.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965293, "clientip":["76.6.0.0"], "request": ["GET /images/teams_hm_bg.jpg HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965300, "clientip":["235.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965310, "clientip":["183.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965318, "clientip":["248.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965322, "clientip":["249.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965352, "clientip":["218.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965382, "clientip":["128.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965405, "clientip":["139.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965412, "clientip":["55.0.0.0"], "request": ["GET /french/index.html HTTP/1.0"], "status": [200], "size": [985]} +{"@timestamp": 893965424, "clientip":["249.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965449, "clientip":["55.0.0.0"], "request": ["GET /french/index.html HTTP/1.0"], "status": [200], "size": [985]} +{"@timestamp": 893965464, "clientip":["221.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965467, "clientip":["175.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965479, "clientip":["43.135.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965504, "clientip":["201.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965518, "clientip":["17.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965550, "clientip":["138.2.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965554, "clientip":["232.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965578, "clientip":["76.6.0.0"], "request": ["GET /images/nantes.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965585, "clientip":["252.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965598, "clientip":["120.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965616, "clientip":["2.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965622, "clientip":["44.135.0.0"], "request": ["GET /french/index.html HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965626, "clientip":["44.135.0.0"], "request": ["GET /french/nav_inet.html HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965626, "clientip":["44.135.0.0"], "request": ["GET /french/splash_inet.html HTTP/1.0"], "status": [200], "size": [3781]} +{"@timestamp": 893965626, "clientip":["44.135.0.0"], "request": ["GET /french/nav_top_inet.html HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965627, "clientip":["44.135.0.0"], "request": ["GET /images/nav_bg_top.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965628, "clientip":["44.135.0.0"], "request": ["GET /images/hm_nbg.jpg HTTP/1.0"], "status": [200], "size": [33665]} +{"@timestamp": 893965631, "clientip":["44.135.0.0"], "request": ["GET /images/logo_cfo.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965632, "clientip":["44.135.0.0"], "request": ["GET /french/ProScroll.class HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965634, "clientip":["44.135.0.0"], "request": ["GET /images/nav_bg_bottom.jpg HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965634, "clientip":["44.135.0.0"], "request": ["GET /french/images/nav_news_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965634, "clientip":["44.135.0.0"], "request": ["GET /french/images/nav_comp_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965638, "clientip":["44.135.0.0"], "request": ["GET /french/images/nav_venue_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965648, "clientip":["126.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965649, "clientip":["44.135.0.0"], "request": ["GET /french/images/nav_tickets_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965651, "clientip":["44.135.0.0"], "request": ["GET /french/news/3004bres.htm HTTP/1.0"], "status": [200], "size": [5933]} +{"@timestamp": 893965651, "clientip":["44.135.0.0"], "request": ["GET /french/images/nav_field_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965652, "clientip":["44.135.0.0"], "request": ["GET /french/images/nav_history_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965655, "clientip":["44.135.0.0"], "request": ["GET /images/backnews.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965658, "clientip":["44.135.0.0"], "request": ["GET /french/images/nav_team_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965658, "clientip":["44.135.0.0"], "request": ["GET /french/images/nav_store_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965658, "clientip":["44.135.0.0"], "request": ["GET /french/images/nav_home_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965659, "clientip":["44.135.0.0"], "request": ["GET /french/images/nav_sitemap_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965659, "clientip":["44.135.0.0"], "request": ["GET /french/images/fpnewstop.gif HTTP/1.0"], "status": [200], "size": [1317]} +{"@timestamp": 893965660, "clientip":["44.135.0.0"], "request": ["GET /french/images/hm_f98_top.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965661, "clientip":["44.135.0.0"], "request": ["GET /french/images/news_btn_letter_off.gif HTTP/1.0"], "status": [200], "size": [871]} +{"@timestamp": 893965661, "clientip":["44.135.0.0"], "request": ["GET /french/images/news_btn_press_off.gif HTTP/1.0"], "status": [200], "size": [1795]} +{"@timestamp": 893965662, "clientip":["44.135.0.0"], "request": ["GET /french/images/news_btn_kits_off.gif HTTP/1.0"], "status": [200], "size": [965]} +{"@timestamp": 893965662, "clientip":["44.135.0.0"], "request": ["GET /french/images/nav_hosts_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965662, "clientip":["44.135.0.0"], "request": ["GET /french/images/nav_logo_sponsors.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965663, "clientip":["44.135.0.0"], "request": ["GET /images/bord_d.gif HTTP/1.0"], "status": [200], "size": [231]} +{"@timestamp": 893965664, "clientip":["44.135.0.0"], "request": ["GET /images/bord_g.gif HTTP/1.0"], "status": [200], "size": [231]} +{"@timestamp": 893965668, "clientip":["26.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965684, "clientip":["13.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965700, "clientip":["28.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965700, "clientip":["44.135.0.0"], "request": ["GET /french/news/newsprr.htm HTTP/1.0"], "status": [200], "size": [28486]} +{"@timestamp": 893965705, "clientip":["44.135.0.0"], "request": ["GET /french/images/space.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965706, "clientip":["44.135.0.0"], "request": ["GET /images/space.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965706, "clientip":["44.135.0.0"], "request": ["GET /french/images/news_btn_press_on.gif HTTP/1.0"], "status": [200], "size": [1757]} +{"@timestamp": 893965706, "clientip":["44.135.0.0"], "request": ["GET /images/hm_f98_top.gif HTTP/1.0"], "status": [200], "size": [915]} +{"@timestamp": 893965708, "clientip":["44.135.0.0"], "request": ["GET /french/images/news_hd_press.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965708, "clientip":["44.135.0.0"], "request": ["GET /images/news_arrow.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893965712, "clientip":["55.0.0.0"], "request": ["GET /french/index.html HTTP/1.0"], "status": [200], "size": [985]} +{"@timestamp": 893965724, "clientip":["31.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965727, "clientip":["92.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965727, "clientip":["134.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965731, "clientip":["29.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965738, "clientip":["55.0.0.0"], "request": ["GET /french/index.html HTTP/1.0"], "status": [200], "size": [985]} +{"@timestamp": 893965753, "clientip":["237.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965796, "clientip":["42.135.0.0"], "request": ["GET /fth.htm HTTP/1.1"], "status": [200], "size": [190]} +{"@timestamp": 893965849, "clientip":["174.2.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965856, "clientip":["167.2.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965865, "clientip":["137.2.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965882, "clientip":["40.135.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965883, "clientip":["97.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965896, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/argentina78.html HTTP/1.0"], "status": [200], "size": [20916]} +{"@timestamp": 893965899, "clientip":["45.135.0.0"], "request": ["GET /french/history/images/history_hm_header.gif HTTP/1.0"], "status": [200], "size": [1034]} +{"@timestamp": 893965899, "clientip":["45.135.0.0"], "request": ["GET /french/history/images/football.GIF HTTP/1.0"], "status": [200], "size": [1452]} +{"@timestamp": 893965899, "clientip":["45.135.0.0"], "request": ["GET /french/history/images/france98b.GIF HTTP/1.0"], "status": [200], "size": [915]} +{"@timestamp": 893965901, "clientip":["45.135.0.0"], "request": ["GET /french/history/images/infrance.GIF HTTP/1.0"], "status": [200], "size": [1017]} +{"@timestamp": 893965901, "clientip":["45.135.0.0"], "request": ["GET /french/history/images/reading.GIF HTTP/1.0"], "status": [200], "size": [1094]} +{"@timestamp": 893965901, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/images/past_bu_30_off.gif HTTP/1.0"], "status": [200], "size": [406]} +{"@timestamp": 893965902, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/images/past_bu_38_off.gif HTTP/1.0"], "status": [200], "size": [436]} +{"@timestamp": 893965903, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/images/past_bu_54_off.gif HTTP/1.0"], "status": [200], "size": [403]} +{"@timestamp": 893965904, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/images/past_bu_62_off.gif HTTP/1.0"], "status": [200], "size": [437]} +{"@timestamp": 893965905, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/images/past_bu_70_off.gif HTTP/1.0"], "status": [200], "size": [409]} +{"@timestamp": 893965905, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/images/past_bu_78_on.gif HTTP/1.0"], "status": [200], "size": [501]} +{"@timestamp": 893965906, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/images/past_bu_94_off.gif HTTP/1.0"], "status": [200], "size": [432]} +{"@timestamp": 893965906, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/images/past_bu_86_off.gif HTTP/1.0"], "status": [200], "size": [409]} +{"@timestamp": 893965906, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/images/posters/argentina78.gif HTTP/1.0"], "status": [200], "size": [4033]} +{"@timestamp": 893965907, "clientip":["45.135.0.0"], "request": ["GET /images/hist7802.jpg HTTP/1.0"], "status": [200], "size": [10813]} +{"@timestamp": 893965907, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/images/past_trophy2.gif HTTP/1.0"], "status": [200], "size": [443]} +{"@timestamp": 893965908, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/images/past_bu_50_off.gif HTTP/1.0"], "status": [200], "size": [392]} +{"@timestamp": 893965908, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/images/past_header.gif HTTP/1.0"], "status": [200], "size": [2077]} +{"@timestamp": 893965910, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/images/past_bu_66_off.gif HTTP/1.0"], "status": [200], "size": [435]} +{"@timestamp": 893965911, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/images/past_bu_82_off.gif HTTP/1.0"], "status": [200], "size": [433]} +{"@timestamp": 893965912, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/images/past_bracket_top.gif HTTP/1.0"], "status": [200], "size": [289]} +{"@timestamp": 893965913, "clientip":["45.135.0.0"], "request": ["GET /images/hist7801.jpg HTTP/1.0"], "status": [200], "size": [12855]} +{"@timestamp": 893965913, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/images/past_bu_74_off.gif HTTP/1.0"], "status": [200], "size": [423]} +{"@timestamp": 893965913, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/images/past_bu_34_off.gif HTTP/1.0"], "status": [200], "size": [397]} +{"@timestamp": 893965915, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/images/past_bracket_bot.gif HTTP/1.0"], "status": [200], "size": [631]} +{"@timestamp": 893965917, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/images/past_bu_58_off.gif HTTP/1.0"], "status": [200], "size": [397]} +{"@timestamp": 893965917, "clientip":["45.135.0.0"], "request": ["GET /french/history/past_cups/images/past_bu_90_off.gif HTTP/1.0"], "status": [200], "size": [429]} +{"@timestamp": 893965917, "clientip":["45.135.0.0"], "request": ["GET /french/history/images/thecup.GIF HTTP/1.0"], "status": [200], "size": [1036]} +{"@timestamp": 893965930, "clientip":["174.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965932, "clientip":["121.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965937, "clientip":["91.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965976, "clientip":["142.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965979, "clientip":["104.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965988, "clientip":["47.135.0.0"], "request": ["GET /french/index.html HTTP/1.0"], "status": [200], "size": [985]} +{"@timestamp": 893965991, "clientip":["47.135.0.0"], "request": ["GET /french/nav_top_inet.html HTTP/1.0"], "status": [200], "size": [374]} +{"@timestamp": 893965991, "clientip":["47.135.0.0"], "request": ["GET /french/splash_inet.html HTTP/1.0"], "status": [200], "size": [3781]} +{"@timestamp": 893965991, "clientip":["47.135.0.0"], "request": ["GET /french/nav_inet.html HTTP/1.0"], "status": [200], "size": [2739]} +{"@timestamp": 893965992, "clientip":["109.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893965993, "clientip":["47.135.0.0"], "request": ["GET /images/nav_bg_bottom.jpg HTTP/1.0"], "status": [200], "size": [8389]} +{"@timestamp": 893965993, "clientip":["47.135.0.0"], "request": ["GET /images/logo_cfo.gif HTTP/1.0"], "status": [200], "size": [1504]} +{"@timestamp": 893965993, "clientip":["47.135.0.0"], "request": ["GET /french/images/nav_team_off.gif HTTP/1.0"], "status": [200], "size": [870]} +{"@timestamp": 893965993, "clientip":["47.135.0.0"], "request": ["GET /images/nav_bg_top.gif HTTP/1.0"], "status": [200], "size": [929]} +{"@timestamp": 893965994, "clientip":["47.135.0.0"], "request": ["GET /french/images/nav_news_off.gif HTTP/1.0"], "status": [200], "size": [855]} +{"@timestamp": 893965994, "clientip":["47.135.0.0"], "request": ["GET /french/images/nav_comp_off.gif HTTP/1.0"], "status": [200], "size": [995]} +{"@timestamp": 893965998, "clientip":["47.135.0.0"], "request": ["GET /french/images/nav_sitemap_off.gif HTTP/1.0"], "status": [200], "size": [413]} +{"@timestamp": 893966000, "clientip":["47.135.0.0"], "request": ["GET /french/images/nav_field_off.gif HTTP/1.0"], "status": [200], "size": [982]} +{"@timestamp": 893966001, "clientip":["47.135.0.0"], "request": ["GET /french/images/nav_hosts_off.gif HTTP/1.0"], "status": [200], "size": [1139]} +{"@timestamp": 893966002, "clientip":["47.135.0.0"], "request": ["GET /images/hm_nbg.jpg HTTP/1.0"], "status": [200], "size": [33665]} +{"@timestamp": 893966002, "clientip":["47.135.0.0"], "request": ["GET /images/space.gif HTTP/1.0"], "status": [200], "size": [42]} +{"@timestamp": 893966003, "clientip":["47.135.0.0"], "request": ["GET /french/images/nav_store_off.gif HTTP/1.0"], "status": [200], "size": [976]} +{"@timestamp": 893966004, "clientip":["47.135.0.0"], "request": ["GET /french/ProScroll.class HTTP/1.0"], "status": [200], "size": [6507]} +{"@timestamp": 893966004, "clientip":["47.135.0.0"], "request": ["GET /french/images/hm_official.gif HTTP/1.0"], "status": [200], "size": [972]} +{"@timestamp": 893966004, "clientip":["47.135.0.0"], "request": ["GET /french/images/nav_logo_sponsors.gif HTTP/1.0"], "status": [200], "size": [1991]} +{"@timestamp": 893966004, "clientip":["46.135.0.0"], "request": ["GET /images/space.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966005, "clientip":["47.135.0.0"], "request": ["GET /french/images/nav_home_off.gif HTTP/1.0"], "status": [200], "size": [915]} +{"@timestamp": 893966006, "clientip":["47.135.0.0"], "request": ["GET /french/images/nav_history_off.gif HTTP/1.0"], "status": [200], "size": [966]} +{"@timestamp": 893966008, "clientip":["47.135.0.0"], "request": ["GET /french/images/nav_venue_off.gif HTTP/1.0"], "status": [200], "size": [945]} +{"@timestamp": 893966010, "clientip":["47.135.0.0"], "request": ["GET /french/images/nav_tickets_off.gif HTTP/1.0"], "status": [200], "size": [965]} +{"@timestamp": 893966011, "clientip":["55.0.0.0"], "request": ["GET /french/index.html HTTP/1.0"], "status": [200], "size": [985]} +{"@timestamp": 893966017, "clientip":["47.135.0.0"], "request": ["GET /images/hm_anime_f.gif HTTP/1.0"], "status": [200], "size": [15529]} +{"@timestamp": 893966017, "clientip":["47.135.0.0"], "request": ["GET /images/hm_day_f.gif HTTP/1.0"], "status": [200], "size": [574]} +{"@timestamp": 893966019, "clientip":["47.135.0.0"], "request": ["GET /images/hm_brdl.gif HTTP/1.0"], "status": [200], "size": [208]} +{"@timestamp": 893966021, "clientip":["47.135.0.0"], "request": ["GET /images/hm_linkf.gif HTTP/1.0"], "status": [200], "size": [123]} +{"@timestamp": 893966024, "clientip":["47.135.0.0"], "request": ["GET /images/hm_arw.gif HTTP/1.0"], "status": [200], "size": [1050]} +{"@timestamp": 893966028, "clientip":["47.135.0.0"], "request": ["GET /images/dot.gif HTTP/1.0"], "status": [200], "size": [43]} +{"@timestamp": 893966028, "clientip":["47.135.0.0"], "request": ["GET /images/hm_brdr.gif HTTP/1.0"], "status": [200], "size": [235]} +{"@timestamp": 893966031, "clientip":["47.135.0.0"], "request": ["GET /images/info.gif HTTP/1.0"], "status": [200], "size": [1251]} +{"@timestamp": 893966048, "clientip":["131.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966055, "clientip":["41.135.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966068, "clientip":["161.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966068, "clientip":["56.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966084, "clientip":["176.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966085, "clientip":["47.135.0.0"], "request": ["GET /french/frntpage.htm HTTP/1.0"], "status": [200], "size": [12824]} +{"@timestamp": 893966088, "clientip":["55.0.0.0"], "request": ["GET /french/index.html HTTP/1.0"], "status": [200], "size": [985]} +{"@timestamp": 893966090, "clientip":["47.2.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966091, "clientip":["47.135.0.0"], "request": ["GET /images/backnews.gif HTTP/1.0"], "status": [200], "size": [4573]} +{"@timestamp": 893966091, "clientip":["47.135.0.0"], "request": ["GET /french/images/fpnewstop.gif HTTP/1.0"], "status": [200], "size": [1317]} +{"@timestamp": 893966091, "clientip":["47.135.0.0"], "request": ["GET /french/images/space.gif HTTP/1.0"], "status": [200], "size": [42]} +{"@timestamp": 893966092, "clientip":["180.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966096, "clientip":["47.135.0.0"], "request": ["GET /images/ligne1_case5.gif HTTP/1.0"], "status": [200], "size": [1018]} +{"@timestamp": 893966097, "clientip":["47.135.0.0"], "request": ["GET /images/case5.gif HTTP/1.0"], "status": [200], "size": [1362]} +{"@timestamp": 893966097, "clientip":["47.135.0.0"], "request": ["GET /images/dburton.jpg HTTP/1.0"], "status": [200], "size": [12009]} +{"@timestamp": 893966098, "clientip":["47.135.0.0"], "request": ["GET /images/ligne.gif HTTP/1.0"], "status": [200], "size": [169]} +{"@timestamp": 893966100, "clientip":["47.135.0.0"], "request": ["GET /images/ligneb.gif HTTP/1.0"], "status": [200], "size": [169]} +{"@timestamp": 893966102, "clientip":["47.135.0.0"], "request": ["GET /images/ligneb01.gif HTTP/1.0"], "status": [200], "size": [169]} +{"@timestamp": 893966102, "clientip":["47.135.0.0"], "request": ["GET /images/ligne01.gif HTTP/1.0"], "status": [200], "size": [169]} +{"@timestamp": 893966104, "clientip":["47.135.0.0"], "request": ["GET /images/hm_f98_top.gif HTTP/1.0"], "status": [200], "size": [915]} +{"@timestamp": 893966104, "clientip":["47.135.0.0"], "request": ["GET /images/base.gif HTTP/1.0"], "status": [200], "size": [366]} +{"@timestamp": 893966108, "clientip":["47.135.0.0"], "request": ["GET /french/images/news_btn_press_off.gif HTTP/1.0"], "status": [200], "size": [1795]} +{"@timestamp": 893966109, "clientip":["47.135.0.0"], "request": ["GET /french/images/lateb_new.gif HTTP/1.0"], "status": [200], "size": [1285]} +{"@timestamp": 893966109, "clientip":["47.135.0.0"], "request": ["GET /french/images/today_new.gif HTTP/1.0"], "status": [200], "size": [869]} +{"@timestamp": 893966110, "clientip":["47.135.0.0"], "request": ["GET /images/bord_stories.gif HTTP/1.0"], "status": [200], "size": [520]} +{"@timestamp": 893966111, "clientip":["47.135.0.0"], "request": ["GET /images/ligne4_latebreak.gif HTTP/1.0"], "status": [200], "size": [1056]} +{"@timestamp": 893966112, "clientip":["47.135.0.0"], "request": ["GET /images/bord_stories01.gif HTTP/1.0"], "status": [200], "size": [333]} +{"@timestamp": 893966113, "clientip":["47.135.0.0"], "request": ["GET /french/images/archives.gif HTTP/1.0"], "status": [200], "size": [569]} +{"@timestamp": 893966113, "clientip":["47.135.0.0"], "request": ["GET /french/images/top_stories.gif HTTP/1.0"], "status": [200], "size": [1078]} +{"@timestamp": 893966113, "clientip":["47.135.0.0"], "request": ["GET /french/images/news_btn_letter_off.gif HTTP/1.0"], "status": [200], "size": [871]} +{"@timestamp": 893966115, "clientip":["47.135.0.0"], "request": ["GET /french/images/news_btn_kits_off.gif HTTP/1.0"], "status": [200], "size": [965]} +{"@timestamp": 893966135, "clientip":["184.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966178, "clientip":["4.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966210, "clientip":["183.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966218, "clientip":["249.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966220, "clientip":["235.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966221, "clientip":["47.135.0.0"], "request": ["GET /french/news/3004tick.htm HTTP/1.0"], "status": [200], "size": [4234]} +{"@timestamp": 893966223, "clientip":["47.135.0.0"], "request": ["GET /french/images/hm_f98_top.gif HTTP/1.0"], "status": [200], "size": [915]} +{"@timestamp": 893966224, "clientip":["47.135.0.0"], "request": ["GET /images/ps_bdr_r.gif HTTP/1.0"], "status": [200], "size": [281]} +{"@timestamp": 893966224, "clientip":["47.135.0.0"], "request": ["GET /images/ps_bdr_l.gif HTTP/1.0"], "status": [200], "size": [346]} +{"@timestamp": 893966232, "clientip":["248.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966259, "clientip":["2.2.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966273, "clientip":["218.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966280, "clientip":["48.4.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966296, "clientip":["128.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966306, "clientip":["139.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966310, "clientip":["141.78.0.0"], "request": ["GET /french/index.html HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966310, "clientip":["141.78.0.0"], "request": ["GET /french/nav_top_inet.html HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966310, "clientip":["141.78.0.0"], "request": ["GET /french/nav_inet.html HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966311, "clientip":["141.78.0.0"], "request": ["GET /french/splash_inet.html HTTP/1.0"], "status": [200], "size": [3781]} +{"@timestamp": 893966322, "clientip":["249.1.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966327, "clientip":["55.0.0.0"], "request": ["GET /french/index.html HTTP/1.0"], "status": [200], "size": [985]} +{"@timestamp": 893966342, "clientip":["47.135.0.0"], "request": ["GET /french/frntpage.htm HTTP/1.0"], "status": [200], "size": [12824]} +{"@timestamp": 893966343, "clientip":["141.78.0.0"], "request": ["GET /french/ProScroll.class HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966344, "clientip":["141.78.0.0"], "request": ["GET /french/images/nav_history_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966344, "clientip":["141.78.0.0"], "request": ["GET /french/images/nav_store_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966344, "clientip":["141.78.0.0"], "request": ["GET /images/nav_bg_top.gif HTTP/1.0"], "status": [200], "size": [929]} +{"@timestamp": 893966344, "clientip":["141.78.0.0"], "request": ["GET /french/images/nav_tickets_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966345, "clientip":["141.78.0.0"], "request": ["GET /images/hm_brdr.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966345, "clientip":["141.78.0.0"], "request": ["GET /images/hm_anime_f.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966345, "clientip":["141.78.0.0"], "request": ["GET /images/logo_cfo.gif HTTP/1.0"], "status": [200], "size": [1504]} +{"@timestamp": 893966345, "clientip":["141.78.0.0"], "request": ["GET /images/hm_day_f.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966346, "clientip":["141.78.0.0"], "request": ["GET /french/images/nav_team_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966346, "clientip":["141.78.0.0"], "request": ["GET /images/space.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966346, "clientip":["141.78.0.0"], "request": ["GET /french/images/nav_history_off.gif HTTP/1.0"], "status": [206], "size": [838]} +{"@timestamp": 893966347, "clientip":["141.78.0.0"], "request": ["GET /images/hm_brdr.gif HTTP/1.0"], "status": [206], "size": [107]} +{"@timestamp": 893966348, "clientip":["141.78.0.0"], "request": ["GET /french/images/nav_field_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966348, "clientip":["141.78.0.0"], "request": ["GET /french/images/nav_sitemap_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966348, "clientip":["141.78.0.0"], "request": ["GET /french/images/nav_home_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966348, "clientip":["141.78.0.0"], "request": ["GET /images/hm_brdl.gif HTTP/1.0"], "status": [200], "size": [208]} +{"@timestamp": 893966348, "clientip":["141.78.0.0"], "request": ["GET /images/dot.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966349, "clientip":["141.78.0.0"], "request": ["GET /french/images/nav_venue_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966350, "clientip":["141.78.0.0"], "request": ["GET /french/images/nav_hosts_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966351, "clientip":["141.78.0.0"], "request": ["GET /images/hm_linkf.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966351, "clientip":["141.78.0.0"], "request": ["GET /french/images/nav_logo_sponsors.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966352, "clientip":["141.78.0.0"], "request": ["GET /images/hm_arw.gif HTTP/1.0"], "status": [200], "size": [1050]} +{"@timestamp": 893966352, "clientip":["141.78.0.0"], "request": ["GET /images/info.gif HTTP/1.0"], "status": [200], "size": [1251]} +{"@timestamp": 893966368, "clientip":["221.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966381, "clientip":["43.135.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966384, "clientip":["175.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966384, "clientip":["55.0.0.0"], "request": ["GET /french/index.html HTTP/1.0"], "status": [200], "size": [985]} +{"@timestamp": 893966386, "clientip":["141.78.0.0"], "request": ["GET /french/competition/maincomp.htm HTTP/1.0"], "status": [200], "size": [3048]} +{"@timestamp": 893966388, "clientip":["141.78.0.0"], "request": ["GET /images/comp_hm_brac.gif HTTP/1.0"], "status": [200], "size": [254]} +{"@timestamp": 893966388, "clientip":["141.78.0.0"], "request": ["GET /french/images/comp_bg2_hm.jpg HTTP/1.0"], "status": [200], "size": [25676]} +{"@timestamp": 893966388, "clientip":["141.78.0.0"], "request": ["GET /french/images/bar.jpg HTTP/1.0"], "status": [200], "size": [686]} +{"@timestamp": 893966388, "clientip":["141.78.0.0"], "request": ["GET /french/images/comp_hm_header_shad.gif HTTP/1.0"], "status": [200], "size": [2207]} +{"@timestamp": 893966388, "clientip":["141.78.0.0"], "request": ["GET /french/images/france98b.gif HTTP/1.0"], "status": [200], "size": [2122]} +{"@timestamp": 893966389, "clientip":["141.78.0.0"], "request": ["GET /french/images/comp_hm_nav.gif HTTP/1.0"], "status": [200], "size": [11652]} +{"@timestamp": 893966390, "clientip":["141.78.0.0"], "request": ["GET /images/comp_hm_archive.gif HTTP/1.0"], "status": [200], "size": [1644]} +{"@timestamp": 893966391, "clientip":["141.78.0.0"], "request": ["GET /french/frntpage.htm HTTP/1.0"], "status": [200], "size": [12824]} +{"@timestamp": 893966392, "clientip":["141.78.0.0"], "request": ["GET /images/backnews.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966392, "clientip":["141.78.0.0"], "request": ["GET /french/images/fpnewstop.gif HTTP/1.0"], "status": [200], "size": [1317]} +{"@timestamp": 893966392, "clientip":["141.78.0.0"], "request": ["GET /french/images/space.gif HTTP/1.0"], "status": [200], "size": [42]} +{"@timestamp": 893966393, "clientip":["141.78.0.0"], "request": ["GET /french/images/news_btn_letter_off.gif HTTP/1.0"], "status": [200], "size": [871]} +{"@timestamp": 893966393, "clientip":["141.78.0.0"], "request": ["GET /images/hm_f98_top.gif HTTP/1.0"], "status": [200], "size": [915]} +{"@timestamp": 893966393, "clientip":["141.78.0.0"], "request": ["GET /images/ligneb.gif HTTP/1.0"], "status": [200], "size": [169]} +{"@timestamp": 893966393, "clientip":["141.78.0.0"], "request": ["GET /french/images/today_new.gif HTTP/1.0"], "status": [200], "size": [869]} +{"@timestamp": 893966394, "clientip":["141.78.0.0"], "request": ["GET /images/case5.gif HTTP/1.0"], "status": [200], "size": [1362]} +{"@timestamp": 893966394, "clientip":["141.78.0.0"], "request": ["GET /images/ligne.gif HTTP/1.0"], "status": [200], "size": [169]} +{"@timestamp": 893966395, "clientip":["141.78.0.0"], "request": ["GET /images/ligneb.gif HTTP/1.0"], "status": [200], "size": [169]} +{"@timestamp": 893966395, "clientip":["141.78.0.0"], "request": ["GET /images/ligne01.gif HTTP/1.0"], "status": [200], "size": [169]} +{"@timestamp": 893966395, "clientip":["141.78.0.0"], "request": ["GET /images/ligneb.gif HTTP/1.0"], "status": [200], "size": [169]} +{"@timestamp": 893966395, "clientip":["141.78.0.0"], "request": ["GET /french/images/news_btn_press_off.gif HTTP/1.0"], "status": [200], "size": [1795]} +{"@timestamp": 893966396, "clientip":["141.78.0.0"], "request": ["GET /images/ligne01.gif HTTP/1.0"], "status": [200], "size": [169]} +{"@timestamp": 893966397, "clientip":["141.78.0.0"], "request": ["GET /images/bord_stories01.gif HTTP/1.0"], "status": [200], "size": [333]} +{"@timestamp": 893966397, "clientip":["141.78.0.0"], "request": ["GET /images/dburton.jpg HTTP/1.0"], "status": [200], "size": [12009]} +{"@timestamp": 893966397, "clientip":["141.78.0.0"], "request": ["GET /images/ligne1_case5.gif HTTP/1.0"], "status": [200], "size": [1018]} +{"@timestamp": 893966397, "clientip":["141.78.0.0"], "request": ["GET /images/ligne4_latebreak.gif HTTP/1.0"], "status": [200], "size": [1056]} +{"@timestamp": 893966397, "clientip":["42.135.0.0"], "request": ["GET /fth.htm HTTP/1.1"], "status": [200], "size": [190]} +{"@timestamp": 893966398, "clientip":["141.78.0.0"], "request": ["GET /french/images/news_btn_kits_off.gif HTTP/1.0"], "status": [200], "size": [965]} +{"@timestamp": 893966398, "clientip":["141.78.0.0"], "request": ["GET /images/ligneb01.gif HTTP/1.0"], "status": [200], "size": [169]} +{"@timestamp": 893966398, "clientip":["141.78.0.0"], "request": ["GET /images/bord_stories.gif HTTP/1.0"], "status": [200], "size": [520]} +{"@timestamp": 893966399, "clientip":["141.78.0.0"], "request": ["GET /images/base.gif HTTP/1.0"], "status": [200], "size": [366]} +{"@timestamp": 893966399, "clientip":["141.78.0.0"], "request": ["GET /french/images/lateb_new.gif HTTP/1.0"], "status": [200], "size": [1285]} +{"@timestamp": 893966399, "clientip":["141.78.0.0"], "request": ["GET /images/ligneb01.gif HTTP/1.0"], "status": [200], "size": [169]} +{"@timestamp": 893966399, "clientip":["141.78.0.0"], "request": ["GET /french/images/archives.gif HTTP/1.0"], "status": [200], "size": [569]} +{"@timestamp": 893966400, "clientip":["141.78.0.0"], "request": ["GET /french/images/top_stories.gif HTTP/1.0"], "status": [200], "size": [1078]} +{"@timestamp": 893966402, "clientip":["0.0.0.0"], "request": ["GET /images/home_intro.anim.gif HTTP/1.0"], "status": [200], "size": [60349]} +{"@timestamp": 893966403, "clientip":["1.0.0.0"], "request": ["GET /images/home_bg_stars.gif HTTP/1.0"], "status": [200], "size": [2557]} +{"@timestamp": 893966403, "clientip":["1.0.0.0"], "request": ["GET /images/home_fr_phrase.gif HTTP/1.0"], "status": [200], "size": [2843]} +{"@timestamp": 893966403, "clientip":["2.0.0.0"], "request": ["GET /images/nav_bg_top.gif HTTP/1.0"], "status": [200], "size": [929]} +{"@timestamp": 893966403, "clientip":["1.0.0.0"], "request": ["GET /images/home_logo.gif HTTP/1.0"], "status": [200], "size": [3401]} +{"@timestamp": 893966404, "clientip":["2.0.0.0"], "request": ["GET /images/logo_cfo.gif HTTP/1.0"], "status": [200], "size": [1504]} +{"@timestamp": 893966404, "clientip":["1.0.0.0"], "request": ["GET /images/home_eng_phrase.gif HTTP/1.0"], "status": [200], "size": [2861]} +{"@timestamp": 893966404, "clientip":["3.0.0.0"], "request": ["GET /english/index.html HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966404, "clientip":["4.0.0.0"], "request": ["GET /english/frntpage.htm HTTP/1.0"], "status": [200], "size": [12800]} +{"@timestamp": 893966404, "clientip":["5.0.0.0"], "request": ["GET /images/hm_f98_top.gif HTTP/1.1"], "status": [200], "size": [915]} +{"@timestamp": 893966404, "clientip":["6.0.0.0"], "request": ["GET /images/team_hm_concacaf.gif HTTP/1.0"], "status": [200], "size": [764]} +{"@timestamp": 893966404, "clientip":["6.0.0.0"], "request": ["GET /images/team_hm_afc.gif HTTP/1.0"], "status": [200], "size": [475]} +{"@timestamp": 893966404, "clientip":["6.0.0.0"], "request": ["GET /images/team_hm_caf.gif HTTP/1.0"], "status": [200], "size": [473]} +{"@timestamp": 893966405, "clientip":["7.0.0.0"], "request": ["GET /english/playing/mascot/mascot.html HTTP/1.0"], "status": [200], "size": [5521]} +{"@timestamp": 893966405, "clientip":["1.0.0.0"], "request": ["GET /images/home_tool.gif HTTP/1.0"], "status": [200], "size": [327]} +{"@timestamp": 893966405, "clientip":["8.0.0.0"], "request": ["GET /english/images/comp_bu_stage1n.gif HTTP/1.0"], "status": [200], "size": [1548]} +{"@timestamp": 893966405, "clientip":["8.0.0.0"], "request": ["GET /english/images/comp_bu_stage2n_on.gif HTTP/1.0"], "status": [200], "size": [996]} +{"@timestamp": 893966405, "clientip":["8.0.0.0"], "request": ["GET /images/comp_stage2_brc_top.gif HTTP/1.0"], "status": [200], "size": [163]} +{"@timestamp": 893966405, "clientip":["8.0.0.0"], "request": ["GET /images/comp_stage2_brc_topr.gif HTTP/1.0"], "status": [200], "size": [163]} +{"@timestamp": 893966405, "clientip":["9.0.0.0"], "request": ["GET /english/history/past_cups/images/posters/france38.gif HTTP/1.0"], "status": [200], "size": [4649]} +{"@timestamp": 893966405, "clientip":["3.0.0.0"], "request": ["GET /english/nav_top_inet.html HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966405, "clientip":["3.0.0.0"], "request": ["GET /english/nav_inet.html HTTP/1.0"], "status": [200], "size": [2672]} +{"@timestamp": 893966405, "clientip":["3.0.0.0"], "request": ["GET /english/splash_inet.html HTTP/1.0"], "status": [200], "size": [3730]} +{"@timestamp": 893966405, "clientip":["9.0.0.0"], "request": ["GET /english/history/past_cups/images/38-1.jpg HTTP/1.0"], "status": [200], "size": [14315]} +{"@timestamp": 893966405, "clientip":["10.0.0.0"], "request": ["GET /images/cal_nant.gif HTTP/1.0"], "status": [200], "size": [359]} +{"@timestamp": 893966405, "clientip":["9.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_38_on.gif HTTP/1.0"], "status": [200], "size": [507]} +{"@timestamp": 893966405, "clientip":["8.0.0.0"], "request": ["GET /images/comp_stage2_brc_botr.gif HTTP/1.0"], "status": [200], "size": [158]} +{"@timestamp": 893966405, "clientip":["8.0.0.0"], "request": ["GET /images/comp_stage2_brc_bot.gif HTTP/1.0"], "status": [200], "size": [160]} +{"@timestamp": 893966405, "clientip":["8.0.0.0"], "request": ["GET /images/comp_stage2_brc.gif HTTP/1.0"], "status": [200], "size": [82]} +{"@timestamp": 893966405, "clientip":["11.0.0.0"], "request": ["GET /images/comp_stage2_brc_botr.gif HTTP/1.0"], "status": [200], "size": [158]} +{"@timestamp": 893966405, "clientip":["12.0.0.0"], "request": ["GET /english/nav_top_inet.html HTTP/1.0"], "status": [200], "size": [374]} +{"@timestamp": 893966405, "clientip":["10.0.0.0"], "request": ["GET /images/cal_lyon.gif HTTP/1.0"], "status": [200], "size": [286]} +{"@timestamp": 893966405, "clientip":["12.0.0.0"], "request": ["GET /english/nav_inet.html HTTP/1.0"], "status": [200], "size": [2672]} +{"@timestamp": 893966405, "clientip":["1.0.0.0"], "request": ["GET /images/home_sponsor.gif HTTP/1.0"], "status": [200], "size": [2491]} +{"@timestamp": 893966405, "clientip":["12.0.0.0"], "request": ["GET /english/splash_inet.html HTTP/1.0"], "status": [200], "size": [3730]} +{"@timestamp": 893966405, "clientip":["10.0.0.0"], "request": ["GET /images/cal_mars.gif HTTP/1.0"], "status": [200], "size": [377]} +{"@timestamp": 893966405, "clientip":["10.0.0.0"], "request": ["GET /images/cal-lens.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966405, "clientip":["10.0.0.0"], "request": ["GET /images/cal_toul.gif HTTP/1.0"], "status": [200], "size": [380]} +{"@timestamp": 893966406, "clientip":["8.0.0.0"], "request": ["GET /english/competition/stage2.htm HTTP/1.0"], "status": [200], "size": [16606]} +{"@timestamp": 893966406, "clientip":["12.0.0.0"], "request": ["GET /images/hm_nbg.jpg HTTP/1.0"], "status": [200], "size": [33665]} +{"@timestamp": 893966406, "clientip":["10.0.0.0"], "request": ["GET /images/cal-lens.gif HTTP/1.0"], "status": [206], "size": [124]} +{"@timestamp": 893966406, "clientip":["8.0.0.0"], "request": ["GET /english/images/comp_bg2_hm.jpg HTTP/1.0"], "status": [200], "size": [25676]} +{"@timestamp": 893966406, "clientip":["8.0.0.0"], "request": ["GET /english/images/comp_hm_header.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966406, "clientip":["10.0.0.0"], "request": ["GET /images/cal_mont.gif HTTP/1.0"], "status": [200], "size": [316]} +{"@timestamp": 893966406, "clientip":["8.0.0.0"], "request": ["GET /english/images/space.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966406, "clientip":["2.0.0.0"], "request": ["GET /english/images/nav_store_off.gif HTTP/1.0"], "status": [200], "size": [934]} +{"@timestamp": 893966406, "clientip":["10.0.0.0"], "request": ["GET /images/cal_steti.gif HTTP/1.0"], "status": [200], "size": [1125]} +{"@timestamp": 893966406, "clientip":["1.0.0.0"], "request": ["GET /images/home_eng_button.gif HTTP/1.0"], "status": [200], "size": [1927]} +{"@timestamp": 893966406, "clientip":["5.0.0.0"], "request": ["GET /french/images/news_btn_press_off.gif HTTP/1.1"], "status": [200], "size": [1795]} +{"@timestamp": 893966406, "clientip":["1.0.0.0"], "request": ["GET /images/home_intro.anim.gif HTTP/1.0"], "status": [200], "size": [60349]} +{"@timestamp": 893966406, "clientip":["13.0.0.0"], "request": ["GET /english/images/comp_hm_header.gif HTTP/1.0"], "status": [200], "size": [1189]} +{"@timestamp": 893966406, "clientip":["3.0.0.0"], "request": ["GET /images/nav_bg_top.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966406, "clientip":["14.0.0.0"], "request": ["GET /images/logo_cfo.gif HTTP/1.1"], "status": [200], "size": [1504]} +{"@timestamp": 893966406, "clientip":["3.0.0.0"], "request": ["GET /images/logo_cfo.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966406, "clientip":["15.0.0.0"], "request": ["GET /cgi-bin/trivia/Trivia.pl?ENG HTTP/1.0"], "status": [200], "size": [6213]} +{"@timestamp": 893966406, "clientip":["13.0.0.0"], "request": ["GET /english/images/france98b.gif HTTP/1.0"], "status": [200], "size": [2122]} +{"@timestamp": 893966406, "clientip":["13.0.0.0"], "request": ["GET /english/images/comp_bu_stage1n.gif HTTP/1.0"], "status": [200], "size": [1548]} +{"@timestamp": 893966406, "clientip":["16.0.0.0"], "request": ["GET /images/s102336.gif HTTP/1.0"], "status": [200], "size": [177]} +{"@timestamp": 893966406, "clientip":["17.0.0.0"], "request": ["GET /english/history/images/france98b.GIF HTTP/1.0"], "status": [200], "size": [915]} +{"@timestamp": 893966406, "clientip":["17.0.0.0"], "request": ["GET /english/history/images/football.GIF HTTP/1.0"], "status": [200], "size": [1170]} +{"@timestamp": 893966406, "clientip":["18.0.0.0"], "request": ["GET /english/competition/headtohead78.htm HTTP/1.0"], "status": [200], "size": [20126]} +{"@timestamp": 893966406, "clientip":["3.0.0.0"], "request": ["GET /english/images/nav_tickets_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966406, "clientip":["12.0.0.0"], "request": ["GET /images/hm_anime_e.gif HTTP/1.0"], "status": [200], "size": [15609]} +{"@timestamp": 893966406, "clientip":["17.0.0.0"], "request": ["GET /english/history/images/infrance.GIF HTTP/1.0"], "status": [200], "size": [990]} +{"@timestamp": 893966406, "clientip":["19.0.0.0"], "request": ["GET /english/images/nav_news_off.gif HTTP/1.0"], "status": [200], "size": [853]} +{"@timestamp": 893966406, "clientip":["141.78.0.0"], "request": ["GET /french/images/hm_f98_top.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966406, "clientip":["141.78.0.0"], "request": ["GET /images/ps_bdr_r.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966406, "clientip":["141.78.0.0"], "request": ["GET /french/news/3004tick.htm HTTP/1.0"], "status": [200], "size": [4234]} +{"@timestamp": 893966406, "clientip":["141.78.0.0"], "request": ["GET /images/ps_bdr_l.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966407, "clientip":["12.0.0.0"], "request": ["GET /images/logo_cfo.gif HTTP/1.0"], "status": [200], "size": [1504]} +{"@timestamp": 893966407, "clientip":["19.0.0.0"], "request": ["GET /english/images/nav_comp_off.gif HTTP/1.0"], "status": [200], "size": [994]} +{"@timestamp": 893966407, "clientip":["3.0.0.0"], "request": ["GET /images/nav_bg_bottom.jpg HTTP/1.0"], "status": [200], "size": [8389]} +{"@timestamp": 893966407, "clientip":["19.0.0.0"], "request": ["GET /images/nav_bg_bottom.jpg HTTP/1.0"], "status": [200], "size": [8389]} +{"@timestamp": 893966407, "clientip":["8.0.0.0"], "request": ["GET /english/images/france98b.gif HTTP/1.0"], "status": [200], "size": [2122]} +{"@timestamp": 893966407, "clientip":["3.0.0.0"], "request": ["GET /english/images/nav_news_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966407, "clientip":["3.0.0.0"], "request": ["GET /english/images/nav_comp_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966407, "clientip":["1.0.0.0"], "request": ["GET /images/home_fr_button.gif HTTP/1.0"], "status": [200], "size": [2140]} +{"@timestamp": 893966407, "clientip":["12.0.0.0"], "request": ["GET /images/space.gif HTTP/1.0"], "status": [200], "size": [42]} +{"@timestamp": 893966407, "clientip":["3.0.0.0"], "request": ["GET /english/images/nav_team_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966407, "clientip":["3.0.0.0"], "request": ["GET /english/images/nav_venue_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966407, "clientip":["12.0.0.0"], "request": ["GET /english/images/hm_official.gif HTTP/1.0"], "status": [200], "size": [1807]} +{"@timestamp": 893966407, "clientip":["12.0.0.0"], "request": ["GET /english/ProScroll.class HTTP/1.0"], "status": [200], "size": [6507]} +{"@timestamp": 893966407, "clientip":["20.0.0.0"], "request": ["GET /images/10982.gif HTTP/1.0"], "status": [200], "size": [183]} +{"@timestamp": 893966407, "clientip":["20.0.0.0"], "request": ["GET /images/11101.gif HTTP/1.0"], "status": [200], "size": [415]} +{"@timestamp": 893966407, "clientip":["0.0.0.0"], "request": ["GET /images/home_sponsor.gif HTTP/1.0"], "status": [200], "size": [2491]} +{"@timestamp": 893966407, "clientip":["5.0.0.0"], "request": ["GET /french/images/space.gif HTTP/1.1"], "status": [200], "size": [42]} +{"@timestamp": 893966407, "clientip":["5.0.0.0"], "request": ["GET /french/images/fpnewstop.gif HTTP/1.1"], "status": [200], "size": [1317]} +{"@timestamp": 893966407, "clientip":["13.0.0.0"], "request": ["GET /english/images/comp_bu_stage2n.gif HTTP/1.0"], "status": [200], "size": [984]} +{"@timestamp": 893966407, "clientip":["2.0.0.0"], "request": ["GET /english/images/nav_sitemap_off.gif HTTP/1.0"], "status": [200], "size": [416]} +{"@timestamp": 893966407, "clientip":["13.0.0.0"], "request": ["GET /english/images/comp_bu_groupsn_on.gif HTTP/1.0"], "status": [200], "size": [963]} +{"@timestamp": 893966407, "clientip":["20.0.0.0"], "request": ["GET /images/bordeaux.gif HTTP/1.0"], "status": [200], "size": [723]} +{"@timestamp": 893966407, "clientip":["10.0.0.0"], "request": ["GET /images/cal_bord.gif HTTP/1.0"], "status": [200], "size": [416]} +{"@timestamp": 893966407, "clientip":["2.0.0.0"], "request": ["GET /english/images/nav_venue_off.gif HTTP/1.0"], "status": [200], "size": [870]} +{"@timestamp": 893966407, "clientip":["15.0.0.0"], "request": ["GET /english/playing/images/trivia/banner.jpg HTTP/1.0"], "status": [200], "size": [19967]} +{"@timestamp": 893966407, "clientip":["15.0.0.0"], "request": ["GET /english/playing/images/trivia/01test.gif HTTP/1.0"], "status": [200], "size": [1664]} +{"@timestamp": 893966407, "clientip":["8.0.0.0"], "request": ["GET /english/images/comp_bu_stage2n_on.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966408, "clientip":["8.0.0.0"], "request": ["GET /english/images/comp_bu_refsn.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966408, "clientip":["15.0.0.0"], "request": ["GET /english/playing/images/trivia/quizbg.gif HTTP/1.0"], "status": [200], "size": [1460]} +{"@timestamp": 893966408, "clientip":["20.0.0.0"], "request": ["GET /images/lyon.gif HTTP/1.0"], "status": [200], "size": [599]} +{"@timestamp": 893966408, "clientip":["12.0.0.0"], "request": ["GET /images/hm_day_e.gif HTTP/1.0"], "status": [200], "size": [499]} +{"@timestamp": 893966408, "clientip":["12.0.0.0"], "request": ["GET /images/info.gif HTTP/1.0"], "status": [200], "size": [1251]} +{"@timestamp": 893966408, "clientip":["12.0.0.0"], "request": ["GET /english/images/nav_team_off.gif HTTP/1.0"], "status": [200], "size": [776]} +{"@timestamp": 893966408, "clientip":["2.0.0.0"], "request": ["GET /images/space.gif HTTP/1.0"], "status": [200], "size": [42]} +{"@timestamp": 893966408, "clientip":["12.0.0.0"], "request": ["GET /images/nav_bg_bottom.jpg HTTP/1.0"], "status": [200], "size": [8389]} +{"@timestamp": 893966408, "clientip":["2.0.0.0"], "request": ["GET /english/images/hm_official.gif HTTP/1.0"], "status": [200], "size": [1807]} +{"@timestamp": 893966408, "clientip":["12.0.0.0"], "request": ["GET /english/images/nav_comp_off.gif HTTP/1.0"], "status": [200], "size": [994]} +{"@timestamp": 893966408, "clientip":["21.0.0.0"], "request": ["GET /english/news/11415.htm HTTP/1.1"], "status": [200], "size": [21300]} +{"@timestamp": 893966408, "clientip":["8.0.0.0"], "request": ["GET /images/comp_stage2_brc_top.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966408, "clientip":["12.0.0.0"], "request": ["GET /english/images/nav_field_off.gif HTTP/1.0"], "status": [200], "size": [1005]} +{"@timestamp": 893966408, "clientip":["17.0.0.0"], "request": ["GET /english/history/images/reading.GIF HTTP/1.0"], "status": [200], "size": [1171]} +{"@timestamp": 893966408, "clientip":["22.0.0.0"], "request": ["GET /english/teams/teamqualify124.htm HTTP/1.0"], "status": [200], "size": [3866]} +{"@timestamp": 893966408, "clientip":["23.0.0.0"], "request": ["GET / HTTP/1.0"], "status": [200], "size": [8712]} +{"@timestamp": 893966408, "clientip":["24.0.0.0"], "request": ["GET /images/space.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966409, "clientip":["24.0.0.0"], "request": ["GET /english/playing/images/anim/trivia_on.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966409, "clientip":["5.0.0.0"], "request": ["GET /french/images/today_new.gif HTTP/1.1"], "status": [200], "size": [869]} +{"@timestamp": 893966409, "clientip":["20.0.0.0"], "request": ["GET /images/saintdenis.gif HTTP/1.0"], "status": [200], "size": [702]} +{"@timestamp": 893966409, "clientip":["24.0.0.0"], "request": ["GET /english/playing/images/play_hm_mascot.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966409, "clientip":["5.0.0.0"], "request": ["GET /french/images/top_stories.gif HTTP/1.1"], "status": [200], "size": [1078]} +{"@timestamp": 893966409, "clientip":["5.0.0.0"], "request": ["GET /images/case5.gif HTTP/1.1"], "status": [200], "size": [1362]} +{"@timestamp": 893966409, "clientip":["17.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_30_off.gif HTTP/1.0"], "status": [200], "size": [406]} +{"@timestamp": 893966409, "clientip":["20.0.0.0"], "request": ["GET /images/toulouse.gif HTTP/1.0"], "status": [200], "size": [704]} +{"@timestamp": 893966409, "clientip":["25.0.0.0"], "request": ["GET /images/home_bg_stars.gif HTTP/1.1"], "status": [200], "size": [2557]} +{"@timestamp": 893966409, "clientip":["26.0.0.0"], "request": ["GET /english/images/nav_field_off.gif HTTP/1.0"], "status": [200], "size": [1005]} +{"@timestamp": 893966409, "clientip":["27.0.0.0"], "request": ["GET /english/images/teams_bu_group_on.gif HTTP/1.0"], "status": [200], "size": [668]} +{"@timestamp": 893966409, "clientip":["13.0.0.0"], "request": ["GET /english/images/comp_bu_refsn.gif HTTP/1.0"], "status": [200], "size": [933]} +{"@timestamp": 893966409, "clientip":["28.0.0.0"], "request": ["GET /english/individuals/player13893.htm HTTP/1.0"], "status": [200], "size": [6472]} +{"@timestamp": 893966409, "clientip":["13.0.0.0"], "request": ["GET /english/images/comp_bu_calendar.gif HTTP/1.0"], "status": [200], "size": [1197]} +{"@timestamp": 893966410, "clientip":["23.0.0.0"], "request": ["GET /images/home_fr_phrase.gif HTTP/1.0"], "status": [200], "size": [2843]} +{"@timestamp": 893966410, "clientip":["12.0.0.0"], "request": ["GET /images/nav_bg_top.gif HTTP/1.0"], "status": [200], "size": [929]} +{"@timestamp": 893966410, "clientip":["23.0.0.0"], "request": ["GET /images/home_logo.gif HTTP/1.0"], "status": [200], "size": [3401]} +{"@timestamp": 893966410, "clientip":["15.0.0.0"], "request": ["GET /english/playing/images/trivia/02how.gif HTTP/1.0"], "status": [200], "size": [754]} +{"@timestamp": 893966410, "clientip":["23.0.0.0"], "request": ["GET /images/home_eng_phrase.gif HTTP/1.0"], "status": [200], "size": [2861]} +{"@timestamp": 893966410, "clientip":["23.0.0.0"], "request": ["GET /images/home_tool.gif HTTP/1.0"], "status": [200], "size": [327]} +{"@timestamp": 893966410, "clientip":["29.0.0.0"], "request": ["GET /images/10511.jpg HTTP/1.0"], "status": [200], "size": [15543]} +{"@timestamp": 893966410, "clientip":["20.0.0.0"], "request": ["GET /images/11289.jpg HTTP/1.0"], "status": [200], "size": [6444]} +{"@timestamp": 893966410, "clientip":["12.0.0.0"], "request": ["GET /english/images/nav_logo_sponsors.gif HTTP/1.0"], "status": [200], "size": [1991]} +{"@timestamp": 893966410, "clientip":["12.0.0.0"], "request": ["GET /images/hm_brdl.gif HTTP/1.0"], "status": [200], "size": [208]} +{"@timestamp": 893966410, "clientip":["23.0.0.0"], "request": ["GET /images/home_sponsor.gif HTTP/1.0"], "status": [200], "size": [2491]} +{"@timestamp": 893966410, "clientip":["20.0.0.0"], "request": ["GET /images/11288.jpg HTTP/1.0"], "status": [200], "size": [5874]} +{"@timestamp": 893966410, "clientip":["23.0.0.0"], "request": ["GET /images/home_eng_button.gif HTTP/1.0"], "status": [200], "size": [1927]} +{"@timestamp": 893966410, "clientip":["23.0.0.0"], "request": ["GET /images/home_fr_button.gif HTTP/1.0"], "status": [200], "size": [2140]} +{"@timestamp": 893966410, "clientip":["8.0.0.0"], "request": ["GET /images/comp_stage2_brc.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966410, "clientip":["5.0.0.0"], "request": ["GET /images/dburton.jpg HTTP/1.1"], "status": [200], "size": [12009]} +{"@timestamp": 893966410, "clientip":["2.0.0.0"], "request": ["GET /images/hm_anime_e.gif HTTP/1.0"], "status": [200], "size": [15609]} +{"@timestamp": 893966410, "clientip":["12.0.0.0"], "request": ["GET /images/hm_brdr.gif HTTP/1.0"], "status": [200], "size": [235]} +{"@timestamp": 893966410, "clientip":["12.0.0.0"], "request": ["GET /english/images/nav_news_off.gif HTTP/1.0"], "status": [200], "size": [853]} +{"@timestamp": 893966410, "clientip":["15.0.0.0"], "request": ["GET /english/playing/images/trivia/04luck.gif HTTP/1.0"], "status": [200], "size": [744]} +{"@timestamp": 893966410, "clientip":["23.0.0.0"], "request": ["GET /images/home_intro.anim.gif HTTP/1.0"], "status": [200], "size": [60349]} +{"@timestamp": 893966410, "clientip":["2.0.0.0"], "request": ["GET /english/ProScroll.class HTTP/1.0"], "status": [200], "size": [6507]} +{"@timestamp": 893966410, "clientip":["5.0.0.0"], "request": ["GET /images/bord_stories01.gif HTTP/1.1"], "status": [200], "size": [333]} +{"@timestamp": 893966410, "clientip":["12.0.0.0"], "request": ["GET /english/images/nav_venue_off.gif HTTP/1.0"], "status": [200], "size": [870]} +{"@timestamp": 893966411, "clientip":["30.0.0.0"], "request": ["GET /english/playing/download/download.html HTTP/1.0"], "status": [200], "size": [13898]} +{"@timestamp": 893966411, "clientip":["2.0.0.0"], "request": ["GET /english/images/nav_hosts_off.gif HTTP/1.0"], "status": [200], "size": [914]} +{"@timestamp": 893966411, "clientip":["16.0.0.0"], "request": ["GET /images/s102373.gif HTTP/1.0"], "status": [200], "size": [142]} +{"@timestamp": 893966411, "clientip":["3.0.0.0"], "request": ["GET /images/hm_day_e.gif HTTP/1.0"], "status": [200], "size": [499]} +{"@timestamp": 893966411, "clientip":["3.0.0.0"], "request": ["GET /images/hm_nbg.jpg HTTP/1.0"], "status": [200], "size": [33665]} +{"@timestamp": 893966411, "clientip":["12.0.0.0"], "request": ["GET /english/images/nav_tickets_off.gif HTTP/1.0"], "status": [200], "size": [937]} +{"@timestamp": 893966411, "clientip":["3.0.0.0"], "request": ["GET /images/space.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966411, "clientip":["3.0.0.0"], "request": ["GET /english/images/hm_official.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966411, "clientip":["5.0.0.0"], "request": ["GET /images/bord_stories.gif HTTP/1.1"], "status": [200], "size": [520]} +{"@timestamp": 893966411, "clientip":["3.0.0.0"], "request": ["GET /images/space.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966411, "clientip":["31.0.0.0"], "request": ["GET /english/images/nav_store_off.gif HTTP/1.1"], "status": [200], "size": [934]} +{"@timestamp": 893966411, "clientip":["15.0.0.0"], "request": ["GET /english/playing/images/trivia/03score.gif HTTP/1.0"], "status": [200], "size": [572]} +{"@timestamp": 893966411, "clientip":["3.0.0.0"], "request": ["GET /english/images/nav_store_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966411, "clientip":["31.0.0.0"], "request": ["GET /english/images/nav_hosts_off.gif HTTP/1.1"], "status": [200], "size": [914]} +{"@timestamp": 893966411, "clientip":["32.0.0.0"], "request": ["GET /images/home_intro.anim.gif HTTP/1.1"], "status": [200], "size": [60349]} +{"@timestamp": 893966412, "clientip":["12.0.0.0"], "request": ["GET /english/images/nav_sitemap_off.gif HTTP/1.0"], "status": [200], "size": [416]} +{"@timestamp": 893966412, "clientip":["12.0.0.0"], "request": ["GET /images/hm_linkf.gif HTTP/1.0"], "status": [200], "size": [123]} +{"@timestamp": 893966412, "clientip":["12.0.0.0"], "request": ["GET /english/images/nav_history_off.gif HTTP/1.0"], "status": [200], "size": [914]} +{"@timestamp": 893966412, "clientip":["12.0.0.0"], "request": ["GET /images/hm_arw.gif HTTP/1.0"], "status": [200], "size": [1050]} +{"@timestamp": 893966412, "clientip":["12.0.0.0"], "request": ["GET /english/images/nav_hosts_off.gif HTTP/1.0"], "status": [200], "size": [914]} +{"@timestamp": 893966412, "clientip":["15.0.0.0"], "request": ["GET /english/playing/images/trivia/submit.gif HTTP/1.0"], "status": [200], "size": [1808]} +{"@timestamp": 893966412, "clientip":["17.0.0.0"], "request": ["GET /english/history/past_cups/images/past_header.gif HTTP/1.0"], "status": [200], "size": [1989]} +{"@timestamp": 893966412, "clientip":["12.0.0.0"], "request": ["GET /english/images/nav_store_off.gif HTTP/1.0"], "status": [200], "size": [934]} +{"@timestamp": 893966412, "clientip":["23.0.0.0"], "request": ["GET /english/index.html HTTP/1.0"], "status": [200], "size": [892]} +{"@timestamp": 893966412, "clientip":["12.0.0.0"], "request": ["GET /images/dot.gif HTTP/1.0"], "status": [200], "size": [43]} +{"@timestamp": 893966412, "clientip":["5.0.0.0"], "request": ["GET /french/images/lateb_new.gif HTTP/1.1"], "status": [200], "size": [1285]} +{"@timestamp": 893966412, "clientip":["19.0.0.0"], "request": ["GET /english/images/nav_field_off.gif HTTP/1.0"], "status": [200], "size": [1005]} +{"@timestamp": 893966412, "clientip":["25.0.0.0"], "request": ["GET /images/home_eng_phrase.gif HTTP/1.1"], "status": [200], "size": [2861]} +{"@timestamp": 893966412, "clientip":["19.0.0.0"], "request": ["GET /english/images/nav_venue_off.gif HTTP/1.0"], "status": [200], "size": [870]} +{"@timestamp": 893966412, "clientip":["23.0.0.0"], "request": ["GET /english/nav_top_inet.html HTTP/1.0"], "status": [200], "size": [374]} +{"@timestamp": 893966412, "clientip":["23.0.0.0"], "request": ["GET /english/nav_inet.html HTTP/1.0"], "status": [200], "size": [2672]} +{"@timestamp": 893966412, "clientip":["33.0.0.0"], "request": ["GET /images/home_fr_button.gif HTTP/1.1"], "status": [200], "size": [2140]} +{"@timestamp": 893966413, "clientip":["25.0.0.0"], "request": ["GET /images/home_fr_button.gif HTTP/1.1"], "status": [200], "size": [2140]} +{"@timestamp": 893966413, "clientip":["23.0.0.0"], "request": ["GET /images/nav_bg_bottom.jpg HTTP/1.0"], "status": [200], "size": [8389]} +{"@timestamp": 893966413, "clientip":["17.0.0.0"], "request": ["GET /english/history/images/thecup.GIF HTTP/1.0"], "status": [200], "size": [1293]} +{"@timestamp": 893966413, "clientip":["17.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_34_off.gif HTTP/1.0"], "status": [200], "size": [397]} +{"@timestamp": 893966413, "clientip":["23.0.0.0"], "request": ["GET /english/images/nav_team_off.gif HTTP/1.0"], "status": [200], "size": [776]} +{"@timestamp": 893966413, "clientip":["12.0.0.0"], "request": ["GET /english/images/nav_home_off.gif HTTP/1.0"], "status": [200], "size": [828]} +{"@timestamp": 893966413, "clientip":["16.0.0.0"], "request": ["GET /images/s102338.gif HTTP/1.0"], "status": [200], "size": [138]} +{"@timestamp": 893966413, "clientip":["17.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_38_off.gif HTTP/1.0"], "status": [200], "size": [436]} +{"@timestamp": 893966413, "clientip":["3.0.0.0"], "request": ["GET /english/images/nav_sitemap_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966413, "clientip":["23.0.0.0"], "request": ["GET /english/images/nav_comp_off.gif HTTP/1.0"], "status": [200], "size": [994]} +{"@timestamp": 893966413, "clientip":["20.0.0.0"], "request": ["GET /images/11103.gif HTTP/1.0"], "status": [200], "size": [513]} +{"@timestamp": 893966413, "clientip":["3.0.0.0"], "request": ["GET /english/images/nav_field_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966413, "clientip":["23.0.0.0"], "request": ["GET /english/ProScroll.class HTTP/1.0"], "status": [200], "size": [6507]} +{"@timestamp": 893966413, "clientip":["3.0.0.0"], "request": ["GET /english/images/nav_hosts_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966413, "clientip":["23.0.0.0"], "request": ["GET /english/images/nav_store_off.gif HTTP/1.0"], "status": [200], "size": [934]} +{"@timestamp": 893966413, "clientip":["3.0.0.0"], "request": ["GET /english/ProScroll.class HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966413, "clientip":["34.0.0.0"], "request": ["GET /english/playing/body.html HTTP/1.0"], "status": [200], "size": [5033]} +{"@timestamp": 893966413, "clientip":["19.0.0.0"], "request": ["GET /english/images/nav_hosts_off.gif HTTP/1.0"], "status": [200], "size": [914]} +{"@timestamp": 893966413, "clientip":["3.0.0.0"], "request": ["GET /images/hm_brdl.gif HTTP/1.0"], "status": [200], "size": [208]} +{"@timestamp": 893966414, "clientip":["35.0.0.0"], "request": ["GET / HTTP/1.0"], "status": [200], "size": [8712]} +{"@timestamp": 893966414, "clientip":["36.0.0.0"], "request": ["GET /english/frntpage.htm HTTP/1.0"], "status": [200], "size": [12800]} +{"@timestamp": 893966414, "clientip":["23.0.0.0"], "request": ["GET /english/images/nav_venue_off.gif HTTP/1.0"], "status": [200], "size": [870]} +{"@timestamp": 893966414, "clientip":["23.0.0.0"], "request": ["GET /images/space.gif HTTP/1.0"], "status": [200], "size": [42]} +{"@timestamp": 893966414, "clientip":["23.0.0.0"], "request": ["GET /english/images/nav_sitemap_off.gif HTTP/1.0"], "status": [200], "size": [416]} +{"@timestamp": 893966414, "clientip":["20.0.0.0"], "request": ["GET /images/marseille.gif HTTP/1.0"], "status": [200], "size": [722]} +{"@timestamp": 893966414, "clientip":["5.0.0.0"], "request": ["GET /images/ligne4_latebreak.gif HTTP/1.1"], "status": [200], "size": [1056]} +{"@timestamp": 893966414, "clientip":["23.0.0.0"], "request": ["GET /images/hm_linkf.gif HTTP/1.0"], "status": [200], "size": [123]} +{"@timestamp": 893966414, "clientip":["23.0.0.0"], "request": ["GET /english/images/nav_field_off.gif HTTP/1.0"], "status": [200], "size": [1005]} +{"@timestamp": 893966414, "clientip":["23.0.0.0"], "request": ["GET /english/images/nav_tickets_off.gif HTTP/1.0"], "status": [200], "size": [937]} +{"@timestamp": 893966414, "clientip":["23.0.0.0"], "request": ["GET /english/images/nav_history_off.gif HTTP/1.0"], "status": [200], "size": [914]} +{"@timestamp": 893966414, "clientip":["24.0.0.0"], "request": ["GET /cgi-bin/trivia/Trivia.pl?ENG HTTP/1.0"], "status": [200], "size": [6228]} +{"@timestamp": 893966414, "clientip":["5.0.0.0"], "request": ["GET /images/ligneb01.gif HTTP/1.1"], "status": [200], "size": [169]} +{"@timestamp": 893966414, "clientip":["12.0.0.0"], "request": ["GET /english/tickets/body.html HTTP/1.0"], "status": [200], "size": [2925]} +{"@timestamp": 893966414, "clientip":["23.0.0.0"], "request": ["GET /english/images/nav_hosts_off.gif HTTP/1.0"], "status": [200], "size": [914]} +{"@timestamp": 893966414, "clientip":["17.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_50_on.gif HTTP/1.0"], "status": [200], "size": [455]} +{"@timestamp": 893966414, "clientip":["23.0.0.0"], "request": ["GET /images/hm_anime_e.gif HTTP/1.0"], "status": [200], "size": [15609]} +{"@timestamp": 893966414, "clientip":["3.0.0.0"], "request": ["GET /english/images/nav_history_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966414, "clientip":["37.0.0.0"], "request": ["GET /french/competition/schedule.htm HTTP/1.0"], "status": [200], "size": [49256]} +{"@timestamp": 893966414, "clientip":["3.0.0.0"], "request": ["GET /images/hm_brdr.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966414, "clientip":["26.0.0.0"], "request": ["GET /english/images/nav_history_off.gif HTTP/1.0"], "status": [200], "size": [914]} +{"@timestamp": 893966414, "clientip":["232.41.0.0"], "request": ["GET / HTTP/1.0"], "status": [200], "size": [8749]} +{"@timestamp": 893966415, "clientip":["232.41.0.0"], "request": ["GET /images/home_tool.gif HTTP/1.0"], "status": [200], "size": [327]} +{"@timestamp": 893966415, "clientip":["19.0.0.0"], "request": ["GET /english/images/nav_home_off.gif HTTP/1.0"], "status": [200], "size": [828]} +{"@timestamp": 893966415, "clientip":["17.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_58_off.gif HTTP/1.0"], "status": [200], "size": [397]} +{"@timestamp": 893966415, "clientip":["12.0.0.0"], "request": ["GET /english/tickets/images/ticket_hm_bg.jpg HTTP/1.0"], "status": [200], "size": [20929]} +{"@timestamp": 893966415, "clientip":["12.0.0.0"], "request": ["GET /english/tickets/images/ticket_hm_header.gif HTTP/1.0"], "status": [200], "size": [1226]} +{"@timestamp": 893966415, "clientip":["12.0.0.0"], "request": ["GET /english/tickets/images/ticket_hm_nav.gif HTTP/1.0"], "status": [200], "size": [11253]} +{"@timestamp": 893966415, "clientip":["12.0.0.0"], "request": ["GET /images/arw_red_lk.gif HTTP/1.0"], "status": [200], "size": [1068]} +{"@timestamp": 893966415, "clientip":["23.0.0.0"], "request": ["GET /english/images/nav_home_off.gif HTTP/1.0"], "status": [200], "size": [828]} +{"@timestamp": 893966415, "clientip":["23.0.0.0"], "request": ["GET /english/images/nav_logo_sponsors.gif HTTP/1.0"], "status": [200], "size": [1991]} +{"@timestamp": 893966415, "clientip":["21.0.0.0"], "request": ["GET /english/images/news_hm_header.gif HTTP/1.1"], "status": [200], "size": [527]} +{"@timestamp": 893966415, "clientip":["21.0.0.0"], "request": ["GET /images/bg_generic.jpg HTTP/1.1"], "status": [200], "size": [21127]} +{"@timestamp": 893966415, "clientip":["38.0.0.0"], "request": ["GET /english/teams/teamgroup.htm HTTP/1.0"], "status": [200], "size": [11971]} +{"@timestamp": 893966415, "clientip":["21.0.0.0"], "request": ["GET /english/images/space.gif HTTP/1.1"], "status": [200], "size": [42]} +{"@timestamp": 893966415, "clientip":["23.0.0.0"], "request": ["GET /images/info.gif HTTP/1.0"], "status": [200], "size": [1251]} +{"@timestamp": 893966415, "clientip":["34.0.0.0"], "request": ["GET /english/playing/images/play_hm_bg_opt1.jpg HTTP/1.0"], "status": [200], "size": [44502]} +{"@timestamp": 893966415, "clientip":["5.0.0.0"], "request": ["GET /images/ligne.gif HTTP/1.1"], "status": [200], "size": [169]} +{"@timestamp": 893966415, "clientip":["3.0.0.0"], "request": ["GET /english/images/nav_logo_sponsors.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966415, "clientip":["12.0.0.0"], "request": ["GET /images/arw_lk.gif HTTP/1.0"], "status": [200], "size": [669]} +{"@timestamp": 893966415, "clientip":["19.0.0.0"], "request": ["GET /english/images/nav_history_off.gif HTTP/1.0"], "status": [200], "size": [914]} +{"@timestamp": 893966415, "clientip":["35.0.0.0"], "request": ["GET /images/home_bg_stars.gif HTTP/1.0"], "status": [200], "size": [2557]} +{"@timestamp": 893966416, "clientip":["23.0.0.0"], "request": ["GET /images/hm_brdl.gif HTTP/1.0"], "status": [200], "size": [208]} +{"@timestamp": 893966416, "clientip":["5.0.0.0"], "request": ["GET /french/images/news_btn_kits_off.gif HTTP/1.1"], "status": [200], "size": [965]} +{"@timestamp": 893966416, "clientip":["23.0.0.0"], "request": ["GET /images/space.gif HTTP/1.0"], "status": [200], "size": [42]} +{"@timestamp": 893966416, "clientip":["23.0.0.0"], "request": ["GET /english/images/hm_official.gif HTTP/1.0"], "status": [200], "size": [1807]} +{"@timestamp": 893966416, "clientip":["23.0.0.0"], "request": ["GET /images/hm_arw.gif HTTP/1.0"], "status": [200], "size": [1050]} +{"@timestamp": 893966416, "clientip":["19.0.0.0"], "request": ["GET /english/images/nav_sitemap_off.gif HTTP/1.0"], "status": [200], "size": [416]} +{"@timestamp": 893966416, "clientip":["17.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_62_off.gif HTTP/1.0"], "status": [200], "size": [437]} +{"@timestamp": 893966416, "clientip":["23.0.0.0"], "request": ["GET /images/hm_day_e.gif HTTP/1.0"], "status": [200], "size": [499]} +{"@timestamp": 893966416, "clientip":["17.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_66_off.gif HTTP/1.0"], "status": [200], "size": [435]} +{"@timestamp": 893966416, "clientip":["17.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_70_off.gif HTTP/1.0"], "status": [200], "size": [409]} +{"@timestamp": 893966416, "clientip":["39.0.0.0"], "request": ["GET /english/history/images/history_hm_header.gif HTTP/1.1"], "status": [200], "size": [688]} +{"@timestamp": 893966416, "clientip":["39.0.0.0"], "request": ["GET /english/history/images/history_hm_posters.jpg HTTP/1.1"], "status": [200], "size": [33296]} +{"@timestamp": 893966416, "clientip":["201.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966417, "clientip":["25.0.0.0"], "request": ["GET /images/home_eng_button.gif HTTP/1.1"], "status": [200], "size": [1927]} +{"@timestamp": 893966417, "clientip":["23.0.0.0"], "request": ["GET /images/dot.gif HTTP/1.0"], "status": [200], "size": [43]} +{"@timestamp": 893966417, "clientip":["17.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_74_off.gif HTTP/1.0"], "status": [200], "size": [423]} +{"@timestamp": 893966417, "clientip":["1.0.0.0"], "request": ["GET /english/index.html HTTP/1.0"], "status": [200], "size": [892]} +{"@timestamp": 893966417, "clientip":["5.0.0.0"], "request": ["GET /images/ligneb.gif HTTP/1.1"], "status": [200], "size": [169]} +{"@timestamp": 893966417, "clientip":["35.0.0.0"], "request": ["GET /images/home_eng_phrase.gif HTTP/1.0"], "status": [200], "size": [2861]} +{"@timestamp": 893966417, "clientip":["35.0.0.0"], "request": ["GET /images/home_fr_button.gif HTTP/1.0"], "status": [200], "size": [2140]} +{"@timestamp": 893966417, "clientip":["35.0.0.0"], "request": ["GET /images/home_tool.gif HTTP/1.0"], "status": [200], "size": [327]} +{"@timestamp": 893966417, "clientip":["35.0.0.0"], "request": ["GET /images/home_sponsor.gif HTTP/1.0"], "status": [200], "size": [2491]} +{"@timestamp": 893966417, "clientip":["35.0.0.0"], "request": ["GET /images/home_eng_button.gif HTTP/1.0"], "status": [200], "size": [1927]} +{"@timestamp": 893966417, "clientip":["17.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_78_off.gif HTTP/1.0"], "status": [200], "size": [427]} +{"@timestamp": 893966417, "clientip":["16.0.0.0"], "request": ["GET /english/images/team_group_header_d.gif HTTP/1.0"], "status": [200], "size": [646]} +{"@timestamp": 893966418, "clientip":["17.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_82_off.gif HTTP/1.0"], "status": [200], "size": [433]} +{"@timestamp": 893966418, "clientip":["40.0.0.0"], "request": ["GET /english/history/past_cups/italy34.html HTTP/1.1"], "status": [200], "size": [13022]} +{"@timestamp": 893966418, "clientip":["17.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_86_off.gif HTTP/1.0"], "status": [200], "size": [409]} +{"@timestamp": 893966418, "clientip":["19.0.0.0"], "request": ["GET /english/images/nav_store_off.gif HTTP/1.0"], "status": [200], "size": [934]} +{"@timestamp": 893966418, "clientip":["1.0.0.0"], "request": ["GET /english/index.html HTTP/1.0"], "status": [200], "size": [892]} +{"@timestamp": 893966418, "clientip":["37.0.0.0"], "request": ["GET /french/images/space.gif HTTP/1.0"], "status": [200], "size": [42]} +{"@timestamp": 893966418, "clientip":["19.0.0.0"], "request": ["GET /english/images/nav_tickets_off.gif HTTP/1.0"], "status": [200], "size": [937]} +{"@timestamp": 893966418, "clientip":["19.0.0.0"], "request": ["GET /english/images/nav_logo_sponsors.gif HTTP/1.0"], "status": [200], "size": [1991]} +{"@timestamp": 893966418, "clientip":["8.0.0.0"], "request": ["GET /english/images/comp_bu_groupsn_on.gif HTTP/1.0"], "status": [200], "size": [963]} +{"@timestamp": 893966418, "clientip":["22.0.0.0"], "request": ["GET /english/images/team_bu_detail2.gif HTTP/1.0"], "status": [200], "size": [1438]} +{"@timestamp": 893966418, "clientip":["17.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_90_off.gif HTTP/1.0"], "status": [200], "size": [429]} +{"@timestamp": 893966418, "clientip":["38.0.0.0"], "request": ["GET /english/images/teams_bu_group_on.gif HTTP/1.0"], "status": [200], "size": [668]} +{"@timestamp": 893966419, "clientip":["20.0.0.0"], "request": ["GET /images/nantes.gif HTTP/1.0"], "status": [200], "size": [677]} +{"@timestamp": 893966419, "clientip":["16.0.0.0"], "request": ["GET /images/s102326.gif HTTP/1.0"], "status": [200], "size": [248]} +{"@timestamp": 893966419, "clientip":["17.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_94_off.gif HTTP/1.0"], "status": [200], "size": [432]} +{"@timestamp": 893966419, "clientip":["1.0.0.0"], "request": ["GET /english/nav_top_inet.html HTTP/1.0"], "status": [200], "size": [374]} +{"@timestamp": 893966419, "clientip":["17.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bracket_top.gif HTTP/1.0"], "status": [200], "size": [289]} +{"@timestamp": 893966419, "clientip":["20.0.0.0"], "request": ["GET /images/saintetienne.gif HTTP/1.0"], "status": [200], "size": [761]} +{"@timestamp": 893966419, "clientip":["20.0.0.0"], "request": ["GET /images/11287.jpg HTTP/1.0"], "status": [200], "size": [6431]} +{"@timestamp": 893966420, "clientip":["17.0.0.0"], "request": ["GET /english/history/past_cups/images/posters/brasil50.gif HTTP/1.0"], "status": [200], "size": [5003]} +{"@timestamp": 893966420, "clientip":["20.0.0.0"], "request": ["GET /images/lens.gif HTTP/1.0"], "status": [200], "size": [582]} +{"@timestamp": 893966420, "clientip":["17.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bracket_bot.gif HTTP/1.0"], "status": [200], "size": [631]} +{"@timestamp": 893966420, "clientip":["17.0.0.0"], "request": ["GET /english/history/past_cups/images/past_trophy.gif HTTP/1.0"], "status": [200], "size": [800]} +{"@timestamp": 893966420, "clientip":["41.0.0.0"], "request": ["GET /images/col.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966421, "clientip":["17.0.0.0"], "request": ["GET /english/history/past_cups/images/50-1.jpg HTTP/1.0"], "status": [200], "size": [15314]} +{"@timestamp": 893966421, "clientip":["1.0.0.0"], "request": ["GET /images/hm_nbg.jpg HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966421, "clientip":["40.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_30_off.gif HTTP/1.1"], "status": [200], "size": [406]} +{"@timestamp": 893966421, "clientip":["40.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_34_on.gif HTTP/1.1"], "status": [200], "size": [474]} +{"@timestamp": 893966421, "clientip":["16.0.0.0"], "request": ["GET /images/s102477.gif HTTP/1.0"], "status": [200], "size": [214]} +{"@timestamp": 893966421, "clientip":["26.0.0.0"], "request": ["GET /english/images/nav_hosts_off.gif HTTP/1.0"], "status": [200], "size": [914]} +{"@timestamp": 893966421, "clientip":["26.0.0.0"], "request": ["GET /english/images/nav_store_off.gif HTTP/1.0"], "status": [200], "size": [934]} +{"@timestamp": 893966421, "clientip":["8.0.0.0"], "request": ["GET /english/teams/teamgroup.htm HTTP/1.0"], "status": [200], "size": [11971]} +{"@timestamp": 893966421, "clientip":["38.0.0.0"], "request": ["GET /images/s102325.gif HTTP/1.0"], "status": [200], "size": [187]} +{"@timestamp": 893966422, "clientip":["15.0.0.0"], "request": ["GET /english/playing/links.html HTTP/1.0"], "status": [200], "size": [18694]} +{"@timestamp": 893966422, "clientip":["40.0.0.0"], "request": ["GET /english/history/past_cups/images/34-1.jpg HTTP/1.1"], "status": [200], "size": [14275]} +{"@timestamp": 893966422, "clientip":["8.0.0.0"], "request": ["GET /images/teams_hm_bg.jpg HTTP/1.0"], "status": [200], "size": [18794]} +{"@timestamp": 893966422, "clientip":["42.0.0.0"], "request": ["GET /english/frntpage.htm HTTP/1.0"], "status": [200], "size": [12800]} +{"@timestamp": 893966422, "clientip":["25.0.0.0"], "request": ["GET /images/home_sponsor.gif HTTP/1.1"], "status": [200], "size": [2491]} +{"@timestamp": 893966422, "clientip":["8.0.0.0"], "request": ["GET /english/images/team_group_header_a.gif HTTP/1.0"], "status": [200], "size": [639]} +{"@timestamp": 893966422, "clientip":["8.0.0.0"], "request": ["GET /english/images/teams_bu_group_on.gif HTTP/1.0"], "status": [200], "size": [668]} +{"@timestamp": 893966422, "clientip":["8.0.0.0"], "request": ["GET /english/images/teams_bu_confed_off.gif HTTP/1.0"], "status": [200], "size": [1105]} +{"@timestamp": 893966422, "clientip":["43.0.0.0"], "request": ["GET /english/individuals/player111722.htm HTTP/1.0"], "status": [200], "size": [6523]} +{"@timestamp": 893966423, "clientip":["20.0.0.0"], "request": ["GET /images/montpellier.gif HTTP/1.0"], "status": [200], "size": [728]} +{"@timestamp": 893966423, "clientip":["12.0.0.0"], "request": ["GET /english/tickets/out_france.html HTTP/1.0"], "status": [200], "size": [6143]} +{"@timestamp": 893966423, "clientip":["20.0.0.0"], "request": ["GET /images/11105.gif HTTP/1.0"], "status": [200], "size": [114]} +{"@timestamp": 893966423, "clientip":["12.0.0.0"], "request": ["GET /english/tickets/images/ticket_quest_bg2.jpg HTTP/1.0"], "status": [200], "size": [11324]} +{"@timestamp": 893966423, "clientip":["12.0.0.0"], "request": ["GET /english/tickets/images/ticket_header.gif HTTP/1.0"], "status": [200], "size": [453]} +{"@timestamp": 893966423, "clientip":["12.0.0.0"], "request": ["GET /english/tickets/images/hm_f98_top.gif HTTP/1.0"], "status": [200], "size": [1647]} +{"@timestamp": 893966423, "clientip":["21.0.0.0"], "request": ["GET /english/images/news_bu_press_off.gif HTTP/1.1"], "status": [200], "size": [847]} +{"@timestamp": 893966423, "clientip":["44.0.0.0"], "request": ["GET /english/teams/teambio169.htm HTTP/1.1"], "status": [200], "size": [11157]} +{"@timestamp": 893966423, "clientip":["38.0.0.0"], "request": ["GET /images/s102327.gif HTTP/1.0"], "status": [200], "size": [97]} +{"@timestamp": 893966423, "clientip":["21.0.0.0"], "request": ["GET /english/images/news_bu_letter_off.gif HTTP/1.1"], "status": [200], "size": [940]} +{"@timestamp": 893966423, "clientip":["45.0.0.0"], "request": ["GET /english/frntpage.htm HTTP/1.1"], "status": [200], "size": [12800]} +{"@timestamp": 893966423, "clientip":["32.0.0.0"], "request": ["GET /english/nav_inet.html HTTP/1.1"], "status": [200], "size": [2672]} +{"@timestamp": 893966423, "clientip":["15.0.0.0"], "request": ["GET /english/playing/images/backg.gif HTTP/1.0"], "status": [200], "size": [1462]} +{"@timestamp": 893966423, "clientip":["15.0.0.0"], "request": ["GET /english/playing/images/play_header.gif HTTP/1.0"], "status": [200], "size": [2262]} +{"@timestamp": 893966423, "clientip":["20.0.0.0"], "request": ["GET /images/paris_off.gif HTTP/1.0"], "status": [200], "size": [658]} +{"@timestamp": 893966423, "clientip":["8.0.0.0"], "request": ["GET /images/teams_hm_bracket.gif HTTP/1.0"], "status": [200], "size": [655]} +{"@timestamp": 893966424, "clientip":["8.0.0.0"], "request": ["GET /english/images/team_group_header_c.gif HTTP/1.0"], "status": [200], "size": [670]} +{"@timestamp": 893966424, "clientip":["29.0.0.0"], "request": ["GET /images/32t49811.jpg HTTP/1.0"], "status": [200], "size": [4753]} +{"@timestamp": 893966424, "clientip":["37.0.0.0"], "request": ["GET /images/cal-lens.gif HTTP/1.0"], "status": [200], "size": [284]} +{"@timestamp": 893966424, "clientip":["40.0.0.0"], "request": ["GET /english/history/past_cups/images/posters/italy34.gif HTTP/1.1"], "status": [200], "size": [4474]} +{"@timestamp": 893966424, "clientip":["12.0.0.0"], "request": ["GET /english/tickets/images/ticket_bu_quest2.gif HTTP/1.0"], "status": [200], "size": [1201]} +{"@timestamp": 893966424, "clientip":["38.0.0.0"], "request": ["GET /images/s102424.gif HTTP/1.0"], "status": [200], "size": [164]} +{"@timestamp": 893966424, "clientip":["20.0.0.0"], "request": ["GET /images/11102.gif HTTP/1.0"], "status": [200], "size": [417]} +{"@timestamp": 893966424, "clientip":["15.0.0.0"], "request": ["GET /english/playing/images/france98b.GIF HTTP/1.0"], "status": [200], "size": [597]} +{"@timestamp": 893966424, "clientip":["39.0.0.0"], "request": ["GET /english/history/images/france98b.GIF HTTP/1.1"], "status": [200], "size": [915]} +{"@timestamp": 893966424, "clientip":["39.0.0.0"], "request": ["GET /english/history/images/football.GIF HTTP/1.1"], "status": [200], "size": [1170]} +{"@timestamp": 893966424, "clientip":["46.0.0.0"], "request": ["GET /english/venues/venues/saint-denis.html HTTP/1.0"], "status": [200], "size": [22760]} +{"@timestamp": 893966425, "clientip":["12.0.0.0"], "request": ["GET /english/tickets/images/ticket_bu_abroad2_on.gif HTTP/1.0"], "status": [200], "size": [2020]} +{"@timestamp": 893966425, "clientip":["47.0.0.0"], "request": ["GET / HTTP/1.0"], "status": [200], "size": [8712]} +{"@timestamp": 893966425, "clientip":["12.0.0.0"], "request": ["GET /english/tickets/images/ticket_abroad_header.gif HTTP/1.0"], "status": [200], "size": [3606]} +{"@timestamp": 893966425, "clientip":["15.0.0.0"], "request": ["GET /english/playing/images/mascots.GIF HTTP/1.0"], "status": [200], "size": [1275]} +{"@timestamp": 893966425, "clientip":["44.0.0.0"], "request": ["GET /images/10512.jpg HTTP/1.1"], "status": [200], "size": [17227]} +{"@timestamp": 893966425, "clientip":["44.0.0.0"], "request": ["GET /images/32t49809.jpg HTTP/1.1"], "status": [200], "size": [5623]} +{"@timestamp": 893966425, "clientip":["32.0.0.0"], "request": ["GET /images/nav_bg_bottom.jpg HTTP/1.1"], "status": [200], "size": [8389]} +{"@timestamp": 893966425, "clientip":["12.0.0.0"], "request": ["GET /english/tickets/images/ticket_bu_infrance2.gif HTTP/1.0"], "status": [200], "size": [1134]} +{"@timestamp": 893966425, "clientip":["43.0.0.0"], "request": ["GET /images/32p49815.jpg HTTP/1.0"], "status": [200], "size": [11735]} +{"@timestamp": 893966425, "clientip":["43.0.0.0"], "request": ["GET /english/images/team_bu_detail_off.gif HTTP/1.0"], "status": [200], "size": [918]} +{"@timestamp": 893966425, "clientip":["44.0.0.0"], "request": ["GET /images/esp.gif HTTP/1.1"], "status": [200], "size": [1892]} +{"@timestamp": 893966425, "clientip":["38.0.0.0"], "request": ["GET /english/images/team_group_header_a.gif HTTP/1.0"], "status": [200], "size": [639]} +{"@timestamp": 893966425, "clientip":["48.0.0.0"], "request": ["GET /english/help/site.html HTTP/1.0"], "status": [200], "size": [7697]} +{"@timestamp": 893966425, "clientip":["15.0.0.0"], "request": ["GET /english/playing/images/downloads.GIF HTTP/1.0"], "status": [200], "size": [1294]} +{"@timestamp": 893966426, "clientip":["37.0.0.0"], "request": ["GET /french/images/comp_bu_stage1n.gif HTTP/1.0"], "status": [200], "size": [1547]} +{"@timestamp": 893966426, "clientip":["25.0.0.0"], "request": ["GET /french/index.html HTTP/1.1"], "status": [200], "size": [954]} +{"@timestamp": 893966426, "clientip":["21.0.0.0"], "request": ["GET /english/images/news_bu_kits_off.gif HTTP/1.1"], "status": [200], "size": [1027]} +{"@timestamp": 893966426, "clientip":["15.0.0.0"], "request": ["GET /english/playing/images/links_on.GIF HTTP/1.0"], "status": [200], "size": [1393]} +{"@timestamp": 893966426, "clientip":["15.0.0.0"], "request": ["GET /english/playing/images/trivia.GIF HTTP/1.0"], "status": [200], "size": [999]} +{"@timestamp": 893966426, "clientip":["0.0.0.0"], "request": ["GET /english/index.html HTTP/1.0"], "status": [200], "size": [892]} +{"@timestamp": 893966426, "clientip":["32.0.0.0"], "request": ["GET /english/nav_top_inet.html HTTP/1.1"], "status": [200], "size": [374]} +{"@timestamp": 893966427, "clientip":["46.0.0.0"], "request": ["GET /english/venues/cities/images/denis/venue_denn_bg.jpg HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966427, "clientip":["8.0.0.0"], "request": ["GET /english/images/team_hm_header_shad.gif HTTP/1.0"], "status": [200], "size": [1379]} +{"@timestamp": 893966427, "clientip":["46.0.0.0"], "request": ["GET /images/11295.jpg HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966427, "clientip":["46.0.0.0"], "request": ["GET /images/11294.jpg HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966427, "clientip":["8.0.0.0"], "request": ["GET /english/images/team_group_header_b.gif HTTP/1.0"], "status": [200], "size": [665]} +{"@timestamp": 893966427, "clientip":["38.0.0.0"], "request": ["GET /images/s102330.gif HTTP/1.0"], "status": [200], "size": [259]} +{"@timestamp": 893966427, "clientip":["15.0.0.0"], "request": ["GET /english/playing/images/banner2.gif HTTP/1.0"], "status": [200], "size": [15328]} +{"@timestamp": 893966427, "clientip":["49.0.0.0"], "request": ["GET /english/news/2704nevi.htm HTTP/1.0"], "status": [200], "size": [3132]} +{"@timestamp": 893966427, "clientip":["38.0.0.0"], "request": ["GET /english/images/team_group_header_b.gif HTTP/1.0"], "status": [200], "size": [665]} +{"@timestamp": 893966427, "clientip":["15.0.0.0"], "request": ["GET /english/playing/images/fifa_logo_sm.gif HTTP/1.0"], "status": [200], "size": [2900]} +{"@timestamp": 893966427, "clientip":["39.0.0.0"], "request": ["GET /english/history/images/infrance.GIF HTTP/1.1"], "status": [200], "size": [990]} +{"@timestamp": 893966427, "clientip":["47.135.0.0"], "request": ["GET /french/news/3004bres.htm HTTP/1.0"], "status": [200], "size": [5933]} +{"@timestamp": 893966428, "clientip":["50.0.0.0"], "request": ["GET /english/playing/download/images/big.bird.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966428, "clientip":["8.0.0.0"], "request": ["GET /english/images/team_group_header_e.gif HTTP/1.0"], "status": [200], "size": [643]} +{"@timestamp": 893966429, "clientip":["41.0.0.0"], "request": ["GET /english/images/team_bu_detail_on.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966429, "clientip":["30.0.0.0"], "request": ["GET /english/playing/mascot/images/misc.gif HTTP/1.0"], "status": [200], "size": [2997]} +{"@timestamp": 893966429, "clientip":["8.0.0.0"], "request": ["GET /english/images/team_group_header_g.gif HTTP/1.0"], "status": [200], "size": [641]} +{"@timestamp": 893966429, "clientip":["38.0.0.0"], "request": ["GET /images/s102382.gif HTTP/1.0"], "status": [200], "size": [102]} +{"@timestamp": 893966429, "clientip":["12.0.0.0"], "request": ["GET /english/tickets/10484.htm HTTP/1.0"], "status": [200], "size": [16722]} +{"@timestamp": 893966429, "clientip":["8.0.0.0"], "request": ["GET /english/images/team_group_header_h.gif HTTP/1.0"], "status": [200], "size": [628]} +{"@timestamp": 893966429, "clientip":["12.0.0.0"], "request": ["GET /english/tickets/images/ticket_bu_abroad2.gif HTTP/1.0"], "status": [200], "size": [1486]} +{"@timestamp": 893966430, "clientip":["12.0.0.0"], "request": ["GET /images/11103.gif HTTP/1.0"], "status": [200], "size": [513]} +{"@timestamp": 893966430, "clientip":["8.0.0.0"], "request": ["GET /english/images/team_group_header_d.gif HTTP/1.0"], "status": [200], "size": [646]} +{"@timestamp": 893966430, "clientip":["5.0.0.0"], "request": ["GET /french/images/archives.gif HTTP/1.1"], "status": [200], "size": [569]} +{"@timestamp": 893966430, "clientip":["39.0.0.0"], "request": ["GET /english/history/images/reading.GIF HTTP/1.1"], "status": [200], "size": [1171]} +{"@timestamp": 893966430, "clientip":["32.0.0.0"], "request": ["GET /english/ProScroll.class HTTP/1.1"], "status": [200], "size": [6507]} +{"@timestamp": 893966430, "clientip":["8.0.0.0"], "request": ["GET /english/images/team_group_header_f.gif HTTP/1.0"], "status": [200], "size": [631]} +{"@timestamp": 893966430, "clientip":["26.0.0.0"], "request": ["GET /english/images/nav_sitemap_off.gif HTTP/1.0"], "status": [200], "size": [416]} +{"@timestamp": 893966430, "clientip":["47.135.0.0"], "request": ["GET /images/bord_g.gif HTTP/1.0"], "status": [200], "size": [231]} +{"@timestamp": 893966430, "clientip":["47.135.0.0"], "request": ["GET /images/bord_d.gif HTTP/1.0"], "status": [200], "size": [231]} +{"@timestamp": 893966431, "clientip":["12.0.0.0"], "request": ["GET /images/10982.gif HTTP/1.0"], "status": [200], "size": [183]} +{"@timestamp": 893966431, "clientip":["38.0.0.0"], "request": ["GET /images/s102373.gif HTTP/1.0"], "status": [200], "size": [142]} +{"@timestamp": 893966431, "clientip":["38.0.0.0"], "request": ["GET /images/s102328.gif HTTP/1.0"], "status": [200], "size": [236]} +{"@timestamp": 893966431, "clientip":["39.0.0.0"], "request": ["GET /english/history/past_cups/images/past_header.gif HTTP/1.1"], "status": [200], "size": [1989]} +{"@timestamp": 893966431, "clientip":["51.0.0.0"], "request": ["GET /english/teams/teambio160.htm HTTP/1.1"], "status": [200], "size": [11097]} +{"@timestamp": 893966431, "clientip":["38.0.0.0"], "request": ["GET /english/images/team_group_header_f.gif HTTP/1.0"], "status": [200], "size": [631]} +{"@timestamp": 893966431, "clientip":["52.0.0.0"], "request": ["GET /english/member/body.html HTTP/1.1"], "status": [200], "size": [5097]} +{"@timestamp": 893966432, "clientip":["10.0.0.0"], "request": ["GET /english/competition/stage2.htm HTTP/1.0"], "status": [200], "size": [16606]} +{"@timestamp": 893966432, "clientip":["0.0.0.0"], "request": ["GET /english/nav_top_inet.html HTTP/1.0"], "status": [200], "size": [374]} +{"@timestamp": 893966432, "clientip":["53.0.0.0"], "request": ["GET /english/competition/headtohead75.htm HTTP/1.1"], "status": [200], "size": [5152]} +{"@timestamp": 893966432, "clientip":["25.0.0.0"], "request": ["GET /french/nav_top_inet.html HTTP/1.1"], "status": [200], "size": [374]} +{"@timestamp": 893966432, "clientip":["0.0.0.0"], "request": ["GET /english/nav_inet.html HTTP/1.0"], "status": [200], "size": [2672]} +{"@timestamp": 893966432, "clientip":["0.0.0.0"], "request": ["GET /english/splash_inet.html HTTP/1.0"], "status": [200], "size": [3730]} +{"@timestamp": 893966432, "clientip":["39.0.0.0"], "request": ["GET /english/history/images/history_hm_header.gif HTTP/1.1"], "status": [200], "size": [688]} +{"@timestamp": 893966432, "clientip":["47.0.0.0"], "request": ["GET /english/index.html HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966432, "clientip":["37.0.0.0"], "request": ["GET /images/cal_nant.gif HTTP/1.0"], "status": [200], "size": [359]} +{"@timestamp": 893966432, "clientip":["37.0.0.0"], "request": ["GET /images/cal_stdenis.gif HTTP/1.0"], "status": [200], "size": [402]} +{"@timestamp": 893966432, "clientip":["41.0.0.0"], "request": ["GET /images/32t49807.jpg HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966433, "clientip":["32.0.0.0"], "request": ["GET /english/images/nav_news_off.gif HTTP/1.1"], "status": [200], "size": [853]} +{"@timestamp": 893966433, "clientip":["38.0.0.0"], "request": ["GET /images/s102320.gif HTTP/1.0"], "status": [200], "size": [259]} +{"@timestamp": 893966433, "clientip":["42.0.0.0"], "request": ["GET /images/backnews.gif HTTP/1.0"], "status": [200], "size": [4573]} +{"@timestamp": 893966433, "clientip":["38.0.0.0"], "request": ["GET /images/s102438.gif HTTP/1.0"], "status": [200], "size": [297]} +{"@timestamp": 893966433, "clientip":["54.0.0.0"], "request": ["GET /english/playing/download/images/big.bird.gif HTTP/1.0"], "status": [200], "size": [4870]} +{"@timestamp": 893966433, "clientip":["0.0.0.0"], "request": ["GET /english/images/nav_news_off.gif HTTP/1.0"], "status": [200], "size": [853]} +{"@timestamp": 893966433, "clientip":["38.0.0.0"], "request": ["GET /images/s102329.gif HTTP/1.0"], "status": [200], "size": [159]} +{"@timestamp": 893966433, "clientip":["10.0.0.0"], "request": ["GET /images/comp_stage2_brc_bot.gif HTTP/1.0"], "status": [200], "size": [160]} +{"@timestamp": 893966434, "clientip":["26.0.0.0"], "request": ["GET /english/images/nav_home_off.gif HTTP/1.0"], "status": [200], "size": [828]} +{"@timestamp": 893966434, "clientip":["0.0.0.0"], "request": ["GET /images/space.gif HTTP/1.0"], "status": [200], "size": [42]} +{"@timestamp": 893966434, "clientip":["41.0.0.0"], "request": ["GET /english/images/team_hm_header.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966434, "clientip":["32.0.0.0"], "request": ["GET /english/images/nav_team_off.gif HTTP/1.1"], "status": [200], "size": [776]} +{"@timestamp": 893966434, "clientip":["38.0.0.0"], "request": ["GET /english/images/team_group_header_c.gif HTTP/1.0"], "status": [200], "size": [670]} +{"@timestamp": 893966434, "clientip":["52.0.0.0"], "request": ["GET /english/member/images/submit.gif HTTP/1.1"], "status": [200], "size": [447]} +{"@timestamp": 893966434, "clientip":["12.0.0.0"], "request": ["GET /images/10981.gif HTTP/1.0"], "status": [200], "size": [173]} +{"@timestamp": 893966434, "clientip":["39.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_34_off.gif HTTP/1.1"], "status": [200], "size": [397]} +{"@timestamp": 893966434, "clientip":["38.0.0.0"], "request": ["GET /images/s102377.gif HTTP/1.0"], "status": [200], "size": [173]} +{"@timestamp": 893966434, "clientip":["12.0.0.0"], "request": ["GET /images/11116.gif HTTP/1.0"], "status": [200], "size": [667]} +{"@timestamp": 893966435, "clientip":["26.0.0.0"], "request": ["GET /english/images/nav_logo_sponsors.gif HTTP/1.0"], "status": [200], "size": [1991]} +{"@timestamp": 893966435, "clientip":["12.0.0.0"], "request": ["GET /images/11106.gif HTTP/1.0"], "status": [200], "size": [114]} +{"@timestamp": 893966435, "clientip":["12.0.0.0"], "request": ["GET /images/11105.gif HTTP/1.0"], "status": [200], "size": [114]} +{"@timestamp": 893966435, "clientip":["12.0.0.0"], "request": ["GET /images/11102.gif HTTP/1.0"], "status": [200], "size": [417]} +{"@timestamp": 893966435, "clientip":["39.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_38_off.gif HTTP/1.1"], "status": [200], "size": [436]} +{"@timestamp": 893966435, "clientip":["38.0.0.0"], "request": ["GET /english/images/team_group_header_h.gif HTTP/1.0"], "status": [200], "size": [628]} +{"@timestamp": 893966435, "clientip":["25.0.0.0"], "request": ["GET /images/nav_bg_top.gif HTTP/1.1"], "status": [200], "size": [929]} +{"@timestamp": 893966435, "clientip":["52.0.0.0"], "request": ["GET / HTTP/1.1"], "status": [200], "size": [8712]} +{"@timestamp": 893966435, "clientip":["12.0.0.0"], "request": ["GET /images/11101.gif HTTP/1.0"], "status": [200], "size": [415]} +{"@timestamp": 893966435, "clientip":["32.0.0.0"], "request": ["GET /english/images/nav_venue_off.gif HTTP/1.1"], "status": [200], "size": [870]} +{"@timestamp": 893966436, "clientip":["55.0.0.0"], "request": ["GET / HTTP/1.0"], "status": [200], "size": [8712]} +{"@timestamp": 893966436, "clientip":["56.0.0.0"], "request": ["GET /images/home_intro.anim.gif HTTP/1.0"], "status": [200], "size": [60349]} +{"@timestamp": 893966436, "clientip":["38.0.0.0"], "request": ["GET /images/s102443.gif HTTP/1.0"], "status": [200], "size": [165]} +{"@timestamp": 893966436, "clientip":["46.0.0.0"], "request": ["GET /images/paris.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966436, "clientip":["38.0.0.0"], "request": ["GET /images/s140875.gif HTTP/1.0"], "status": [200], "size": [184]} +{"@timestamp": 893966436, "clientip":["37.0.0.0"], "request": ["GET /images/cal_bord.gif HTTP/1.0"], "status": [200], "size": [416]} +{"@timestamp": 893966436, "clientip":["37.0.0.0"], "request": ["GET /images/cal_steti.gif HTTP/1.0"], "status": [200], "size": [1125]} +{"@timestamp": 893966436, "clientip":["37.0.0.0"], "request": ["GET /images/cal_mont.gif HTTP/1.0"], "status": [200], "size": [316]} +{"@timestamp": 893966436, "clientip":["51.0.0.0"], "request": ["GET /images/32t49813.jpg HTTP/1.1"], "status": [200], "size": [4714]} +{"@timestamp": 893966436, "clientip":["2.0.0.0"], "request": ["GET /english/images/hm_f98_top.gif HTTP/1.0"], "status": [200], "size": [915]} +{"@timestamp": 893966437, "clientip":["23.0.0.0"], "request": ["GET /english/tickets/body.html HTTP/1.0"], "status": [200], "size": [2925]} +{"@timestamp": 893966437, "clientip":["52.0.0.0"], "request": ["GET /english/member/images/cfologo.gif HTTP/1.1"], "status": [200], "size": [2820]} +{"@timestamp": 893966437, "clientip":["52.0.0.0"], "request": ["GET /english/member/images/member_header.jpg HTTP/1.1"], "status": [200], "size": [10457]} +{"@timestamp": 893966437, "clientip":["32.0.0.0"], "request": ["GET /english/news/3004bres.htm HTTP/1.1"], "status": [200], "size": [5765]} +{"@timestamp": 893966437, "clientip":["38.0.0.0"], "request": ["GET /images/s102386.gif HTTP/1.0"], "status": [200], "size": [279]} +{"@timestamp": 893966437, "clientip":["41.0.0.0"], "request": ["GET /images/news_hm_arw.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966437, "clientip":["39.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_54_off.gif HTTP/1.1"], "status": [200], "size": [403]} +{"@timestamp": 893966437, "clientip":["38.0.0.0"], "request": ["GET /images/s102326.gif HTTP/1.0"], "status": [200], "size": [248]} +{"@timestamp": 893966437, "clientip":["23.0.0.0"], "request": ["GET /english/tickets/images/ticket_hm_bg.jpg HTTP/1.0"], "status": [200], "size": [20929]} +{"@timestamp": 893966437, "clientip":["23.0.0.0"], "request": ["GET /english/tickets/images/ticket_hm_header.gif HTTP/1.0"], "status": [200], "size": [1226]} +{"@timestamp": 893966437, "clientip":["23.0.0.0"], "request": ["GET /english/tickets/images/ticket_hm_nav.gif HTTP/1.0"], "status": [200], "size": [11253]} +{"@timestamp": 893966438, "clientip":["33.0.0.0"], "request": ["GET /images/home_tool.gif HTTP/1.1"], "status": [200], "size": [327]} +{"@timestamp": 893966438, "clientip":["38.0.0.0"], "request": ["GET /english/competition/maincomp.htm HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966438, "clientip":["46.0.0.0"], "request": ["GET /images/11291.jpg HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966438, "clientip":["47.0.0.0"], "request": ["GET /english/ProScroll.class HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966438, "clientip":["39.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_58_off.gif HTTP/1.1"], "status": [200], "size": [397]} +{"@timestamp": 893966439, "clientip":["25.0.0.0"], "request": ["GET /french/images/nav_news_off.gif HTTP/1.1"], "status": [200], "size": [855]} +{"@timestamp": 893966439, "clientip":["57.0.0.0"], "request": ["GET /images/hm_f98_top.gif HTTP/1.0"], "status": [200], "size": [915]} +{"@timestamp": 893966439, "clientip":["47.0.0.0"], "request": ["GET /english/images/nav_field_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966439, "clientip":["58.0.0.0"], "request": ["GET /images/logo_cfo.gif HTTP/1.0"], "status": [200], "size": [1504]} +{"@timestamp": 893966439, "clientip":["57.0.0.0"], "request": ["GET /images/ligne1_case5.gif HTTP/1.0"], "status": [200], "size": [1018]} +{"@timestamp": 893966439, "clientip":["57.0.0.0"], "request": ["GET /english/images/top_stories.gif HTTP/1.0"], "status": [200], "size": [1210]} +{"@timestamp": 893966440, "clientip":["47.0.0.0"], "request": ["GET /images/hm_arw.gif HTTP/1.0"], "status": [200], "size": [1050]} +{"@timestamp": 893966440, "clientip":["47.0.0.0"], "request": ["GET /images/hm_linkf.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966440, "clientip":["38.0.0.0"], "request": ["GET /english/images/team_hm_header_shad.gif HTTP/1.0"], "status": [200], "size": [1379]} +{"@timestamp": 893966440, "clientip":["38.0.0.0"], "request": ["GET /english/images/comp_hm_nav.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966441, "clientip":["25.0.0.0"], "request": ["GET /french/images/nav_venue_off.gif HTTP/1.1"], "status": [200], "size": [945]} +{"@timestamp": 893966441, "clientip":["47.0.0.0"], "request": ["GET /images/info.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966441, "clientip":["59.0.0.0"], "request": ["GET /english/news/2704leag.htm HTTP/1.0"], "status": [200], "size": [4801]} +{"@timestamp": 893966441, "clientip":["60.0.0.0"], "request": ["GET /images/10531.jpg HTTP/1.0"], "status": [200], "size": [16554]} +{"@timestamp": 893966441, "clientip":["47.0.0.0"], "request": ["GET /english/images/nav_hosts_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966441, "clientip":["47.0.0.0"], "request": ["GET /images/dot.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966441, "clientip":["47.0.0.0"], "request": ["GET /english/images/nav_home_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966441, "clientip":["47.0.0.0"], "request": ["GET /images/hm_day_e.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966441, "clientip":["47.0.0.0"], "request": ["GET /english/images/nav_store_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966442, "clientip":["61.0.0.0"], "request": ["GET /english/venues/cities/montpellier.html HTTP/1.0"], "status": [200], "size": [9686]} +{"@timestamp": 893966442, "clientip":["62.0.0.0"], "request": ["GET /english/playing/links.html HTTP/1.0"], "status": [200], "size": [18694]} +{"@timestamp": 893966442, "clientip":["23.0.0.0"], "request": ["GET /images/arw_lk.gif HTTP/1.0"], "status": [200], "size": [669]} +{"@timestamp": 893966442, "clientip":["63.0.0.0"], "request": ["GET /images/home_bg_stars.gif HTTP/1.0"], "status": [200], "size": [2557]} +{"@timestamp": 893966442, "clientip":["63.0.0.0"], "request": ["GET /images/home_fr_phrase.gif HTTP/1.0"], "status": [200], "size": [2843]} +{"@timestamp": 893966442, "clientip":["63.0.0.0"], "request": ["GET /images/home_logo.gif HTTP/1.0"], "status": [200], "size": [3401]} +{"@timestamp": 893966442, "clientip":["47.0.0.0"], "request": ["GET /english/images/nav_tickets_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966442, "clientip":["47.0.0.0"], "request": ["GET /english/images/nav_team_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966442, "clientip":["46.0.0.0"], "request": ["GET /images/sdffr.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966442, "clientip":["47.0.0.0"], "request": ["GET /english/images/nav_history_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966442, "clientip":["39.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_62_off.gif HTTP/1.1"], "status": [200], "size": [437]} +{"@timestamp": 893966442, "clientip":["39.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_66_off.gif HTTP/1.1"], "status": [200], "size": [435]} +{"@timestamp": 893966443, "clientip":["64.0.0.0"], "request": ["GET /images/home_tool.gif HTTP/1.0"], "status": [200], "size": [327]} +{"@timestamp": 893966443, "clientip":["38.0.0.0"], "request": ["GET /english/images/comp_hm_nav.gif HTTP/1.0"], "status": [206], "size": [10902]} +{"@timestamp": 893966443, "clientip":["25.0.0.0"], "request": ["GET /french/images/nav_tickets_off.gif HTTP/1.1"], "status": [200], "size": [965]} +{"@timestamp": 893966443, "clientip":["57.0.0.0"], "request": ["GET /images/case5.gif HTTP/1.0"], "status": [200], "size": [1362]} +{"@timestamp": 893966443, "clientip":["65.0.0.0"], "request": ["GET /english/index.html HTTP/1.0"], "status": [200], "size": [892]} +{"@timestamp": 893966443, "clientip":["30.0.0.0"], "request": ["GET /english/playing/mascot/images/button.03.gif HTTP/1.0"], "status": [200], "size": [893]} +{"@timestamp": 893966443, "clientip":["57.0.0.0"], "request": ["GET /images/bord_stories.gif HTTP/1.0"], "status": [200], "size": [520]} +{"@timestamp": 893966443, "clientip":["57.0.0.0"], "request": ["GET /images/bord_stories01.gif HTTP/1.0"], "status": [200], "size": [333]} +{"@timestamp": 893966444, "clientip":["65.0.0.0"], "request": ["GET /english/nav_inet.html HTTP/1.0"], "status": [200], "size": [2672]} +{"@timestamp": 893966444, "clientip":["65.0.0.0"], "request": ["GET /english/splash_inet.html HTTP/1.0"], "status": [200], "size": [3730]} +{"@timestamp": 893966444, "clientip":["39.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_70_off.gif HTTP/1.1"], "status": [200], "size": [409]} +{"@timestamp": 893966444, "clientip":["65.0.0.0"], "request": ["GET /images/nav_bg_bottom.jpg HTTP/1.0"], "status": [200], "size": [8389]} +{"@timestamp": 893966444, "clientip":["65.0.0.0"], "request": ["GET /english/images/nav_team_off.gif HTTP/1.0"], "status": [200], "size": [776]} +{"@timestamp": 893966444, "clientip":["6.0.0.0"], "request": ["GET /french/venues/body.html HTTP/1.0"], "status": [200], "size": [2042]} +{"@timestamp": 893966444, "clientip":["65.0.0.0"], "request": ["GET /english/images/nav_news_off.gif HTTP/1.0"], "status": [200], "size": [853]} +{"@timestamp": 893966444, "clientip":["65.0.0.0"], "request": ["GET /images/nav_bg_top.gif HTTP/1.0"], "status": [200], "size": [929]} +{"@timestamp": 893966444, "clientip":["64.0.0.0"], "request": ["GET /images/home_sponsor.gif HTTP/1.0"], "status": [200], "size": [2491]} +{"@timestamp": 893966444, "clientip":["65.0.0.0"], "request": ["GET /images/logo_cfo.gif HTTP/1.0"], "status": [200], "size": [1504]} +{"@timestamp": 893966444, "clientip":["65.0.0.0"], "request": ["GET /images/hm_nbg.jpg HTTP/1.0"], "status": [200], "size": [33665]} +{"@timestamp": 893966444, "clientip":["65.0.0.0"], "request": ["GET /english/images/nav_comp_off.gif HTTP/1.0"], "status": [200], "size": [994]} +{"@timestamp": 893966444, "clientip":["66.0.0.0"], "request": ["GET / HTTP/1.0"], "status": [200], "size": [8712]} +{"@timestamp": 893966444, "clientip":["62.0.0.0"], "request": ["GET /english/playing/images/backg.gif HTTP/1.0"], "status": [200], "size": [1462]} +{"@timestamp": 893966444, "clientip":["67.0.0.0"], "request": ["GET /english/individuals/player389.htm HTTP/1.0"], "status": [200], "size": [7001]} +{"@timestamp": 893966444, "clientip":["47.0.0.0"], "request": ["GET /english/teams/teamgroup.htm HTTP/1.0"], "status": [200], "size": [11971]} +{"@timestamp": 893966445, "clientip":["7.0.0.0"], "request": ["GET /english/playing/images/play_header.gif HTTP/1.0"], "status": [200], "size": [2262]} +{"@timestamp": 893966445, "clientip":["30.0.0.0"], "request": ["GET /english/playing/mascot/images/footix.test.gif HTTP/1.0"], "status": [200], "size": [20385]} +{"@timestamp": 893966445, "clientip":["6.0.0.0"], "request": ["GET /french/venues/images/Venue_map_mid_off.gif HTTP/1.0"], "status": [200], "size": [9911]} +{"@timestamp": 893966445, "clientip":["25.0.0.0"], "request": ["GET /french/images/nav_field_off.gif HTTP/1.1"], "status": [200], "size": [982]} +{"@timestamp": 893966445, "clientip":["64.0.0.0"], "request": ["GET /images/home_intro.anim.gif HTTP/1.0"], "status": [200], "size": [60349]} +{"@timestamp": 893966445, "clientip":["6.0.0.0"], "request": ["GET /french/venues/images/Venue_map_top_off.gif HTTP/1.0"], "status": [200], "size": [8369]} +{"@timestamp": 893966445, "clientip":["6.0.0.0"], "request": ["GET /french/venues/images/venue_hm_nav.gif HTTP/1.0"], "status": [200], "size": [7644]} +{"@timestamp": 893966445, "clientip":["68.0.0.0"], "request": ["GET /english/venues/cities/images/montpellier/venue_mont_header.jpg HTTP/1.0"], "status": [200], "size": [11562]} +{"@timestamp": 893966445, "clientip":["69.0.0.0"], "request": ["GET /english/history/history_of/images/cup/cup.gif HTTP/1.0"], "status": [200], "size": [5469]} +{"@timestamp": 893966445, "clientip":["34.0.0.0"], "request": ["GET /english/history/body.html HTTP/1.0"], "status": [200], "size": [2909]} +{"@timestamp": 893966445, "clientip":["70.0.0.0"], "request": ["GET /english/venues/cities/images/marseille/mars_c.gif HTTP/1.0"], "status": [200], "size": [369]} +{"@timestamp": 893966446, "clientip":["64.0.0.0"], "request": ["GET /images/home_fr_button.gif HTTP/1.0"], "status": [200], "size": [2140]} +{"@timestamp": 893966446, "clientip":["66.0.0.0"], "request": ["GET / HTTP/1.0"], "status": [200], "size": [8712]} +{"@timestamp": 893966446, "clientip":["6.0.0.0"], "request": ["GET /french/venues/images/Venue_map_bot_off.gif HTTP/1.0"], "status": [200], "size": [7397]} +{"@timestamp": 893966446, "clientip":["71.0.0.0"], "request": ["GET /english/teams/teambio148.htm HTTP/1.0"], "status": [200], "size": [10857]} +{"@timestamp": 893966446, "clientip":["72.0.0.0"], "request": ["GET / HTTP/1.0"], "status": [200], "size": [8712]} +{"@timestamp": 893966446, "clientip":["39.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_78_off.gif HTTP/1.1"], "status": [200], "size": [427]} +{"@timestamp": 893966446, "clientip":["67.0.0.0"], "request": ["GET /images/102373.gif HTTP/1.0"], "status": [200], "size": [1703]} +{"@timestamp": 893966446, "clientip":["47.0.0.0"], "request": ["GET /english/images/teams_bu_group_on.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966446, "clientip":["67.0.0.0"], "request": ["GET /images/32p49804.jpg HTTP/1.0"], "status": [200], "size": [11023]} +{"@timestamp": 893966446, "clientip":["47.0.0.0"], "request": ["GET /english/images/teams_bu_confed_off.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966447, "clientip":["71.0.0.0"], "request": ["GET /images/32t49812.jpg HTTP/1.0"], "status": [200], "size": [4132]} +{"@timestamp": 893966447, "clientip":["71.0.0.0"], "request": ["GET /images/ger.gif HTTP/1.0"], "status": [200], "size": [1603]} +{"@timestamp": 893966447, "clientip":["39.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_82_off.gif HTTP/1.1"], "status": [200], "size": [433]} +{"@timestamp": 893966447, "clientip":["25.0.0.0"], "request": ["GET /french/images/nav_store_off.gif HTTP/1.1"], "status": [200], "size": [976]} +{"@timestamp": 893966447, "clientip":["65.0.0.0"], "request": ["GET /images/space.gif HTTP/1.0"], "status": [200], "size": [42]} +{"@timestamp": 893966447, "clientip":["65.0.0.0"], "request": ["GET /english/images/hm_official.gif HTTP/1.0"], "status": [200], "size": [1807]} +{"@timestamp": 893966447, "clientip":["47.0.0.0"], "request": ["GET /images/s102325.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966447, "clientip":["65.0.0.0"], "request": ["GET /images/space.gif HTTP/1.0"], "status": [200], "size": [42]} +{"@timestamp": 893966447, "clientip":["47.0.0.0"], "request": ["GET /english/images/team_group_header_a.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966447, "clientip":["65.0.0.0"], "request": ["GET /english/images/nav_field_off.gif HTTP/1.0"], "status": [200], "size": [1005]} +{"@timestamp": 893966447, "clientip":["65.0.0.0"], "request": ["GET /english/images/nav_history_off.gif HTTP/1.0"], "status": [200], "size": [914]} +{"@timestamp": 893966448, "clientip":["65.0.0.0"], "request": ["GET /english/ProScroll.class HTTP/1.0"], "status": [200], "size": [6507]} +{"@timestamp": 893966448, "clientip":["47.0.0.0"], "request": ["GET /images/s102424.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966448, "clientip":["39.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_86_off.gif HTTP/1.1"], "status": [200], "size": [409]} +{"@timestamp": 893966448, "clientip":["47.0.0.0"], "request": ["GET /images/s102487.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966448, "clientip":["65.0.0.0"], "request": ["GET /english/images/nav_hosts_off.gif HTTP/1.0"], "status": [200], "size": [914]} +{"@timestamp": 893966448, "clientip":["65.0.0.0"], "request": ["GET /images/hm_brdl.gif HTTP/1.0"], "status": [200], "size": [208]} +{"@timestamp": 893966448, "clientip":["73.0.0.0"], "request": ["GET / HTTP/1.1"], "status": [304], "size": [0]} +{"@timestamp": 893966448, "clientip":["62.0.0.0"], "request": ["GET /english/playing/images/links_on.GIF HTTP/1.0"], "status": [200], "size": [1393]} +{"@timestamp": 893966448, "clientip":["62.0.0.0"], "request": ["GET /english/playing/images/banner2.gif HTTP/1.0"], "status": [200], "size": [15328]} +{"@timestamp": 893966448, "clientip":["66.0.0.0"], "request": ["GET /images/home_bg_stars.gif HTTP/1.0"], "status": [200], "size": [2557]} +{"@timestamp": 893966448, "clientip":["57.0.0.0"], "request": ["GET /english/images/lateb_new.gif HTTP/1.0"], "status": [200], "size": [1431]} +{"@timestamp": 893966448, "clientip":["47.0.0.0"], "request": ["GET /images/s102477.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966448, "clientip":["65.0.0.0"], "request": ["GET /english/images/nav_sitemap_off.gif HTTP/1.0"], "status": [200], "size": [416]} +{"@timestamp": 893966448, "clientip":["65.0.0.0"], "request": ["GET /english/images/nav_logo_sponsors.gif HTTP/1.0"], "status": [200], "size": [1991]} +{"@timestamp": 893966448, "clientip":["47.0.0.0"], "request": ["GET /english/images/team_group_header_e.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966448, "clientip":["65.0.0.0"], "request": ["GET /images/hm_linkf.gif HTTP/1.0"], "status": [200], "size": [123]} +{"@timestamp": 893966449, "clientip":["65.0.0.0"], "request": ["GET /images/info.gif HTTP/1.0"], "status": [200], "size": [1251]} +{"@timestamp": 893966449, "clientip":["74.0.0.0"], "request": ["GET / HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966449, "clientip":["75.0.0.0"], "request": ["GET /english/competition/stage2.htm HTTP/1.0"], "status": [200], "size": [16606]} +{"@timestamp": 893966449, "clientip":["47.0.0.0"], "request": ["GET /images/s102324.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966449, "clientip":["25.0.0.0"], "request": ["GET /french/images/nav_sitemap_off.gif HTTP/1.1"], "status": [200], "size": [413]} +{"@timestamp": 893966449, "clientip":["65.0.0.0"], "request": ["GET /images/hm_day_e.gif HTTP/1.0"], "status": [200], "size": [499]} +{"@timestamp": 893966449, "clientip":["14.0.0.0"], "request": ["GET /images/home_bg_stars.gif HTTP/1.1"], "status": [200], "size": [2557]} +{"@timestamp": 893966449, "clientip":["47.0.0.0"], "request": ["GET /images/s102376.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966449, "clientip":["40.0.0.0"], "request": ["GET /english/history/past_cups/france38.html HTTP/1.1"], "status": [200], "size": [12669]} +{"@timestamp": 893966449, "clientip":["73.0.0.0"], "request": ["GET /images/home_fr_phrase.gif HTTP/1.1"], "status": [200], "size": [2843]} +{"@timestamp": 893966449, "clientip":["73.0.0.0"], "request": ["GET /images/home_intro.anim.gif HTTP/1.1"], "status": [200], "size": [60349]} +{"@timestamp": 893966449, "clientip":["65.0.0.0"], "request": ["GET /images/hm_brdr.gif HTTP/1.0"], "status": [200], "size": [235]} +{"@timestamp": 893966449, "clientip":["65.0.0.0"], "request": ["GET /english/images/nav_store_off.gif HTTP/1.0"], "status": [200], "size": [934]} +{"@timestamp": 893966449, "clientip":["76.0.0.0"], "request": ["GET /english/competition/stage1.htm HTTP/1.1"], "status": [200], "size": [36783]} +{"@timestamp": 893966449, "clientip":["65.0.0.0"], "request": ["GET /images/hm_arw.gif HTTP/1.0"], "status": [200], "size": [1050]} +{"@timestamp": 893966449, "clientip":["53.0.0.0"], "request": ["GET /english/competition/headtohead76.htm HTTP/1.1"], "status": [200], "size": [16909]} +{"@timestamp": 893966449, "clientip":["65.0.0.0"], "request": ["GET /images/dot.gif HTTP/1.0"], "status": [200], "size": [43]} +{"@timestamp": 893966449, "clientip":["2.0.0.0"], "request": ["GET /english/images/nav_history_off.gif HTTP/1.0"], "status": [200], "size": [914]} +{"@timestamp": 893966449, "clientip":["73.0.0.0"], "request": ["GET /images/home_eng_phrase.gif HTTP/1.1"], "status": [200], "size": [2861]} +{"@timestamp": 893966450, "clientip":["2.0.0.0"], "request": ["GET /english/images/nav_field_off.gif HTTP/1.0"], "status": [200], "size": [1005]} +{"@timestamp": 893966450, "clientip":["66.0.0.0"], "request": ["GET /images/home_fr_phrase.gif HTTP/1.0"], "status": [200], "size": [2843]} +{"@timestamp": 893966450, "clientip":["1.0.0.0"], "request": ["GET /english/images/hm_official.gif HTTP/1.0"], "status": [200], "size": [1807]} +{"@timestamp": 893966450, "clientip":["1.0.0.0"], "request": ["GET /images/nav_bg_top.gif HTTP/1.0"], "status": [200], "size": [929]} +{"@timestamp": 893966450, "clientip":["66.0.0.0"], "request": ["GET /images/home_intro.anim.gif HTTP/1.0"], "status": [200], "size": [60349]} +{"@timestamp": 893966450, "clientip":["1.0.0.0"], "request": ["GET /images/logo_cfo.gif HTTP/1.0"], "status": [200], "size": [1504]} +{"@timestamp": 893966450, "clientip":["1.0.0.0"], "request": ["GET /images/space.gif HTTP/1.0"], "status": [200], "size": [42]} +{"@timestamp": 893966450, "clientip":["77.0.0.0"], "request": ["GET /english/images/france98b.gif HTTP/1.0"], "status": [200], "size": [2122]} +{"@timestamp": 893966450, "clientip":["1.0.0.0"], "request": ["GET /english/ProScroll.class HTTP/1.0"], "status": [200], "size": [6507]} +{"@timestamp": 893966450, "clientip":["77.0.0.0"], "request": ["GET /english/images/space.gif HTTP/1.0"], "status": [200], "size": [42]} +{"@timestamp": 893966450, "clientip":["57.0.0.0"], "request": ["GET /images/ligne4_latebreak.gif HTTP/1.0"], "status": [200], "size": [1056]} +{"@timestamp": 893966450, "clientip":["47.0.0.0"], "request": ["GET /images/s102373.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966450, "clientip":["47.0.0.0"], "request": ["GET /images/s102443.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966450, "clientip":["232.0.0.0"], "request": ["GET /images/hm_bg.jpg HTTP/1.0"], "status": [200], "size": [24736]} +{"@timestamp": 893966451, "clientip":["66.0.0.0"], "request": ["GET /images/home_eng_phrase.gif HTTP/1.0"], "status": [200], "size": [2861]} +{"@timestamp": 893966451, "clientip":["75.0.0.0"], "request": ["GET /english/images/comp_bu_stage2n_on.gif HTTP/1.0"], "status": [200], "size": [996]} +{"@timestamp": 893966451, "clientip":["57.0.0.0"], "request": ["GET /images/ligneb.gif HTTP/1.0"], "status": [200], "size": [169]} +{"@timestamp": 893966451, "clientip":["39.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bu_94_off.gif HTTP/1.1"], "status": [200], "size": [432]} +{"@timestamp": 893966451, "clientip":["77.0.0.0"], "request": ["GET /english/images/comp_bu_stage1n.gif HTTP/1.0"], "status": [200], "size": [1548]} +{"@timestamp": 893966451, "clientip":["47.0.0.0"], "request": ["GET /images/s140875.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966451, "clientip":["47.0.0.0"], "request": ["GET /images/s102321.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966451, "clientip":["6.0.0.0"], "request": ["GET /french/venues/cities/images/denis/venue_denn_bg.jpg HTTP/1.0"], "status": [200], "size": [21003]} +{"@timestamp": 893966451, "clientip":["6.0.0.0"], "request": ["GET /french/venues/images/venue_header.gif HTTP/1.0"], "status": [200], "size": [740]} +{"@timestamp": 893966451, "clientip":["75.0.0.0"], "request": ["GET /images/comp_stage2_brc_top.gif HTTP/1.0"], "status": [200], "size": [163]} +{"@timestamp": 893966451, "clientip":["75.0.0.0"], "request": ["GET /images/comp_stage2_brc_topr.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966451, "clientip":["25.0.0.0"], "request": ["GET /images/hm_nbg.jpg HTTP/1.1"], "status": [200], "size": [33665]} +{"@timestamp": 893966451, "clientip":["6.0.0.0"], "request": ["GET /french/venues/images/venue_bu_city_on.gif HTTP/1.0"], "status": [200], "size": [1061]} +{"@timestamp": 893966451, "clientip":["66.0.0.0"], "request": ["GET /images/home_tool.gif HTTP/1.0"], "status": [200], "size": [327]} +{"@timestamp": 893966451, "clientip":["47.0.0.0"], "request": ["GET /english/images/team_group_header_g.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966451, "clientip":["47.0.0.0"], "request": ["GET /images/s102357.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966451, "clientip":["75.0.0.0"], "request": ["GET /images/comp_stage2_brc_bot.gif HTTP/1.0"], "status": [200], "size": [160]} +{"@timestamp": 893966451, "clientip":["69.0.0.0"], "request": ["GET /english/history/history_of/images/cup/coup_du_mondtxt.gif HTTP/1.0"], "status": [200], "size": [5053]} +{"@timestamp": 893966451, "clientip":["73.0.0.0"], "request": ["GET /images/home_fr_button.gif HTTP/1.1"], "status": [200], "size": [2140]} +{"@timestamp": 893966451, "clientip":["1.0.0.0"], "request": ["GET /images/nav_bg_bottom.jpg HTTP/1.0"], "status": [200], "size": [8389]} +{"@timestamp": 893966451, "clientip":["1.0.0.0"], "request": ["GET /english/images/nav_news_off.gif HTTP/1.0"], "status": [200], "size": [853]} +{"@timestamp": 893966451, "clientip":["1.0.0.0"], "request": ["GET /english/images/nav_comp_off.gif HTTP/1.0"], "status": [200], "size": [994]} +{"@timestamp": 893966451, "clientip":["47.0.0.0"], "request": ["GET /english/images/team_hm_header_shad.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966452, "clientip":["47.0.0.0"], "request": ["GET /english/images/team_group_header_c.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966452, "clientip":["78.0.0.0"], "request": ["GET /english/venues/cities/images/montpellier/12eglise.jpg HTTP/1.0"], "status": [200], "size": [3035]} +{"@timestamp": 893966452, "clientip":["47.0.0.0"], "request": ["GET /images/s102383.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966452, "clientip":["6.0.0.0"], "request": ["GET /french/venues/cities/images/denis/12maisons.jpg HTTP/1.0"], "status": [200], "size": [2559]} +{"@timestamp": 893966452, "clientip":["75.0.0.0"], "request": ["GET /images/comp_stage2_brc_botr.gif HTTP/1.0"], "status": [200], "size": [158]} +{"@timestamp": 893966452, "clientip":["6.0.0.0"], "request": ["GET /french/venues/cities/images/denis/denis_a.gif HTTP/1.0"], "status": [200], "size": [520]} +{"@timestamp": 893966452, "clientip":["70.0.0.0"], "request": ["GET /english/venues/cities/images/montpellier/17mystery.gif HTTP/1.0"], "status": [200], "size": [542]} +{"@timestamp": 893966452, "clientip":["79.0.0.0"], "request": ["GET /english/history/images/history_hm_bg2.jpg HTTP/1.0"], "status": [200], "size": [22515]} +{"@timestamp": 893966452, "clientip":["79.0.0.0"], "request": ["GET /english/history/images/history_hm_header.gif HTTP/1.0"], "status": [200], "size": [688]} +{"@timestamp": 893966452, "clientip":["2.0.0.0"], "request": ["GET /english/images/nav_home_off.gif HTTP/1.0"], "status": [200], "size": [828]} +{"@timestamp": 893966452, "clientip":["1.0.0.0"], "request": ["GET /images/hm_day_e.gif HTTP/1.0"], "status": [200], "size": [499]} +{"@timestamp": 893966452, "clientip":["70.0.0.0"], "request": ["GET /english/venues/cities/images/montpellier/18corum.gif HTTP/1.0"], "status": [200], "size": [650]} +{"@timestamp": 893966452, "clientip":["66.0.0.0"], "request": ["GET /images/home_eng_button.gif HTTP/1.0"], "status": [200], "size": [1927]} +{"@timestamp": 893966452, "clientip":["80.0.0.0"], "request": ["GET /english/news/player01.htm HTTP/1.0"], "status": [200], "size": [42591]} +{"@timestamp": 893966452, "clientip":["79.0.0.0"], "request": ["GET /english/history/images/history_hm_3094.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966452, "clientip":["79.0.0.0"], "request": ["GET /english/history/images/history_hm_posters.jpg HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966452, "clientip":["39.0.0.0"], "request": ["GET /english/history/past_cups/images/past_bracket_top.gif HTTP/1.1"], "status": [200], "size": [289]} +{"@timestamp": 893966452, "clientip":["2.0.0.0"], "request": ["GET /english/images/nav_tickets_off.gif HTTP/1.0"], "status": [200], "size": [937]} +{"@timestamp": 893966452, "clientip":["47.0.0.0"], "request": ["GET /images/s102380.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966452, "clientip":["6.0.0.0"], "request": ["GET /french/venues/cities/images/denis/16tradition.gif HTTP/1.0"], "status": [200], "size": [387]} +{"@timestamp": 893966452, "clientip":["66.0.0.0"], "request": ["GET /images/home_sponsor.gif HTTP/1.0"], "status": [200], "size": [2491]} +{"@timestamp": 893966453, "clientip":["70.0.0.0"], "request": ["GET /english/venues/cities/images/marseille/mars_t.gif HTTP/1.0"], "status": [200], "size": [353]} +{"@timestamp": 893966453, "clientip":["73.0.0.0"], "request": ["GET /images/home_tool.gif HTTP/1.1"], "status": [200], "size": [327]} +{"@timestamp": 893966453, "clientip":["81.0.0.0"], "request": ["GET / HTTP/1.0"], "status": [200], "size": [8712]} +{"@timestamp": 893966453, "clientip":["5.0.0.0"], "request": ["GET /french/news/3004arge.htm HTTP/1.1"], "status": [200], "size": [4869]} +{"@timestamp": 893966453, "clientip":["78.0.0.0"], "request": ["GET /english/venues/cities/images/marseille/mars_i.gif HTTP/1.0"], "status": [200], "size": [314]} +{"@timestamp": 893966453, "clientip":["1.0.0.0"], "request": ["GET /images/hm_arw.gif HTTP/1.0"], "status": [200], "size": [1050]} +{"@timestamp": 893966453, "clientip":["77.0.0.0"], "request": ["GET /english/images/comp_bu_stage2n.gif HTTP/1.0"], "status": [200], "size": [984]} +{"@timestamp": 893966453, "clientip":["2.0.0.0"], "request": ["GET /english/images/nav_logo_sponsors.gif HTTP/1.0"], "status": [200], "size": [1991]} +{"@timestamp": 893966453, "clientip":["62.0.0.0"], "request": ["GET /english/playing/images/fifa_logo_sm.gif HTTP/1.0"], "status": [200], "size": [2900]} +{"@timestamp": 893966453, "clientip":["68.0.0.0"], "request": ["GET /english/venues/cities/images/marseille/mars_a.gif HTTP/1.0"], "status": [200], "size": [434]} +{"@timestamp": 893966453, "clientip":["47.0.0.0"], "request": ["GET /images/s102320.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966453, "clientip":["3.0.0.0"], "request": ["GET /english/images/fpnewstop.gif HTTP/1.0"], "status": [200], "size": [568]} +{"@timestamp": 893966453, "clientip":["1.0.0.0"], "request": ["GET /english/images/nav_venue_off.gif HTTP/1.0"], "status": [200], "size": [870]} +{"@timestamp": 893966453, "clientip":["3.0.0.0"], "request": ["GET /english/images/news_btn_letter_off.gif HTTP/1.0"], "status": [200], "size": [852]} +{"@timestamp": 893966453, "clientip":["47.0.0.0"], "request": ["GET /images/s102353.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966453, "clientip":["6.0.0.0"], "request": ["GET /french/venues/cities/images/denis/17commercial.gif HTTP/1.0"], "status": [200], "size": [614]} +{"@timestamp": 893966453, "clientip":["57.0.0.0"], "request": ["GET /images/ligne.gif HTTP/1.0"], "status": [200], "size": [169]} +{"@timestamp": 893966453, "clientip":["47.0.0.0"], "request": ["GET /images/s102329.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966453, "clientip":["3.0.0.0"], "request": ["GET /english/images/news_btn_kits_off.gif HTTP/1.0"], "status": [200], "size": [933]} +{"@timestamp": 893966453, "clientip":["57.0.0.0"], "request": ["GET /images/ligne01.gif HTTP/1.0"], "status": [200], "size": [169]} +{"@timestamp": 893966453, "clientip":["7.0.0.0"], "request": ["GET /english/playing/images/links.GIF HTTP/1.0"], "status": [200], "size": [1394]} +{"@timestamp": 893966453, "clientip":["47.0.0.0"], "request": ["GET /images/s102377.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966454, "clientip":["47.0.0.0"], "request": ["GET /images/s102328.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966454, "clientip":["66.0.0.0"], "request": ["GET /images/home_fr_button.gif HTTP/1.0"], "status": [200], "size": [2140]} +{"@timestamp": 893966454, "clientip":["47.0.0.0"], "request": ["GET /images/s102323.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966454, "clientip":["34.0.0.0"], "request": ["GET /english/history/images/history_hm_3094.gif HTTP/1.0"], "status": [200], "size": [1031]} +{"@timestamp": 893966454, "clientip":["69.0.0.0"], "request": ["GET /english/history/history_of/images/cup/trophytxt.gif HTTP/1.0"], "status": [200], "size": [1425]} +{"@timestamp": 893966454, "clientip":["6.0.0.0"], "request": ["GET /french/venues/cities/images/denis/19historical.gif HTTP/1.0"], "status": [200], "size": [616]} +{"@timestamp": 893966454, "clientip":["57.0.0.0"], "request": ["GET /images/base.gif HTTP/1.0"], "status": [200], "size": [366]} +{"@timestamp": 893966454, "clientip":["79.0.0.0"], "request": ["GET /english/history/images/history_hm_nav.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966454, "clientip":["47.0.0.0"], "request": ["GET /english/images/team_group_header_f.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966454, "clientip":["6.0.0.0"], "request": ["GET /french/venues/cities/images/denis/18collect.gif HTTP/1.0"], "status": [200], "size": [714]} +{"@timestamp": 893966454, "clientip":["47.0.0.0"], "request": ["GET /images/s102442.gif HTTP/1.0"], "status": [304], "size": [0]} +{"@timestamp": 893966455, "clientip":["34.0.0.0"], "request": ["GET /english/history/images/history_hm_nav.gif HTTP/1.0"], "status": [200], "size": [18328]} diff --git a/regression-test/data/inverted_index_p0/array_contains/test_char_replace_arr.out b/regression-test/data/inverted_index_p0/array_contains/test_char_replace_arr.out new file mode 100644 index 00000000000000..ed9d5459637874 --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_char_replace_arr.out @@ -0,0 +1,100 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_compound_arr.out b/regression-test/data/inverted_index_p0/array_contains/test_compound_arr.out new file mode 100644 index 00000000000000..4da9bf65689d63 --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_compound_arr.out @@ -0,0 +1,7 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +2 + +-- !sql -- +3 + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_count_on_index_httplogs_arr.out b/regression-test/data/inverted_index_p0/array_contains/test_count_on_index_httplogs_arr.out new file mode 100644 index 00000000000000..167e1004b64938 --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_count_on_index_httplogs_arr.out @@ -0,0 +1,46 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 0 + +-- !sql -- +0 \N + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 0 + +-- !sql -- +0 \N + +-- !sql -- +0 + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_equal_on_fulltext_arr.out b/regression-test/data/inverted_index_p0/array_contains/test_equal_on_fulltext_arr.out new file mode 100644 index 00000000000000..2167ad567c2e4b --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_equal_on_fulltext_arr.out @@ -0,0 +1,6 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +2 ["I am a person"] + +-- !sql -- + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_index_bkd_null_arr.out b/regression-test/data/inverted_index_p0/array_contains/test_index_bkd_null_arr.out new file mode 100644 index 00000000000000..29f296cab8b8fe --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_index_bkd_null_arr.out @@ -0,0 +1,5 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- + +-- !sql -- + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_index_change_2_arr.out b/regression-test/data/inverted_index_p0/array_contains/test_index_change_2_arr.out new file mode 100644 index 00000000000000..e2c7b99778d299 --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_index_change_2_arr.out @@ -0,0 +1,37 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !select1 -- +1 2017-10-01 10 1 ["Beijing China"] ["Software Developer"] +2 2017-10-01 10 1 ["Beijing China"] ["Communication Engineer"] +3 2017-10-01 10 1 ["Shanghai China"] ["electrical engineer"] +4 2017-10-02 10 0 ["Beijing China"] ["Both a teacher and a scientist"] +5 2017-10-02 10 1 ["Shenzhen China"] ["teacher"] +6 2017-10-03 10 1 ["Hongkong China"] ["Architectural designer"] + +-- !select2 -- +1 2017-10-01 10 1 ["Beijing China"] ["Software Developer"] +2 2017-10-01 10 1 ["Beijing China"] ["Communication Engineer"] +4 2017-10-02 10 0 ["Beijing China"] ["Both a teacher and a scientist"] + +-- !select3 -- +1 2017-10-01 10 1 ["Beijing China"] ["Software Developer"] +2 2017-10-01 10 1 ["Beijing China"] ["Communication Engineer"] + +-- !select4 -- + +-- !select5 -- +3 2017-10-01 10 1 ["Shanghai China"] ["electrical engineer"] + +-- !select6 -- +3 2017-10-01 10 1 ["Shanghai China"] ["electrical engineer"] + +-- !select7 -- + +-- !select8 -- + +-- !select9 -- + +-- !select10 -- +3 2017-10-01 10 1 ["Shanghai China"] ["electrical engineer"] + +-- !select11 -- + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_index_change_4_arr.out b/regression-test/data/inverted_index_p0/array_contains/test_index_change_4_arr.out new file mode 100644 index 00000000000000..623c1ead0f152f --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_index_change_4_arr.out @@ -0,0 +1,31 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !select1 -- +1 2017-10-01 10 1 ["Beijing China"] ["Software Developer"] +2 2017-10-01 10 1 ["Beijing China"] ["Communication Engineer"] +3 2017-10-01 10 1 ["Shanghai China"] ["electrical engineer"] +4 2017-10-02 10 0 ["Beijing China"] ["Both a teacher and a scientist"] +5 2017-10-02 10 1 ["Shenzhen China"] ["teacher"] +6 2017-10-03 10 1 ["Hongkong China"] ["Architectural designer"] + +-- !select2_v1 -- + +-- !select3_v1 -- + +-- !select4_v1 -- + +-- !select5_v1 -- +3 2017-10-01 10 1 ["Shanghai China"] ["electrical engineer"] + +-- !select6_v1 -- + +-- !select7_v1 -- + +-- !select8_v1 -- + +-- !select9_v1 -- + +-- !select10_v1 -- +3 2017-10-01 10 1 ["Shanghai China"] ["electrical engineer"] + +-- !select11_v1 -- + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_index_change_6_arr.out b/regression-test/data/inverted_index_p0/array_contains/test_index_change_6_arr.out new file mode 100644 index 00000000000000..623c1ead0f152f --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_index_change_6_arr.out @@ -0,0 +1,31 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !select1 -- +1 2017-10-01 10 1 ["Beijing China"] ["Software Developer"] +2 2017-10-01 10 1 ["Beijing China"] ["Communication Engineer"] +3 2017-10-01 10 1 ["Shanghai China"] ["electrical engineer"] +4 2017-10-02 10 0 ["Beijing China"] ["Both a teacher and a scientist"] +5 2017-10-02 10 1 ["Shenzhen China"] ["teacher"] +6 2017-10-03 10 1 ["Hongkong China"] ["Architectural designer"] + +-- !select2_v1 -- + +-- !select3_v1 -- + +-- !select4_v1 -- + +-- !select5_v1 -- +3 2017-10-01 10 1 ["Shanghai China"] ["electrical engineer"] + +-- !select6_v1 -- + +-- !select7_v1 -- + +-- !select8_v1 -- + +-- !select9_v1 -- + +-- !select10_v1 -- +3 2017-10-01 10 1 ["Shanghai China"] ["electrical engineer"] + +-- !select11_v1 -- + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_index_compaction_dup_keys_arr.out b/regression-test/data/inverted_index_p0/array_contains/test_index_compaction_dup_keys_arr.out new file mode 100644 index 00000000000000..82d15ef666a7ae --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_index_compaction_dup_keys_arr.out @@ -0,0 +1,105 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +1 ["andy"] ["andy love apple"] [100] +1 ["bason"] ["bason hate pear"] [99] +2 ["andy"] ["andy love apple"] [100] +2 ["bason"] ["bason hate pear"] [99] +3 ["andy"] ["andy love apple"] [100] +3 ["bason"] ["bason hate pear"] [99] + +-- !sql -- +1 ["andy"] ["andy love apple"] [100] +2 ["andy"] ["andy love apple"] [100] +3 ["andy"] ["andy love apple"] [100] + +-- !sql -- + +-- !sql -- +1 ["bason"] ["bason hate pear"] [99] +2 ["bason"] ["bason hate pear"] [99] +3 ["bason"] ["bason hate pear"] [99] + +-- !sql -- +1 ["andy"] ["andy love apple"] [100] +1 ["bason"] ["bason hate pear"] [99] +2 ["andy"] ["andy love apple"] [100] +2 ["bason"] ["bason hate pear"] [99] +3 ["andy"] ["andy love apple"] [100] +3 ["bason"] ["bason hate pear"] [99] + +-- !sql -- +1 ["andy"] ["andy love apple"] [100] +2 ["andy"] ["andy love apple"] [100] +3 ["andy"] ["andy love apple"] [100] + +-- !sql -- + +-- !sql -- +1 ["bason"] ["bason hate pear"] [99] +2 ["bason"] ["bason hate pear"] [99] +3 ["bason"] ["bason hate pear"] [99] + +-- !sql -- +1 ["andy"] ["andy love apple"] [100] +1 ["andy"] ["andy love apple"] [100] +1 ["bason"] ["bason hate pear"] [99] +1 ["bason"] ["bason hate pear"] [99] +2 ["andy"] ["andy love apple"] [100] +2 ["andy"] ["andy love apple"] [100] +2 ["bason"] ["bason hate pear"] [99] +2 ["bason"] ["bason hate pear"] [99] +3 ["andy"] ["andy love apple"] [100] +3 ["andy"] ["andy love apple"] [100] +3 ["bason"] ["bason hate pear"] [99] +3 ["bason"] ["bason hate pear"] [99] + +-- !sql -- +1 ["andy"] ["andy love apple"] [100] +1 ["andy"] ["andy love apple"] [100] +2 ["andy"] ["andy love apple"] [100] +2 ["andy"] ["andy love apple"] [100] +3 ["andy"] ["andy love apple"] [100] +3 ["andy"] ["andy love apple"] [100] + +-- !sql -- + +-- !sql -- +1 ["bason"] ["bason hate pear"] [99] +1 ["bason"] ["bason hate pear"] [99] +2 ["bason"] ["bason hate pear"] [99] +2 ["bason"] ["bason hate pear"] [99] +3 ["bason"] ["bason hate pear"] [99] +3 ["bason"] ["bason hate pear"] [99] + +-- !sql -- +1 ["andy"] ["andy love apple"] [100] +1 ["andy"] ["andy love apple"] [100] +1 ["bason"] ["bason hate pear"] [99] +1 ["bason"] ["bason hate pear"] [99] +2 ["andy"] ["andy love apple"] [100] +2 ["andy"] ["andy love apple"] [100] +2 ["bason"] ["bason hate pear"] [99] +2 ["bason"] ["bason hate pear"] [99] +3 ["andy"] ["andy love apple"] [100] +3 ["andy"] ["andy love apple"] [100] +3 ["bason"] ["bason hate pear"] [99] +3 ["bason"] ["bason hate pear"] [99] + +-- !sql -- +1 ["andy"] ["andy love apple"] [100] +1 ["andy"] ["andy love apple"] [100] +2 ["andy"] ["andy love apple"] [100] +2 ["andy"] ["andy love apple"] [100] +3 ["andy"] ["andy love apple"] [100] +3 ["andy"] ["andy love apple"] [100] + +-- !sql -- + +-- !sql -- +1 ["bason"] ["bason hate pear"] [99] +1 ["bason"] ["bason hate pear"] [99] +2 ["bason"] ["bason hate pear"] [99] +2 ["bason"] ["bason hate pear"] [99] +3 ["bason"] ["bason hate pear"] [99] +3 ["bason"] ["bason hate pear"] [99] + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_index_compaction_null_arr.out b/regression-test/data/inverted_index_p0/array_contains/test_index_compaction_null_arr.out new file mode 100644 index 00000000000000..240dcaadafeb96 --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_index_compaction_null_arr.out @@ -0,0 +1,1531 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !select_0 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_1 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] + +-- !select_is_null_2 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_3 -- + +-- !select_is_null_4 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_5 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N + +-- !select_is_null_6 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_7 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] + +-- !select_is_null_8 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_9 -- +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] + +-- !select_is_null_10 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_11 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] + +-- !select_is_null_12 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_11 -- +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] + +-- !select_compare_12 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_13 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] + +-- !select_compare_14 -- +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_21 -- +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] + +-- !select_compare_22 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_23 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] + +-- !select_compare_24 -- +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_match_1 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N + +-- !select_match_2 -- + +-- !select_0 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_1 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] + +-- !select_is_null_2 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_3 -- + +-- !select_is_null_4 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_5 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N + +-- !select_is_null_6 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_7 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] + +-- !select_is_null_8 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_9 -- +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] + +-- !select_is_null_10 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_11 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] + +-- !select_is_null_12 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_11 -- +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] + +-- !select_compare_12 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_13 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] + +-- !select_compare_14 -- +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_21 -- +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] + +-- !select_compare_22 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_23 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] + +-- !select_compare_24 -- +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_match_1 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N + +-- !select_match_2 -- + +-- !select_0 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_1 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] + +-- !select_is_null_2 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_3 -- + +-- !select_is_null_4 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_5 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N + +-- !select_is_null_6 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_7 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] + +-- !select_is_null_8 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_9 -- +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] + +-- !select_is_null_10 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_11 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] + +-- !select_is_null_12 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_11 -- +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] + +-- !select_compare_12 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_13 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] + +-- !select_compare_14 -- +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_21 -- +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] + +-- !select_compare_22 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_23 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] + +-- !select_compare_24 -- +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_match_1 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N + +-- !select_match_2 -- + +-- !select_0 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_1 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] + +-- !select_is_null_2 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_3 -- + +-- !select_is_null_4 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_5 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N + +-- !select_is_null_6 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_7 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] + +-- !select_is_null_8 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_9 -- +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] + +-- !select_is_null_10 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_11 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] + +-- !select_is_null_12 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_11 -- +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] + +-- !select_compare_12 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_13 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] + +-- !select_compare_14 -- +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_21 -- +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] + +-- !select_compare_22 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_23 -- +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] + +-- !select_compare_24 -- +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_match_1 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N + +-- !select_match_2 -- + +-- !select_0 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_1 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] + +-- !select_is_null_2 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_3 -- + +-- !select_is_null_4 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_5 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N + +-- !select_is_null_6 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_7 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] + +-- !select_is_null_8 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_9 -- +6 ["shanghai"] [null] \N haha [null] + +-- !select_is_null_10 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_11 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] + +-- !select_is_null_12 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_11 -- +6 ["shanghai"] [null] \N haha [null] + +-- !select_compare_12 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_13 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] + +-- !select_compare_14 -- +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_21 -- +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] + +-- !select_compare_22 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_23 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] + +-- !select_compare_24 -- +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_match_1 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N + +-- !select_match_2 -- + +-- !select_0 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_1 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] + +-- !select_is_null_2 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_3 -- + +-- !select_is_null_4 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_5 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N + +-- !select_is_null_6 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_7 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] + +-- !select_is_null_8 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_9 -- +6 ["shanghai"] [null] \N haha [null] + +-- !select_is_null_10 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_11 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] + +-- !select_is_null_12 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_11 -- +6 ["shanghai"] [null] \N haha [null] + +-- !select_compare_12 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_13 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] + +-- !select_compare_14 -- +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_21 -- +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] + +-- !select_compare_22 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_23 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] + +-- !select_compare_24 -- +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_match_1 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N + +-- !select_match_2 -- + +-- !select_0 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_1 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] + +-- !select_is_null_2 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_3 -- + +-- !select_is_null_4 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_5 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N + +-- !select_is_null_6 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_7 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] + +-- !select_is_null_8 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_9 -- +6 ["shanghai"] [null] \N haha [null] + +-- !select_is_null_10 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_11 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] + +-- !select_is_null_12 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_11 -- +6 ["shanghai"] [null] \N haha [null] + +-- !select_compare_12 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_13 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] + +-- !select_compare_14 -- +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_21 -- +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] + +-- !select_compare_22 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_23 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] + +-- !select_compare_24 -- +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_match_1 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N + +-- !select_match_2 -- + +-- !select_0 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_1 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] + +-- !select_is_null_2 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_3 -- + +-- !select_is_null_4 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_5 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N + +-- !select_is_null_6 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_7 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] + +-- !select_is_null_8 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_9 -- +6 ["shanghai"] [null] \N haha [null] + +-- !select_is_null_10 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_11 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] + +-- !select_is_null_12 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_11 -- +6 ["shanghai"] [null] \N haha [null] + +-- !select_compare_12 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_13 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] + +-- !select_compare_14 -- +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_21 -- +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] + +-- !select_compare_22 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_23 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] + +-- !select_compare_24 -- +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_match_1 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N + +-- !select_match_2 -- + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_index_compaction_unique_keys_arr.out b/regression-test/data/inverted_index_p0/array_contains/test_index_compaction_unique_keys_arr.out new file mode 100644 index 00000000000000..3edad07916c9b5 --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_index_compaction_unique_keys_arr.out @@ -0,0 +1,69 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +1 bason bason hate pear 99 +2 bason bason hate pear 99 +3 bason bason hate pear 99 + +-- !sql -- + +-- !sql -- +1 bason bason hate pear 99 +2 bason bason hate pear 99 +3 bason bason hate pear 99 + +-- !sql -- +1 bason bason hate pear 99 +2 bason bason hate pear 99 +3 bason bason hate pear 99 + +-- !sql -- +1 bason bason hate pear 99 +2 bason bason hate pear 99 +3 bason bason hate pear 99 + +-- !sql -- + +-- !sql -- +1 bason bason hate pear 99 +2 bason bason hate pear 99 +3 bason bason hate pear 99 + +-- !sql -- +1 bason bason hate pear 99 +2 bason bason hate pear 99 +3 bason bason hate pear 99 + +-- !sql -- +1 bason bason hate pear 99 +2 bason bason hate pear 99 +3 bason bason hate pear 99 + +-- !sql -- + +-- !sql -- +1 bason bason hate pear 99 +2 bason bason hate pear 99 +3 bason bason hate pear 99 + +-- !sql -- +1 bason bason hate pear 99 +2 bason bason hate pear 99 +3 bason bason hate pear 99 + +-- !sql -- +1 bason bason hate pear 99 +2 bason bason hate pear 99 +3 bason bason hate pear 99 + +-- !sql -- + +-- !sql -- +1 bason bason hate pear 99 +2 bason bason hate pear 99 +3 bason bason hate pear 99 + +-- !sql -- +1 bason bason hate pear 99 +2 bason bason hate pear 99 +3 bason bason hate pear 99 + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_index_compaction_with_multi_index_segments_arr.out b/regression-test/data/inverted_index_p0/array_contains/test_index_compaction_with_multi_index_segments_arr.out new file mode 100644 index 00000000000000..d4ed37b8074529 --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_index_compaction_with_multi_index_segments_arr.out @@ -0,0 +1,219 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +2018-02-21T12:00 [1] ["I'm using the builds"] +2018-02-21T12:00 [1] ["I'm using the builds"] +2018-02-21T12:00 [2] ["I'm using the builds"] +2018-02-21T12:00 [2] ["I'm using the builds"] +2018-02-21T12:00 [3] ["I'm using the builds"] +2018-02-21T12:00 [3] ["I'm using the builds"] +2018-02-21T12:00 [4] ["I'm using the builds"] +2018-02-21T12:00 [4] ["I'm using the builds"] +2018-02-21T12:00 [5] ["I'm using the builds"] +2018-02-21T12:00 [5] ["I'm using the builds"] +2018-02-21T12:00 [6] ["I'm using the builds"] +2018-02-21T12:00 [6] ["I'm using the builds"] +2018-02-21T12:00 [7] ["I'm using the builds"] +2018-02-21T12:00 [7] ["I'm using the builds"] +2018-02-21T12:00 [8] ["I'm using the builds"] +2018-02-21T12:00 [8] ["I'm using the builds"] +2018-02-21T12:00 [9] ["I'm using the builds"] +2018-02-21T12:00 [9] ["I'm using the builds"] +2018-02-21T12:00 [10] ["I'm using the builds"] +2018-02-21T12:00 [10] ["I'm using the builds"] + +-- !sql -- + +-- !sql -- + +-- !sql -- +2018-02-21T12:00 [1] ["I'm using the builds"] +2018-02-21T12:00 [1] ["I'm using the builds"] +2018-02-21T12:00 [2] ["I'm using the builds"] +2018-02-21T12:00 [2] ["I'm using the builds"] +2018-02-21T12:00 [3] ["I'm using the builds"] +2018-02-21T12:00 [3] ["I'm using the builds"] +2018-02-21T12:00 [4] ["I'm using the builds"] +2018-02-21T12:00 [4] ["I'm using the builds"] +2018-02-21T12:00 [5] ["I'm using the builds"] +2018-02-21T12:00 [5] ["I'm using the builds"] +2018-02-21T12:00 [6] ["I'm using the builds"] +2018-02-21T12:00 [6] ["I'm using the builds"] +2018-02-21T12:00 [7] ["I'm using the builds"] +2018-02-21T12:00 [7] ["I'm using the builds"] + +-- !sql -- +2018-02-21T12:00 [1] ["I'm using the builds"] +2018-02-21T12:00 [1] ["I'm using the builds"] +2018-02-21T12:00 [2] ["I'm using the builds"] +2018-02-21T12:00 [2] ["I'm using the builds"] +2018-02-21T12:00 [3] ["I'm using the builds"] +2018-02-21T12:00 [3] ["I'm using the builds"] +2018-02-21T12:00 [4] ["I'm using the builds"] +2018-02-21T12:00 [4] ["I'm using the builds"] +2018-02-21T12:00 [5] ["I'm using the builds"] +2018-02-21T12:00 [5] ["I'm using the builds"] +2018-02-21T12:00 [6] ["I'm using the builds"] +2018-02-21T12:00 [6] ["I'm using the builds"] +2018-02-21T12:00 [7] ["I'm using the builds"] +2018-02-21T12:00 [7] ["I'm using the builds"] +2018-02-21T12:00 [8] ["I'm using the builds"] +2018-02-21T12:00 [8] ["I'm using the builds"] +2018-02-21T12:00 [9] ["I'm using the builds"] +2018-02-21T12:00 [9] ["I'm using the builds"] +2018-02-21T12:00 [10] ["I'm using the builds"] +2018-02-21T12:00 [10] ["I'm using the builds"] + +-- !sql -- + +-- !sql -- + +-- !sql -- +2018-02-21T12:00 [1] ["I'm using the builds"] +2018-02-21T12:00 [1] ["I'm using the builds"] +2018-02-21T12:00 [2] ["I'm using the builds"] +2018-02-21T12:00 [2] ["I'm using the builds"] +2018-02-21T12:00 [3] ["I'm using the builds"] +2018-02-21T12:00 [3] ["I'm using the builds"] +2018-02-21T12:00 [4] ["I'm using the builds"] +2018-02-21T12:00 [4] ["I'm using the builds"] +2018-02-21T12:00 [5] ["I'm using the builds"] +2018-02-21T12:00 [5] ["I'm using the builds"] +2018-02-21T12:00 [6] ["I'm using the builds"] +2018-02-21T12:00 [6] ["I'm using the builds"] +2018-02-21T12:00 [7] ["I'm using the builds"] +2018-02-21T12:00 [7] ["I'm using the builds"] + +-- !sql -- +2018-02-21T12:00 [1] ["I'm using the builds"] +2018-02-21T12:00 [1] ["I'm using the builds"] +2018-02-21T12:00 [1] ["I'm using the builds"] +2018-02-21T12:00 [2] ["I'm using the builds"] +2018-02-21T12:00 [2] ["I'm using the builds"] +2018-02-21T12:00 [2] ["I'm using the builds"] +2018-02-21T12:00 [3] ["I'm using the builds"] +2018-02-21T12:00 [3] ["I'm using the builds"] +2018-02-21T12:00 [3] ["I'm using the builds"] +2018-02-21T12:00 [4] ["I'm using the builds"] +2018-02-21T12:00 [4] ["I'm using the builds"] +2018-02-21T12:00 [4] ["I'm using the builds"] +2018-02-21T12:00 [5] ["I'm using the builds"] +2018-02-21T12:00 [5] ["I'm using the builds"] +2018-02-21T12:00 [5] ["I'm using the builds"] +2018-02-21T12:00 [6] ["I'm using the builds"] +2018-02-21T12:00 [6] ["I'm using the builds"] +2018-02-21T12:00 [6] ["I'm using the builds"] +2018-02-21T12:00 [7] ["I'm using the builds"] +2018-02-21T12:00 [7] ["I'm using the builds"] +2018-02-21T12:00 [7] ["I'm using the builds"] +2018-02-21T12:00 [8] ["I'm using the builds"] +2018-02-21T12:00 [8] ["I'm using the builds"] +2018-02-21T12:00 [8] ["I'm using the builds"] +2018-02-21T12:00 [9] ["I'm using the builds"] +2018-02-21T12:00 [9] ["I'm using the builds"] +2018-02-21T12:00 [9] ["I'm using the builds"] +2018-02-21T12:00 [10] ["I'm using the builds"] +2018-02-21T12:00 [10] ["I'm using the builds"] +2018-02-21T12:00 [10] ["I'm using the builds"] + +-- !sql -- + +-- !sql -- + +-- !sql -- +2018-02-21T12:00 [1] ["I'm using the builds"] +2018-02-21T12:00 [1] ["I'm using the builds"] +2018-02-21T12:00 [1] ["I'm using the builds"] +2018-02-21T12:00 [2] ["I'm using the builds"] +2018-02-21T12:00 [2] ["I'm using the builds"] +2018-02-21T12:00 [2] ["I'm using the builds"] +2018-02-21T12:00 [3] ["I'm using the builds"] +2018-02-21T12:00 [3] ["I'm using the builds"] +2018-02-21T12:00 [3] ["I'm using the builds"] +2018-02-21T12:00 [4] ["I'm using the builds"] +2018-02-21T12:00 [4] ["I'm using the builds"] +2018-02-21T12:00 [4] ["I'm using the builds"] +2018-02-21T12:00 [5] ["I'm using the builds"] +2018-02-21T12:00 [5] ["I'm using the builds"] +2018-02-21T12:00 [5] ["I'm using the builds"] +2018-02-21T12:00 [6] ["I'm using the builds"] +2018-02-21T12:00 [6] ["I'm using the builds"] +2018-02-21T12:00 [6] ["I'm using the builds"] +2018-02-21T12:00 [7] ["I'm using the builds"] +2018-02-21T12:00 [7] ["I'm using the builds"] +2018-02-21T12:00 [7] ["I'm using the builds"] + +-- !sql -- +2018-02-21T12:00 [1] ["I'm using the builds"] +2018-02-21T13:00 [2] ["I'm using the builds"] +2018-02-21T14:00 [3] ["I'm using the builds"] +2018-02-21T15:00 [4] ["I'm using the builds"] +2018-02-21T16:00 [5] ["I'm using the builds"] +2018-02-21T17:00 [6] ["I'm using the builds"] +2018-02-21T18:00 [7] ["I'm using the builds"] +2018-02-21T19:00 [8] ["I'm using the builds"] +2018-02-21T20:00 [9] ["I'm using the builds"] +2018-02-21T21:00 [10] ["I'm using the builds"] + +-- !sql -- + +-- !sql -- + +-- !sql -- +2018-02-21T12:00 [1] ["I'm using the builds"] +2018-02-21T13:00 [2] ["I'm using the builds"] +2018-02-21T14:00 [3] ["I'm using the builds"] +2018-02-21T15:00 [4] ["I'm using the builds"] +2018-02-21T16:00 [5] ["I'm using the builds"] +2018-02-21T17:00 [6] ["I'm using the builds"] +2018-02-21T18:00 [7] ["I'm using the builds"] + +-- !sql -- +2018-02-21T12:00 [1] ["I'm using the builds"] +2018-02-21T13:00 [2] ["I'm using the builds"] +2018-02-21T14:00 [3] ["I'm using the builds"] +2018-02-21T15:00 [4] ["I'm using the builds"] +2018-02-21T16:00 [5] ["I'm using the builds"] +2018-02-21T17:00 [6] ["I'm using the builds"] +2018-02-21T18:00 [7] ["I'm using the builds"] +2018-02-21T19:00 [8] ["I'm using the builds"] +2018-02-21T20:00 [9] ["I'm using the builds"] +2018-02-21T21:00 [10] ["I'm using the builds"] + +-- !sql -- + +-- !sql -- + +-- !sql -- +2018-02-21T12:00 [1] ["I'm using the builds"] +2018-02-21T13:00 [2] ["I'm using the builds"] +2018-02-21T14:00 [3] ["I'm using the builds"] +2018-02-21T15:00 [4] ["I'm using the builds"] +2018-02-21T16:00 [5] ["I'm using the builds"] +2018-02-21T17:00 [6] ["I'm using the builds"] +2018-02-21T18:00 [7] ["I'm using the builds"] + +-- !sql -- +2018-02-21T12:00 [1] ["I'm using the builds"] +2018-02-21T13:00 [2] ["I'm using the builds"] +2018-02-21T14:00 [3] ["I'm using the builds"] +2018-02-21T15:00 [4] ["I'm using the builds"] +2018-02-21T16:00 [5] ["I'm using the builds"] +2018-02-21T17:00 [6] ["I'm using the builds"] +2018-02-21T18:00 [7] ["I'm using the builds"] +2018-02-21T19:00 [8] ["I'm using the builds"] +2018-02-21T20:00 [9] ["I'm using the builds"] +2018-02-21T21:00 [10] ["I'm using the builds"] + +-- !sql -- + +-- !sql -- + +-- !sql -- +2018-02-21T12:00 [1] ["I'm using the builds"] +2018-02-21T13:00 [2] ["I'm using the builds"] +2018-02-21T14:00 [3] ["I'm using the builds"] +2018-02-21T15:00 [4] ["I'm using the builds"] +2018-02-21T16:00 [5] ["I'm using the builds"] +2018-02-21T17:00 [6] ["I'm using the builds"] +2018-02-21T18:00 [7] ["I'm using the builds"] + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_index_delete_arr.out b/regression-test/data/inverted_index_p0/array_contains/test_index_delete_arr.out new file mode 100644 index 00000000000000..4515e2a712ddf0 --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_index_delete_arr.out @@ -0,0 +1,16 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +8 + +-- !sql -- +8 + +-- !sql -- +8 + +-- !sql -- +8 + +-- !sql -- +2 + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_index_empty_string_arr.out b/regression-test/data/inverted_index_p0/array_contains/test_index_empty_string_arr.out new file mode 100644 index 00000000000000..0970350d5f8b11 --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_index_empty_string_arr.out @@ -0,0 +1,7 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +1 + +-- !sql -- +1 + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_index_equal_select_arr.out b/regression-test/data/inverted_index_p0/array_contains/test_index_equal_select_arr.out new file mode 100644 index 00000000000000..0cafb23022afb3 --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_index_equal_select_arr.out @@ -0,0 +1,245 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- + +-- !sql -- + +-- !sql -- +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] + +-- !sql -- +li sisi [11] ["grade 6"] 2016-10-01T00:00 ["tall:150cm, weight: 40kg, hobbies: sing, dancing, running"] ["good at handiwork and beaty"] [""] ["li ba"] li liuliu +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] + +-- !sql -- +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] + +-- !sql -- +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book + +-- !sql -- +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book + +-- !sql -- +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- + +-- !sql -- +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- +li si [9] ["grade 4"] 2018-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies: playing ball"] ["A naughty boy"] ["i just want go outside"] ["li er"] wan jiu +li sisi [11] ["grade 6"] 2016-10-01T00:00 ["tall:150cm, weight: 40kg, hobbies: sing, dancing, running"] ["good at handiwork and beaty"] [""] ["li ba"] li liuliu +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- +li si [9] ["grade 4"] 2018-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies: playing ball"] ["A naughty boy"] ["i just want go outside"] ["li er"] wan jiu +li sisi [11] ["grade 6"] 2016-10-01T00:00 ["tall:150cm, weight: 40kg, hobbies: sing, dancing, running"] ["good at handiwork and beaty"] [""] ["li ba"] li liuliu + +-- !sql -- +li si [9] ["grade 4"] 2018-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies: playing ball"] ["A naughty boy"] ["i just want go outside"] ["li er"] wan jiu +li sisi [11] ["grade 6"] 2016-10-01T00:00 ["tall:150cm, weight: 40kg, hobbies: sing, dancing, running"] ["good at handiwork and beaty"] [""] ["li ba"] li liuliu +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- +li si [9] ["grade 4"] 2018-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies: playing ball"] ["A naughty boy"] ["i just want go outside"] ["li er"] wan jiu +li sisi [11] ["grade 6"] 2016-10-01T00:00 ["tall:150cm, weight: 40kg, hobbies: sing, dancing, running"] ["good at handiwork and beaty"] [""] ["li ba"] li liuliu +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book + +-- !sql -- +li si [9] ["grade 4"] 2018-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies: playing ball"] ["A naughty boy"] ["i just want go outside"] ["li er"] wan jiu +li sisi [11] ["grade 6"] 2016-10-01T00:00 ["tall:150cm, weight: 40kg, hobbies: sing, dancing, running"] ["good at handiwork and beaty"] [""] ["li ba"] li liuliu +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book + +-- !sql -- +li si [9] ["grade 4"] 2018-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies: playing ball"] ["A naughty boy"] ["i just want go outside"] ["li er"] wan jiu +li sisi [11] ["grade 6"] 2016-10-01T00:00 ["tall:150cm, weight: 40kg, hobbies: sing, dancing, running"] ["good at handiwork and beaty"] [""] ["li ba"] li liuliu +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] + +-- !sql -- +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- + +-- !sql -- +li si [9] ["grade 4"] 2018-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies: playing ball"] ["A naughty boy"] ["i just want go outside"] ["li er"] wan jiu +li sisi [11] ["grade 6"] 2016-10-01T00:00 ["tall:150cm, weight: 40kg, hobbies: sing, dancing, running"] ["good at handiwork and beaty"] [""] ["li ba"] li liuliu + +-- !sql -- +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book + +-- !sql -- +li si [9] ["grade 4"] 2018-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies: playing ball"] ["A naughty boy"] ["i just want go outside"] ["li er"] wan jiu +li sisi [11] ["grade 6"] 2016-10-01T00:00 ["tall:150cm, weight: 40kg, hobbies: sing, dancing, running"] ["good at handiwork and beaty"] [""] ["li ba"] li liuliu + +-- !sql -- + +-- !sql -- +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- +li si [9] ["grade 4"] 2018-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies: playing ball"] ["A naughty boy"] ["i just want go outside"] ["li er"] wan jiu +li sisi [11] ["grade 6"] 2016-10-01T00:00 ["tall:150cm, weight: 40kg, hobbies: sing, dancing, running"] ["good at handiwork and beaty"] [""] ["li ba"] li liuliu + +-- !sql -- +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book + +-- !sql -- +li si [9] ["grade 4"] 2018-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies: playing ball"] ["A naughty boy"] ["i just want go outside"] ["li er"] wan jiu +li sisi [11] ["grade 6"] 2016-10-01T00:00 ["tall:150cm, weight: 40kg, hobbies: sing, dancing, running"] ["good at handiwork and beaty"] [""] ["li ba"] li liuliu + +-- !sql -- +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] + +-- !sql -- +li si [9] ["grade 4"] 2018-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies: playing ball"] ["A naughty boy"] ["i just want go outside"] ["li er"] wan jiu +li sisi [11] ["grade 6"] 2016-10-01T00:00 ["tall:150cm, weight: 40kg, hobbies: sing, dancing, running"] ["good at handiwork and beaty"] [""] ["li ba"] li liuliu + +-- !sql -- +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book + +-- !sql -- +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- +li si [9] ["grade 4"] 2018-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies: playing ball"] ["A naughty boy"] ["i just want go outside"] ["li er"] wan jiu +li sisi [11] ["grade 6"] 2016-10-01T00:00 ["tall:150cm, weight: 40kg, hobbies: sing, dancing, running"] ["good at handiwork and beaty"] [""] ["li ba"] li liuliu + +-- !sql -- +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book + +-- !sql -- +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book + +-- !sql -- +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book + +-- !sql -- +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book + +-- !sql -- +li si [9] ["grade 4"] 2018-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies: playing ball"] ["A naughty boy"] ["i just want go outside"] ["li er"] wan jiu +li sisi [11] ["grade 6"] 2016-10-01T00:00 ["tall:150cm, weight: 40kg, hobbies: sing, dancing, running"] ["good at handiwork and beaty"] [""] ["li ba"] li liuliu +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book + +-- !sql -- +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book + +-- !sql -- +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- + +-- !sql -- +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book + +-- !sql -- + +-- !sql -- +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book + +-- !sql -- +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- +li si [9] ["grade 4"] 2018-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies: playing ball"] ["A naughty boy"] ["i just want go outside"] ["li er"] wan jiu +li sisi [11] ["grade 6"] 2016-10-01T00:00 ["tall:150cm, weight: 40kg, hobbies: sing, dancing, running"] ["good at handiwork and beaty"] [""] ["li ba"] li liuliu + +-- !sql -- +li si [9] ["grade 4"] 2018-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies: playing ball"] ["A naughty boy"] ["i just want go outside"] ["li er"] wan jiu +li sisi [11] ["grade 6"] 2016-10-01T00:00 ["tall:150cm, weight: 40kg, hobbies: sing, dancing, running"] ["good at handiwork and beaty"] [""] ["li ba"] li liuliu +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- +li si [9] ["grade 4"] 2018-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies: playing ball"] ["A naughty boy"] ["i just want go outside"] ["li er"] wan jiu +li sisi [11] ["grade 6"] 2016-10-01T00:00 ["tall:150cm, weight: 40kg, hobbies: sing, dancing, running"] ["good at handiwork and beaty"] [""] ["li ba"] li liuliu + +-- !sql -- +li si [9] ["grade 4"] 2018-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies: playing ball"] ["A naughty boy"] ["i just want go outside"] ["li er"] wan jiu +li sisi [11] ["grade 6"] 2016-10-01T00:00 ["tall:150cm, weight: 40kg, hobbies: sing, dancing, running"] ["good at handiwork and beaty"] [""] ["li ba"] li liuliu +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book + +-- !sql -- +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- +san zhang [10] ["grade 5"] 2017-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies:"] [""] [""] [""] +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- + +-- !sql -- +li si [9] ["grade 4"] 2018-10-01T00:00 ["tall:100cm, weight: 30kg, hobbies: playing ball"] ["A naughty boy"] ["i just want go outside"] ["li er"] wan jiu +li sisi [11] ["grade 6"] 2016-10-01T00:00 ["tall:150cm, weight: 40kg, hobbies: sing, dancing, running"] ["good at handiwork and beaty"] [""] ["li ba"] li liuliu +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- +zhang san [10] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: sing, dancing"] ["Like cultural and recreational activities"] ["Class activists"] ["zhang yi"] chen san buy dancing book +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + +-- !sql -- +zhang san yi [11] ["grade 5"] 2017-10-01T00:00 ["tall:120cm, weight: 35kg, hobbies: reading book"] ["A quiet little boy"] ["learn makes me happy"] ["zhang yi"] chen san buy + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_index_match_phrase_edge_arr.out b/regression-test/data/inverted_index_p0/array_contains/test_index_match_phrase_edge_arr.out new file mode 100644 index 00000000000000..3771cdbd0f057e --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_index_match_phrase_edge_arr.out @@ -0,0 +1,21 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_index_match_regexp_arr.out b/regression-test/data/inverted_index_p0/array_contains/test_index_match_regexp_arr.out new file mode 100644 index 00000000000000..bf59811cc65bc1 --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_index_match_regexp_arr.out @@ -0,0 +1,19 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + +-- !sql -- +0 + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_index_null_arr.out b/regression-test/data/inverted_index_p0/array_contains/test_index_null_arr.out new file mode 100644 index 00000000000000..f8770cc4bf13b5 --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_index_null_arr.out @@ -0,0 +1,11 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- + +-- !sql -- +1 [null] + +-- !sql -- + +-- !sql -- +2 \N + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_invalid_param.out b/regression-test/data/inverted_index_p0/array_contains/test_invalid_param.out new file mode 100644 index 00000000000000..c89a0d3b22fd3e --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_invalid_param.out @@ -0,0 +1,115 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +1 ["the"] + +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- +5 ["the will"] + +-- !sql -- +2 ["there be"] + +-- !sql -- +3 ["then but "] + +-- !sql -- + +-- !sql -- +4 ["at it was here"] + +-- !sql -- +8 [""] + +-- !sql -- +9 [" "] + +-- !sql -- + +-- !sql -- +1 ["the"] +1 ["the"] + +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- +5 ["the will"] +5 ["the will"] + +-- !sql -- +2 ["there be"] +2 ["there be"] + +-- !sql -- +3 ["then but "] +3 ["then but "] + +-- !sql -- + +-- !sql -- +4 ["at it was here"] +4 ["at it was here"] + +-- !sql -- +8 [""] +8 [""] + +-- !sql -- +9 [" "] +9 [" "] + +-- !sql -- + +-- !sql -- +1 ["the"] +1 ["the"] +1 ["the"] + +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- +5 ["the will"] +5 ["the will"] +5 ["the will"] + +-- !sql -- +2 ["there be"] +2 ["there be"] +2 ["there be"] + +-- !sql -- +3 ["then but "] +3 ["then but "] +3 ["then but "] + +-- !sql -- + +-- !sql -- +4 ["at it was here"] +4 ["at it was here"] +4 ["at it was here"] + +-- !sql -- +8 [""] +8 [""] +8 [""] + +-- !sql -- +9 [" "] +9 [" "] +9 [" "] + +-- !sql -- + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_inverted_index_null_arr.out b/regression-test/data/inverted_index_p0/array_contains/test_inverted_index_null_arr.out new file mode 100644 index 00000000000000..dfc602bf889097 --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_inverted_index_null_arr.out @@ -0,0 +1,130 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !select_0 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_1 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] + +-- !select_is_null_2 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_3 -- + +-- !select_is_null_4 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_5 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N + +-- !select_is_null_6 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_7 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] + +-- !select_is_null_8 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_9 -- +6 ["shanghai"] [null] \N haha [null] + +-- !select_is_null_10 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_is_null_11 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] + +-- !select_is_null_12 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_11 -- +6 ["shanghai"] [null] \N haha [null] + +-- !select_compare_12 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_13 -- +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +6 ["shanghai"] [null] \N haha [null] + +-- !select_compare_14 -- +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_21 -- +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] + +-- !select_compare_22 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +6 ["shanghai"] [null] \N haha [null] +7 ["tengxun"] ["qie"] addr gg lj [null] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_compare_23 -- +1 \N ["addr qie3"] yy lj [100] +2 \N ["hehe"] \N lala [200] +3 ["beijing"] ["addr xuanwu"] wugui \N [300] +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] + +-- !select_compare_24 -- +5 ["beijing"] ["addr chaoyang"] wangjing donghuqu [500] +8 ["tengxun2"] ["null"] \N lj [800] + +-- !select_match_1 -- +4 ["beijing"] ["addr fengtai"] fengtai1 fengtai2 \N + +-- !select_match_2 -- + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_lowercase_arr.out b/regression-test/data/inverted_index_p0/array_contains/test_lowercase_arr.out new file mode 100644 index 00000000000000..1a7f1da7921446 --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_lowercase_arr.out @@ -0,0 +1,136 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- +2 ["HELLO WORLD"] + +-- !sql -- +3 ["Hello World"] + +-- !sql -- +1 ["hello world"] + +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- +1 ["hello 我来到北京清华大学"] + +-- !sql -- +2 ["HELLO 我爱你中国"] + +-- !sql -- +3 ["Hello 人民可以得到更多实惠"] + +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- +1 ["hello 我来到北京清华大学"] + +-- !sql -- +2 ["HELLO 我爱你中国"] + +-- !sql -- +3 ["Hello 人民可以得到更多实惠"] + +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- +2 ["HELLO WORLD"] + +-- !sql -- +3 ["Hello World"] + +-- !sql -- +1 ["hello world"] + +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- +1 ["hello 我来到北京清华大学"] + +-- !sql -- +2 ["HELLO 我爱你中国"] + +-- !sql -- +3 ["Hello 人民可以得到更多实惠"] + +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- +1 ["hello 我来到北京清华大学"] + +-- !sql -- +2 ["HELLO 我爱你中国"] + +-- !sql -- +3 ["Hello 人民可以得到更多实惠"] + +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- +2 ["HELLO WORLD"] + +-- !sql -- +3 ["Hello World"] + +-- !sql -- +1 ["hello world"] + +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- +1 ["hello 我来到北京清华大学"] + +-- !sql -- +2 ["HELLO 我爱你中国"] + +-- !sql -- +3 ["Hello 人民可以得到更多实惠"] + +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- +1 ["hello 我来到北京清华大学"] + +-- !sql -- +2 ["HELLO 我爱你中国"] + +-- !sql -- +3 ["Hello 人民可以得到更多实惠"] + diff --git a/regression-test/data/inverted_index_p0/array_contains/test_parser_with_none_stopwords.out b/regression-test/data/inverted_index_p0/array_contains/test_parser_with_none_stopwords.out new file mode 100644 index 00000000000000..c89a0d3b22fd3e --- /dev/null +++ b/regression-test/data/inverted_index_p0/array_contains/test_parser_with_none_stopwords.out @@ -0,0 +1,115 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +1 ["the"] + +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- +5 ["the will"] + +-- !sql -- +2 ["there be"] + +-- !sql -- +3 ["then but "] + +-- !sql -- + +-- !sql -- +4 ["at it was here"] + +-- !sql -- +8 [""] + +-- !sql -- +9 [" "] + +-- !sql -- + +-- !sql -- +1 ["the"] +1 ["the"] + +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- +5 ["the will"] +5 ["the will"] + +-- !sql -- +2 ["there be"] +2 ["there be"] + +-- !sql -- +3 ["then but "] +3 ["then but "] + +-- !sql -- + +-- !sql -- +4 ["at it was here"] +4 ["at it was here"] + +-- !sql -- +8 [""] +8 [""] + +-- !sql -- +9 [" "] +9 [" "] + +-- !sql -- + +-- !sql -- +1 ["the"] +1 ["the"] +1 ["the"] + +-- !sql -- + +-- !sql -- + +-- !sql -- + +-- !sql -- +5 ["the will"] +5 ["the will"] +5 ["the will"] + +-- !sql -- +2 ["there be"] +2 ["there be"] +2 ["there be"] + +-- !sql -- +3 ["then but "] +3 ["then but "] +3 ["then but "] + +-- !sql -- + +-- !sql -- +4 ["at it was here"] +4 ["at it was here"] +4 ["at it was here"] + +-- !sql -- +8 [""] +8 [""] +8 [""] + +-- !sql -- +9 [" "] +9 [" "] +9 [" "] + +-- !sql -- + diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_add_drop_index_with_data_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_add_drop_index_with_data_arr.groovy new file mode 100644 index 00000000000000..b26e208c6c97fd --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_add_drop_index_with_data_arr.groovy @@ -0,0 +1,338 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + + +suite("test_add_drop_index_with_data_arr", "array_contains_inverted_index") { + // prepare test table + def timeout = 60000 + def delta_time = 1000 + def alter_res = "null" + def useTime = 0 + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + def wait_for_latest_op_on_table_finish = { table_name, OpTimeout -> + for(int t = delta_time; t <= OpTimeout; t += delta_time){ + alter_res = sql """SHOW ALTER TABLE COLUMN WHERE TableName = "${table_name}" ORDER BY CreateTime DESC LIMIT 1;""" + alter_res = alter_res.toString() + if(alter_res.contains("FINISHED")) { + sleep(3000) // wait change table state to normal + logger.info(table_name + " latest alter job finished, detail: " + alter_res) + break + } + useTime = t + sleep(delta_time) + } + assertTrue(useTime <= OpTimeout, "wait_for_latest_op_on_table_finish timeout") + } + + def wait_for_build_index_on_partition_finish = { table_name, OpTimeout -> + for(int t = delta_time; t <= OpTimeout; t += delta_time){ + alter_res = sql """SHOW BUILD INDEX WHERE TableName = "${table_name}";""" + def expected_finished_num = alter_res.size(); + def finished_num = 0; + for (int i = 0; i < expected_finished_num; i++) { + logger.info(table_name + " build index job state: " + alter_res[i][7] + i) + if (alter_res[i][7] == "FINISHED") { + ++finished_num; + } + } + if (finished_num == expected_finished_num) { + logger.info(table_name + " all build index jobs finished, detail: " + alter_res) + break + } + useTime = t + sleep(delta_time) + } + assertTrue(useTime <= OpTimeout, "wait_for_latest_build_index_on_partition_finish timeout") + } + + def indexTbName1 = "test_add_drop_inverted_index2_arr" + + sql "DROP TABLE IF EXISTS ${indexTbName1}" + // create 1 replica table + sql """ + CREATE TABLE IF NOT EXISTS ${indexTbName1} ( + `id` int(11) NULL, + `name` ARRAY NULL, + `description` ARRAY NULL, + INDEX idx_id (`id`) USING INVERTED COMMENT '', + INDEX idx_name (`name`) USING INVERTED PROPERTIES("parser"="none") COMMENT '' + ) + DUPLICATE KEY(`id`) + DISTRIBUTED BY HASH(`id`) BUCKETS 10 + properties("replication_num" = "1"); + """ + + def var_result = sql "show variables" + logger.info("show variales result: " + var_result ) + + // query rows where name='name1' + def sql_query_name1 = "select id, name[1], description[1] from ${indexTbName1} where array_contains(name,'name1')" + // query rows where name='name2' + def sql_query_name2 = "select id, name[1], description[1] from ${indexTbName1} where array_contains(name,'name2')" + // query rows where description match 'desc 1' + def sql_query_desc1 = "select id, name[1], description[1] from ${indexTbName1} where array_contains(description,'desc 1')" + // query rows where description match 'desc 2' + def sql_query_desc2 = "select id, name[1], description[1] from ${indexTbName1} where array_contains(description,'desc 2')" + // query rows where description match 'desc' + def sql_query_desc = "select id, name[1], description[1] from ${indexTbName1} where array_contains(description,'desc 1') OR array_contains(description,'desc 2') order by id" + + // show index of create table + def show_result = sql "show index from ${indexTbName1}" + logger.info("show index from " + indexTbName1 + " result: " + show_result) + assertEquals(show_result[0][2], "idx_id") + assertEquals(show_result[1][2], "idx_name") + + // insert data + sql "insert into ${indexTbName1} values (1, ['name1'], ['desc 1']), (2, ['name2'], ['desc 2'])" + + // query all rows + def select_result = sql "select id, name[1], description[1] from ${indexTbName1} order by id" + assertEquals(select_result.size(), 2) + assertEquals(select_result[0][0], 1) + assertEquals(select_result[0][1], "name1") + assertEquals(select_result[0][2], "desc 1") + assertEquals(select_result[1][0], 2) + assertEquals(select_result[1][1], "name2") + assertEquals(select_result[1][2], "desc 2") + + // query rows where name='name1' + select_result = sql sql_query_name1 + assertEquals(select_result.size(), 1) + assertEquals(select_result[0][0], 1) + assertEquals(select_result[0][1], "name1") + assertEquals(select_result[0][2], "desc 1") + + // query rows where name='name2' + select_result = sql sql_query_name2 + assertEquals(select_result.size(), 1) + assertEquals(select_result[0][0], 2) + assertEquals(select_result[0][1], "name2") + assertEquals(select_result[0][2], "desc 2") + + // query rows where description match 'desc', should fail without index + select_result = sql sql_query_desc + assertEquals(select_result.size(), 2) + assertEquals(select_result[0][0], 1) + assertEquals(select_result[0][1], "name1") + assertEquals(select_result[0][2], "desc 1") + assertEquals(select_result[1][0], 2) + assertEquals(select_result[1][1], "name2") + assertEquals(select_result[1][2], "desc 2") + + // add index on column description + sql "create index idx_desc on ${indexTbName1}(description) USING INVERTED PROPERTIES(\"parser\"=\"standard\");" + wait_for_latest_op_on_table_finish(indexTbName1, timeout) + if (!isCloudMode()) { + sql "build index idx_desc on ${indexTbName1}" + wait_for_build_index_on_partition_finish(indexTbName1, timeout) + } + // show index after add index + show_result = sql "show index from ${indexTbName1}" + logger.info("show index from " + indexTbName1 + " result: " + show_result) + assertEquals(show_result[0][2], "idx_id") + assertEquals(show_result[1][2], "idx_name") + assertEquals(show_result[2][2], "idx_desc") + + // query rows where description match 'desc' + select_result = sql sql_query_desc + assertEquals(select_result.size(), 2) + assertEquals(select_result[0][0], 1) + assertEquals(select_result[0][1], "name1") + assertEquals(select_result[0][2], "desc 1") + assertEquals(select_result[1][0], 2) + assertEquals(select_result[1][1], "name2") + assertEquals(select_result[1][2], "desc 2") + + // query rows where description match_all 'desc 1' + select_result = sql sql_query_desc1 + assertEquals(select_result.size(), 1) + assertEquals(select_result[0][0], 1) + assertEquals(select_result[0][1], "name1") + assertEquals(select_result[0][2], "desc 1") + + // query rows where description match_all 'desc 2' + select_result = sql sql_query_desc2 + assertEquals(select_result.size(), 1) + assertEquals(select_result[0][0], 2) + assertEquals(select_result[0][1], "name2") + assertEquals(select_result[0][2], "desc 2") + + // drop index + // add index on column description + sql "drop index idx_desc on ${indexTbName1}" + wait_for_latest_op_on_table_finish(indexTbName1, timeout) + + // query rows where description match 'desc', should fail without index + select_result = sql sql_query_desc + assertEquals(select_result.size(), 2) + assertEquals(select_result[0][0], 1) + assertEquals(select_result[0][1], "name1") + assertEquals(select_result[0][2], "desc 1") + assertEquals(select_result[1][0], 2) + assertEquals(select_result[1][1], "name2") + assertEquals(select_result[1][2], "desc 2") + + // query rows where name='name1' + select_result = sql sql_query_name1 + assertEquals(select_result.size(), 1) + assertEquals(select_result[0][0], 1) + assertEquals(select_result[0][1], "name1") + assertEquals(select_result[0][2], "desc 1") + + // query rows where name='name2' + select_result = sql sql_query_name2 + assertEquals(select_result.size(), 1) + assertEquals(select_result[0][0], 2) + assertEquals(select_result[0][1], "name2") + assertEquals(select_result[0][2], "desc 2") + + // drop idx_id index + sql "drop index idx_id on ${indexTbName1}" + wait_for_latest_op_on_table_finish(indexTbName1, timeout) + + // show index of create table + show_result = sql "show index from ${indexTbName1}" + logger.info("show index from " + indexTbName1 + " result: " + show_result) + assertEquals(show_result.size(), 1) + assertEquals(show_result[0][2], "idx_name") + + // query rows where name match 'name1' + select_result = sql sql_query_name1 + assertEquals(select_result.size(), 1) + assertEquals(select_result[0][0], 1) + assertEquals(select_result[0][1], "name1") + assertEquals(select_result[0][2], "desc 1") + + // query rows where name match 'name2' + select_result = sql sql_query_name2 + assertEquals(select_result.size(), 1) + assertEquals(select_result[0][0], 2) + assertEquals(select_result[0][1], "name2") + assertEquals(select_result[0][2], "desc 2") + + // drop idx_name index + sql "drop index idx_name on ${indexTbName1}" + wait_for_latest_op_on_table_finish(indexTbName1, timeout) + + // query rows where name match 'name1' without index + select_result = sql sql_query_name1 + assertEquals(select_result.size(), 1) + assertEquals(select_result[0][0], 1) + assertEquals(select_result[0][1], "name1") + assertEquals(select_result[0][2], "desc 1") + + // show index of create table + show_result = sql "show index from ${indexTbName1}" + logger.info("show index from " + indexTbName1 + " result: " + show_result) + assertEquals(show_result.size(), 0) + + // add index on column description + sql "create index idx_desc on ${indexTbName1}(description) USING INVERTED PROPERTIES(\"parser\"=\"standard\");" + wait_for_latest_op_on_table_finish(indexTbName1, timeout) + if (!isCloudMode()) { + sql "build index idx_desc on ${indexTbName1}" + wait_for_build_index_on_partition_finish(indexTbName1, timeout) + } + // query rows where description match 'desc' + select_result = sql sql_query_desc + assertEquals(select_result.size(), 2) + assertEquals(select_result[0][0], 1) + assertEquals(select_result[0][1], "name1") + assertEquals(select_result[0][2], "desc 1") + assertEquals(select_result[1][0], 2) + assertEquals(select_result[1][1], "name2") + assertEquals(select_result[1][2], "desc 2") + + // query rows where description match_all 'desc 1' + select_result = sql sql_query_desc1 + assertEquals(select_result.size(), 1) + assertEquals(select_result[0][0], 1) + assertEquals(select_result[0][1], "name1") + assertEquals(select_result[0][2], "desc 1") + + // query rows where description match_all 'desc 2' + select_result = sql sql_query_desc2 + assertEquals(select_result.size(), 1) + assertEquals(select_result[0][0], 2) + assertEquals(select_result[0][1], "name2") + assertEquals(select_result[0][2], "desc 2") + + // alter table add multiple index + select_result = sql """ + ALTER TABLE ${indexTbName1} + ADD INDEX idx_id (id) USING INVERTED, + ADD INDEX idx_name (name) USING INVERTED; + """ + wait_for_latest_op_on_table_finish(indexTbName1, timeout) + show_result = sql "show index from ${indexTbName1}" + logger.info("show index from " + indexTbName1 + " result: " + show_result) + assertEquals(show_result.size(), 3) + if (!isCloudMode()) { + sql "build index idx_name on ${indexTbName1}" + wait_for_build_index_on_partition_finish(indexTbName1, timeout) + } + + // query rows where name match 'name1' + select_result = sql sql_query_name1 + assertEquals(select_result.size(), 1) + assertEquals(select_result[0][0], 1) + assertEquals(select_result[0][1], "name1") + assertEquals(select_result[0][2], "desc 1") + + // query rows where name match 'name2' + select_result = sql sql_query_name2 + assertEquals(select_result.size(), 1) + assertEquals(select_result[0][0], 2) + assertEquals(select_result[0][1], "name2") + assertEquals(select_result[0][2], "desc 2") + + + // alter table drop multiple index + select_result = sql """ + ALTER TABLE ${indexTbName1} + DROP INDEX idx_id, + DROP INDEX idx_name, + DROP INDEX idx_desc; + """ + wait_for_latest_op_on_table_finish(indexTbName1, timeout) + show_result = sql "show index from ${indexTbName1}" + logger.info("show index from " + indexTbName1 + " result: " + show_result) + assertEquals(show_result.size(), 0) + + // query rows where name match 'name1' without index + select_result = sql sql_query_name1 + assertEquals(select_result.size(), 1) + assertEquals(select_result[0][0], 1) + assertEquals(select_result[0][1], "name1") + assertEquals(select_result[0][2], "desc 1") + + // query rows where description match 'desc' without index + select_result = sql sql_query_desc + assertEquals(select_result.size(), 2) + assertEquals(select_result[0][0], 1) + assertEquals(select_result[0][1], "name1") + assertEquals(select_result[0][2], "desc 1") + assertEquals(select_result[1][0], 2) + assertEquals(select_result[1][1], "name2") + assertEquals(select_result[1][2], "desc 2") +} diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_add_drop_index_with_delete_data_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_add_drop_index_with_delete_data_arr.groovy new file mode 100644 index 00000000000000..db6d670cfed031 --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_add_drop_index_with_delete_data_arr.groovy @@ -0,0 +1,273 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + + +suite("test_add_drop_index_with_delete_data_arr", "array_contains_inverted_index"){ + // prepare test table + def timeout = 60000 + def delta_time = 1000 + def alter_res = "null" + def useTime = 0 + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + def wait_for_latest_op_on_table_finish = { table_name, OpTimeout -> + for(int t = delta_time; t <= OpTimeout; t += delta_time){ + alter_res = sql """SHOW ALTER TABLE COLUMN WHERE TableName = "${table_name}" ORDER BY CreateTime DESC LIMIT 1;""" + alter_res = alter_res.toString() + if(alter_res.contains("FINISHED")) { + sleep(3000) // wait change table state to normal + logger.info(table_name + " latest alter job finished, detail: " + alter_res) + break + } + useTime = t + sleep(delta_time) + } + assertTrue(useTime <= OpTimeout, "wait_for_latest_op_on_table_finish timeout") + } + + def wait_for_build_index_on_partition_finish = { table_name, OpTimeout -> + for(int t = delta_time; t <= OpTimeout; t += delta_time){ + alter_res = sql """SHOW BUILD INDEX WHERE TableName = "${table_name}";""" + def expected_finished_num = alter_res.size(); + def finished_num = 0; + for (int i = 0; i < expected_finished_num; i++) { + logger.info(table_name + " build index job state: " + alter_res[i][7] + i) + if (alter_res[i][7] == "FINISHED") { + ++finished_num; + } + } + if (finished_num == expected_finished_num) { + logger.info(table_name + " all build index jobs finished, detail: " + alter_res) + break + } + useTime = t + sleep(delta_time) + } + assertTrue(useTime <= OpTimeout, "wait_for_latest_build_index_on_partition_finish timeout") + } + + def indexTbName1 = "test_add_drop_inverted_index3_arr" + + sql "DROP TABLE IF EXISTS ${indexTbName1}" + // create 1 replica table + sql """ + CREATE TABLE IF NOT EXISTS ${indexTbName1} ( + `id` int(11) NULL, + `name` ARRAY NULL, + `description` ARRAY NULL, + INDEX idx_id (`id`) USING INVERTED COMMENT '', + INDEX idx_name (`name`) USING INVERTED PROPERTIES("parser"="none") COMMENT '' + ) + DUPLICATE KEY(`id`) + DISTRIBUTED BY HASH(`id`) BUCKETS 10 + properties("replication_num" = "1"); + """ + + def var_result = sql "show variables" + logger.info("show variales result: " + var_result ) + + // show index of create table + def show_result = sql "show index from ${indexTbName1}" + logger.info("show index from " + indexTbName1 + " result: " + show_result) + assertEquals(show_result[0][2], "idx_id") + assertEquals(show_result[1][2], "idx_name") + + // insert data + sql """ insert into ${indexTbName1} VALUES + (1, ['name1'], ['desc test hello']), + (2, ['name2'], ['desc hello ok']), + (3, ['name3'], ['hello world']), + (4, ['name4'], ['desc ok world test']), + (5, ['name5'], ['desc world']) + """ + + def sql_query_desc = "select id, name[1], description[1] from ${indexTbName1} where array_contains(description, 'desc test hello') OR " + + "array_contains(description, 'desc hello ok') OR array_contains(description, 'desc ok world test') OR array_contains(description, 'desc world') order by id" + def sql_query_hello = "select id, name[1], description[1] from ${indexTbName1} where array_contains(description, 'hello') order by id" + def sql_query_world = "select id, name[1], description[1] from ${indexTbName1} where array_contains(description, 'hello world') OR " + + "array_contains(description, 'desc ok world test') OR array_contains(description,'desc world') order by id" + def sql_query_ok = "select id, name[1], description[1] from ${indexTbName1} where array_contains(description, 'desc hello ok')" + + "OR array_contains(description, 'desc ok world test') order by id" + + // query all rows + def select_result = sql "select id, name[1], description[1] from ${indexTbName1} order by id" + assertEquals(select_result.size(), 5) + assertEquals(select_result[0][0], 1) + assertEquals(select_result[0][1], "name1") + assertEquals(select_result[0][2], "desc test hello") + assertEquals(select_result[1][0], 2) + assertEquals(select_result[1][1], "name2") + assertEquals(select_result[1][2], "desc hello ok") + assertEquals(select_result[2][0], 3) + assertEquals(select_result[2][1], "name3") + assertEquals(select_result[2][2], "hello world") + assertEquals(select_result[3][0], 4) + assertEquals(select_result[3][1], "name4") + assertEquals(select_result[3][2], "desc ok world test") + assertEquals(select_result[4][0], 5) + assertEquals(select_result[4][1], "name5") + assertEquals(select_result[4][2], "desc world") + + // query rows where description match 'desc', should fail without index + select_result = sql sql_query_desc + assertEquals(select_result.size(), 4) + assertEquals(select_result[0][0], 1) + assertEquals(select_result[0][1], "name1") + assertEquals(select_result[0][2], "desc test hello") + assertEquals(select_result[1][0], 2) + assertEquals(select_result[1][1], "name2") + assertEquals(select_result[1][2], "desc hello ok") + assertEquals(select_result[2][0], 4) + assertEquals(select_result[2][1], "name4") + assertEquals(select_result[2][2], "desc ok world test") + assertEquals(select_result[3][0], 5) + assertEquals(select_result[3][1], "name5") + assertEquals(select_result[3][2], "desc world") + + // add index on column description + sql "create index idx_desc on ${indexTbName1}(description) USING INVERTED PROPERTIES(\"parser\"=\"standard\");" + wait_for_latest_op_on_table_finish(indexTbName1, timeout) + if (!isCloudMode()) { + sql "build index idx_desc on ${indexTbName1}" + wait_for_build_index_on_partition_finish(indexTbName1, timeout) + } + + // show index after add index + show_result = sql "show index from ${indexTbName1}" + logger.info("show index from " + indexTbName1 + " result: " + show_result) + assertEquals(show_result[0][2], "idx_id") + assertEquals(show_result[1][2], "idx_name") + assertEquals(show_result[2][2], "idx_desc") + + // query rows where description match 'desc' + select_result = sql sql_query_desc + assertEquals(select_result.size(), 4) + assertEquals(select_result[0][0], 1) + assertEquals(select_result[0][1], "name1") + assertEquals(select_result[0][2], "desc test hello") + assertEquals(select_result[1][0], 2) + assertEquals(select_result[1][1], "name2") + assertEquals(select_result[1][2], "desc hello ok") + assertEquals(select_result[2][0], 4) + assertEquals(select_result[2][1], "name4") + assertEquals(select_result[2][2], "desc ok world test") + assertEquals(select_result[3][0], 5) + assertEquals(select_result[3][1], "name5") + assertEquals(select_result[3][2], "desc world") + + // query rows where description match 'hello' + select_result = sql sql_query_hello + assertEquals(select_result.size(), 0) + + select_result = sql sql_query_ok + assertEquals(select_result.size(), 2) + assertEquals(select_result[0][0], 2) + assertEquals(select_result[0][1], "name2") + assertEquals(select_result[0][2], "desc hello ok") + assertEquals(select_result[1][0], 4) + assertEquals(select_result[1][1], "name4") + assertEquals(select_result[1][2], "desc ok world test") + + // drop index + sql "drop index idx_desc on ${indexTbName1}" + wait_for_latest_op_on_table_finish(indexTbName1, timeout) + // query rows where description match 'desc' without index + select_result = sql sql_query_desc + assertEquals(select_result.size(), 4) + assertEquals(select_result[0][0], 1) + assertEquals(select_result[0][1], "name1") + assertEquals(select_result[0][2], "desc test hello") + assertEquals(select_result[1][0], 2) + assertEquals(select_result[1][1], "name2") + assertEquals(select_result[1][2], "desc hello ok") + assertEquals(select_result[2][0], 4) + assertEquals(select_result[2][1], "name4") + assertEquals(select_result[2][2], "desc ok world test") + assertEquals(select_result[3][0], 5) + assertEquals(select_result[3][1], "name5") + assertEquals(select_result[3][2], "desc world") + + show_result = sql "show index from ${indexTbName1}" + logger.info("show index from " + indexTbName1 + " result: " + show_result) + assertEquals(show_result[0][2], "idx_id") + assertEquals(show_result[1][2], "idx_name") + + // delete row + sql "delete from ${indexTbName1} where id=2" + sql "delete from ${indexTbName1} where id=4" + + // query all rows + select_result = sql "select id, name[1], description[1] from ${indexTbName1} order by id" + assertEquals(select_result.size(), 3) + assertEquals(select_result[0][0], 1) + assertEquals(select_result[0][1], "name1") + assertEquals(select_result[0][2], "desc test hello") + assertEquals(select_result[1][0], 3) + assertEquals(select_result[1][1], "name3") + assertEquals(select_result[1][2], "hello world") + assertEquals(select_result[2][0], 5) + assertEquals(select_result[2][1], "name5") + assertEquals(select_result[2][2], "desc world") + + // add index on column description + sql "create index idx_desc on ${indexTbName1}(description) USING INVERTED PROPERTIES(\"parser\"=\"standard\");" + wait_for_latest_op_on_table_finish(indexTbName1, timeout) + if (!isCloudMode()) { + sql "build index idx_desc on ${indexTbName1}" + wait_for_build_index_on_partition_finish(indexTbName1, timeout) + } + + // show index after add index + show_result = sql "show index from ${indexTbName1}" + logger.info("show index from " + indexTbName1 + " result: " + show_result) + assertEquals(show_result[0][2], "idx_id") + assertEquals(show_result[1][2], "idx_name") + assertEquals(show_result[2][2], "idx_desc") + + // query rows where description match 'desc' + select_result = sql sql_query_desc + assertEquals(select_result.size(), 2) + assertEquals(select_result[0][0], 1) + assertEquals(select_result[0][1], "name1") + assertEquals(select_result[0][2], "desc test hello") + assertEquals(select_result[1][0], 5) + assertEquals(select_result[1][1], "name5") + assertEquals(select_result[1][2], "desc world") + + // query rows where description match 'hello' + select_result = sql sql_query_hello + assertEquals(select_result.size(), 0) + + // query rows where description match 'world' + select_result = sql sql_query_world + assertEquals(select_result.size(), 2) + assertEquals(select_result[0][0], 3) + assertEquals(select_result[0][1], "name3") + assertEquals(select_result[0][2], "hello world") + assertEquals(select_result[1][0], 5) + assertEquals(select_result[1][1], "name5") + assertEquals(select_result[1][2], "desc world") + + // query rows where description match 'ok' + select_result = sql sql_query_ok + assertEquals(select_result.size(), 0) +} diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_char_replace_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_char_replace_arr.groovy new file mode 100644 index 00000000000000..b325316e21dd4a --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_char_replace_arr.groovy @@ -0,0 +1,103 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + + +suite("test_char_replace_array_contains_arr", "array_contains_inverted_index") { + // prepare test table + def indexTblName = "test_char_replace_array_contains_arr" + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + sql "DROP TABLE IF EXISTS ${indexTblName}" + // create 1 replica table + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName}( + `id` int(11) NULL, + `a` array NULL, + `b` array NULL, + `c` array NULL, + INDEX a_idx(`a`) USING INVERTED PROPERTIES("parser" = "unicode", "support_phrase" = "true") COMMENT '', + INDEX b_idx(`b`) USING INVERTED PROPERTIES("parser" = "unicode", "support_phrase" = "true", "char_filter_type" = "char_replace", "char_filter_pattern" = "._", "char_filter_replacement" = " ") COMMENT '', + INDEX c_idx(`c`) USING INVERTED PROPERTIES("parser" = "unicode", "support_phrase" = "true", "char_filter_type" = "char_replace", "char_filter_pattern" = "._") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + def var_result = sql "show variables" + logger.info("show variales result: " + var_result ) + + sql """INSERT INTO ${indexTblName} VALUES + (1, ['GET /images/hm_bg.jpg HTTP/1.0'], ['GET /images/hm_bg.jpg HTTP/1.0'], ['GET /images/hm_bg.jpg HTTP/1.0']), + (2, ['GET /images/hm_bg.jpg HTTP/1.0'], ['GET /images/hm_bg.jpg HTTP/1.0'], ['GET /images/hm_bg.jpg HTTP/1.0']), + (3, ['GET /images/hm_bg.jpg HTTP/1.0'], ['GET /images/hm_bg.jpg HTTP/1.0'], ['GET /images/hm_bg.jpg HTTP/1.0']), + (4, ['GET /images/hm_bg.jpg HTTP/1.0'], ['GET /images/hm_bg.jpg HTTP/1.0'], ['GET /images/hm_bg.jpg HTTP/1.0']), + (5, ['GET /images/hm_bg.jpg HTTP/1.0'], ['GET /images/hm_bg.jpg HTTP/1.0'], ['GET /images/hm_bg.jpg HTTP/1.0']), + (6, ['GET /images/hm_bg.jpg HTTP/1.0'], ['GET /images/hm_bg.jpg HTTP/1.0'], ['GET /images/hm_bg.jpg HTTP/1.0']), + (7, ['GET /images/hm_bg.jpg HTTP/1.0'], ['GET /images/hm_bg.jpg HTTP/1.0'], ['GET /images/hm_bg.jpg HTTP/1.0']), + (8, ['GET /images/hm_bg.jpg HTTP/1.0'], ['GET /images/hm_bg.jpg HTTP/1.0'], ['GET /images/hm_bg.jpg HTTP/1.0']), + (9, ['GET /images/hm_bg.jpg HTTP/1.0'], ['GET /images/hm_bg.jpg HTTP/1.0'], ['GET /images/hm_bg.jpg HTTP/1.0']), + (10, ['GET /images/hm_bg.jpg HTTP/1.0'], ['GET /images/hm_bg.jpg HTTP/1.0'], ['GET /images/hm_bg.jpg HTTP/1.0']) + """ + + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(a, 'hm')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(a, 'bg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(a, 'jpg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(a, '1')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(a, '0')"; + + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(b, 'hm')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(b, 'bg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(b, 'jpg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(b, '1')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(b, '0')"; + + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(c, 'hm')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(c, 'bg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(c, 'jpg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(c, '1')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(c, '0')"; + + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(a, 'hm_bg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(a, 'hm_bg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(a, 'hm_bg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(a, 'hm bg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(a, 'hm bg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(a, 'hm bg')"; + + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(b, 'hm_bg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(b, 'hm_bg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(b, 'hm_bg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(b, 'hm bg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(b, 'hm bg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(b, 'hm bg')"; + + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(c, 'hm_bg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(c, 'hm_bg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(c, 'hm_bg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(c, 'hm bg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(c, 'hm bg')"; + qt_sql "SELECT count() FROM ${indexTblName} where array_contains(c, 'hm bg')"; +} diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_compound_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_compound_arr.groovy new file mode 100644 index 00000000000000..e4acc0b56f94b7 --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_compound_arr.groovy @@ -0,0 +1,69 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + + +suite("test_compound_arr", "array_contains_inverted_index"){ + def timeout = 60000 + def delta_time = 1000 + def alter_res = "null" + def useTime = 0 + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + def indexTblName = "test_compound_arr" + + sql "DROP TABLE IF EXISTS ${indexTblName}" + + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName}( + `id` int(11) NOT NULL, + `a` ARRAY NULL DEFAULT "[]", + `b` ARRAY NULL DEFAULT "[]", + `c` ARRAY NULL DEFAULT "[]", + INDEX a_idx(`a`) USING INVERTED COMMENT '', + INDEX b_idx(`b`) USING INVERTED COMMENT '', + INDEX c_idx(`c`) USING INVERTED COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + sql """ + INSERT INTO $indexTblName VALUES + (1, ['1'], ['1'], ['1']), + (2, ['2'], ['2'], ['2']), + (3, ['3'], ['3'], ['3']), + (4, ['4'], ['4'], ['4']), + (5, ['5'], ['5'], ['5']), + (6, ['6'], ['6'], ['6']), + (7, ['7'], ['7'], ['7']), + (8, ['8'], ['8'], ['8']), + (9, ['9'], ['9'], ['9']), + (10, ['10'], ['10'], ['10']); + """ + + qt_sql """SELECT count() FROM $indexTblName WHERE (id >= 2 AND id < 9) and (array_contains(a, '2') or array_contains(b, '5') and array_contains(c, '5'));""" + qt_sql "SELECT count() FROM $indexTblName WHERE (id >= 2 AND id < 9) and (array_contains(a, '2') or array_contains(b, '5') or array_contains(c, '6'));" +} diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_count_on_index_httplogs_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_count_on_index_httplogs_arr.groovy new file mode 100644 index 00000000000000..eeda4301a81ae3 --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_count_on_index_httplogs_arr.groovy @@ -0,0 +1,204 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +suite("test_count_on_index_httplogs_arr", "array_contains_inverted_index") { + // define a sql table + def testTable_dup = "httplogs_dup_arr" + def testTable_unique = "httplogs_unique_arr" + + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + def create_httplogs_dup_table = {testTablex -> + // multi-line sql + def result = sql """ + CREATE TABLE IF NOT EXISTS ${testTablex} ( + `@timestamp` int(11) NULL, + `clientip` array NULL, + `request` array NULL, + `status` array NULL, + `size` array NULL, + INDEX size_idx (`size`) USING INVERTED COMMENT '', + INDEX status_idx (`status`) USING INVERTED COMMENT '', + INDEX clientip_idx (`clientip`) USING INVERTED COMMENT '', + INDEX request_idx (`request`) USING INVERTED PROPERTIES("parser"="english") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`@timestamp`) + COMMENT 'OLAP' + PARTITION BY RANGE(`@timestamp`) + (PARTITION p181998 VALUES [("-2147483648"), ("894225602")), + PARTITION p191998 VALUES [("894225602"), ("894830402")), + PARTITION p201998 VALUES [("894830402"), ("895435201")), + PARTITION p211998 VALUES [("895435201"), ("896040001")), + PARTITION p221998 VALUES [("896040001"), ("896644801")), + PARTITION p231998 VALUES [("896644801"), ("897249601")), + PARTITION p241998 VALUES [("897249601"), ("897854300")), + PARTITION p251998 VALUES [("897854300"), ("2147483647"))) + DISTRIBUTED BY HASH(`@timestamp`) BUCKETS 12 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "storage_format" = "V2", + "compression" = "ZSTD", + "light_schema_change" = "true", + "disable_auto_compaction" = "false" + ); + """ + } + + def create_httplogs_unique_table = {testTablex -> + // multi-line sql + def result = sql """ + CREATE TABLE IF NOT EXISTS ${testTablex} ( + `@timestamp` int(11) NULL, + `clientip` array NULL, + `request` array NULL, + `status` array NULL, + `size` array NULL, + INDEX size_idx (`size`) USING INVERTED COMMENT '', + INDEX status_idx (`status`) USING INVERTED COMMENT '', + INDEX clientip_idx (`clientip`) USING INVERTED COMMENT '', + INDEX request_idx (`request`) USING INVERTED PROPERTIES("parser"="english") COMMENT '' + ) ENGINE=OLAP + UNIQUE KEY(`@timestamp`) + COMMENT 'OLAP' + PARTITION BY RANGE(`@timestamp`) + (PARTITION p181998 VALUES [("-2147483648"), ("894225602")), + PARTITION p191998 VALUES [("894225602"), ("894830402")), + PARTITION p201998 VALUES [("894830402"), ("895435201")), + PARTITION p211998 VALUES [("895435201"), ("896040001")), + PARTITION p221998 VALUES [("896040001"), ("896644801")), + PARTITION p231998 VALUES [("896644801"), ("897249601")), + PARTITION p241998 VALUES [("897249601"), ("897854300")), + PARTITION p251998 VALUES [("897854300"), ("2147483647"))) + DISTRIBUTED BY HASH(`@timestamp`) BUCKETS 12 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "enable_unique_key_merge_on_write" = "true", + "storage_format" = "V2", + "compression" = "ZSTD", + "light_schema_change" = "true", + "disable_auto_compaction" = "false" + ); + """ + } + + def load_httplogs_data = {table_name, label, read_flag, format_flag, file_name, ignore_failure=false, + expected_succ_rows = -1, load_to_single_tablet = 'true' -> + + // load the json data + streamLoad { + table "${table_name}" + + // set http request header params + set 'label', label + "_" + UUID.randomUUID().toString() + set 'read_json_by_line', read_flag + set 'format', format_flag + file file_name // import json file + time 10000 // limit inflight 10s + if (expected_succ_rows >= 0) { + set 'max_filter_ratio', '1' + } + + // if declared a check callback, the default check condition will ignore. + // So you must check all condition + check { result, exception, startTime, endTime -> + if (ignore_failure && expected_succ_rows < 0) { return } + if (exception != null) { + throw exception + } + log.info("Stream load result: ${result}".toString()) + def json = parseJson(result) + assertEquals("success", json.Status.toLowerCase()) + if (expected_succ_rows >= 0) { + assertEquals(json.NumberLoadedRows, expected_succ_rows) + } else { + assertEquals(json.NumberTotalRows, json.NumberLoadedRows + json.NumberUnselectedRows) + assertTrue(json.NumberLoadedRows > 0 && json.LoadBytes > 0) + } + } + } + } + + def sql_request_images = "select COUNT(*) from ${testTable_dup} where array_contains(request, 'images')" + def sql_request_images1 = "select COUNT(request) from ${testTable_dup} where array_contains(request, 'images')" + def sql_request_images2 = "select COUNT(size) from ${testTable_dup} where array_contains(request, 'images')" + + def sql_request_get = "select COUNT(*) from ${testTable_dup} where array_contains(request, 'GET')" + def sql_request_get1 = "select COUNT(size), COUNT(request) from ${testTable_dup} where array_contains(request, 'GET')" + def sql_request_get2 = "select COUNT(size), SUM(size[1]) from ${testTable_dup} where array_contains(request, 'GET')" + + def sql_uniq_request_images = "select COUNT(*) from ${testTable_unique} where array_contains(request, 'images')" + def sql_uniq_request_images1 = "select COUNT(request) from ${testTable_unique} where array_contains(request, 'images')" + def sql_uniq_request_images2 = "select COUNT(size) from ${testTable_unique} where array_contains(request, 'images')" + + def sql_uniq_request_get = "select COUNT(*) from ${testTable_unique} where array_contains(request, 'GET')" + def sql_uniq_request_get1 = "select COUNT(size), COUNT(request) from ${testTable_unique} where array_contains(request, 'GET')" + def sql_uniq_request_get2 = "select COUNT(size), SUM(size[1]) from ${testTable_unique} where array_contains(request, 'GET')" + + + sql "DROP TABLE IF EXISTS ${testTable_dup}" + sql "DROP TABLE IF EXISTS ${testTable_unique}" + + create_httplogs_dup_table.call(testTable_dup) + create_httplogs_unique_table.call(testTable_unique) + + load_httplogs_data.call(testTable_dup, 'test_httplogs_load_count_on_index', 'true', 'json', 'documents-1000.json') + load_httplogs_data.call(testTable_unique, 'test_httplogs_load_count_on_index', 'true', 'json', 'documents-1000.json') + + sql "sync" + //sql """set experimental_enable_nereids_planner=true;""" + // sql """set enable_fallback_to_original_planner=false;""" + // case1: test duplicate table + qt_sql sql_request_images + qt_sql sql_request_get + + // case1.1: test duplicate table with null values. + sql " insert into ${testTable_dup} values(1683964756,null,['GET /images/hm_bg.jpg HTTP/1.0 '],null,null); " + qt_sql sql_request_get + qt_sql sql_request_images + + qt_sql sql_request_images1 + qt_sql sql_request_images2 + + // case1.2: test multiple count on different columns + qt_sql sql_request_get1 + + // case1.4: test count and sum on column + qt_sql sql_request_get2 + + // case2: test mow table + qt_sql sql_uniq_request_images + + // case2.1: test duplicate table with null values. + sql " insert into ${testTable_unique} values(1683964756,null,['GET /images/hm_bg.jpg HTTP/1.0 '],null,null); " + qt_sql sql_uniq_request_images1 + qt_sql sql_uniq_request_images2 + + // case2.2: test multiple count on different columns + qt_sql sql_uniq_request_get + qt_sql sql_uniq_request_get1 + + // case2.4: test count and sum on column + qt_sql sql_uniq_request_get2 + + // case4: test compound query when inverted_index_query disable + qt_sql "SELECT COUNT() from ${testTable_dup} where array_contains(request,'images') or (size[1] = 0 and status[1] > 400)" +} diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_equal_on_fulltext_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_equal_on_fulltext_arr.groovy new file mode 100644 index 00000000000000..2d8fbcfb88d569 --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_equal_on_fulltext_arr.groovy @@ -0,0 +1,52 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + + +suite("test_equal_on_fulltext_arr", "array_contains_inverted_index"){ + // prepare test table + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + def indexTblName = "test_equal_on_fulltext_arr" + + sql "DROP TABLE IF EXISTS ${indexTblName}" + // create 1 replica table + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName}( + `id`int(11)NULL, + `c` array NULL, + INDEX c_idx(`c`) USING INVERTED PROPERTIES("parser"="unicode") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + def var_result = sql "show variables" + logger.info("show variales result: " + var_result ) + + sql "INSERT INTO $indexTblName VALUES (1, ['I am the person']), (2, ['I am a person']), (3, ['I am your person']);" + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c,'I am a person') ORDER BY id;" + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'person') ORDER BY id;" +} diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_index_bkd_null_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_index_bkd_null_arr.groovy new file mode 100644 index 00000000000000..973c42f8e3e071 --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_index_bkd_null_arr.groovy @@ -0,0 +1,52 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + + +suite("test_bkd_null_index_arr", "array_contains_inverted_index"){ + // prepare test table + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + def indexTblName = "bkd_null_index_test_arr" + + sql "DROP TABLE IF EXISTS ${indexTblName}" + // create 1 replica table + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName}( + `id` int(11) NOT NULL, + `value` array NULL, + INDEX c_value_idx(`value`) USING INVERTED COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + def var_result = sql "show variables" + logger.info("show variales result: " + var_result ) + + sql "INSERT INTO $indexTblName VALUES (1, NULL);" + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(value,1);" + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(value,null);" +} diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_index_change_2_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_index_change_2_arr.groovy new file mode 100644 index 00000000000000..7b33f7f9349982 --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_index_change_2_arr.groovy @@ -0,0 +1,144 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import org.codehaus.groovy.runtime.IOGroovyMethods + +suite("test_index_change_2_arr", "array_contains_inverted_index") { + def timeout = 60000 + def delta_time = 1000 + def alter_res = "null" + def useTime = 0 + + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + def wait_for_latest_op_on_table_finish = { table_name, OpTimeout -> + for(int t = delta_time; t <= OpTimeout; t += delta_time){ + alter_res = sql """SHOW ALTER TABLE COLUMN WHERE TableName = "${table_name}" ORDER BY CreateTime DESC LIMIT 1;""" + alter_res = alter_res.toString() + if(alter_res.contains("FINISHED")) { + sleep(10000) // wait change table state to normal + logger.info(table_name + " latest alter job finished, detail: " + alter_res) + break + } + useTime = t + sleep(delta_time) + } + assertTrue(useTime <= OpTimeout, "wait_for_latest_op_on_table_finish timeout") + } + + def wait_for_build_index_on_partition_finish = { table_name, OpTimeout -> + for(int t = delta_time; t <= OpTimeout; t += delta_time){ + alter_res = sql """SHOW BUILD INDEX WHERE TableName = "${table_name}";""" + def expected_finished_num = alter_res.size(); + def finished_num = 0; + for (int i = 0; i < expected_finished_num; i++) { + logger.info(table_name + " build index job state: " + alter_res[i][7] + i) + if (alter_res[i][7] == "FINISHED") { + ++finished_num; + } + } + if (finished_num == expected_finished_num) { + sleep(10000) + logger.info(table_name + " all build index jobs finished, detail: " + alter_res) + break + } + useTime = t + sleep(delta_time) + } + assertTrue(useTime <= OpTimeout, "wait_for_latest_build_index_on_partition_finish timeout") + } + + def tableName = "test_index_change_2_arr" + + sql """ DROP TABLE IF EXISTS ${tableName} """ + sql """ + CREATE TABLE IF NOT EXISTS ${tableName} ( + `user_id` LARGEINT NOT NULL COMMENT "用户id", + `date` DATE NOT NULL COMMENT "数据灌入日期时间", + `age` SMALLINT COMMENT "用户年龄", + `sex` TINYINT COMMENT "用户性别", + `city` array COMMENT "用户所在城市", + `note` array COMMENT "备注", + INDEX idx_user_id (`user_id`) USING INVERTED COMMENT '', + INDEX idx_note (`note`) USING INVERTED PROPERTIES("parser" = "english") COMMENT '' + ) + DUPLICATE KEY(`user_id`, `date`, `age`, `sex`) DISTRIBUTED BY HASH(`user_id`) + PROPERTIES ( "replication_num" = "1" ); + """ + + sql """ INSERT INTO ${tableName} (user_id, date, city, age, sex, note) VALUES + (1, '2017-10-01', ['Beijing China'], 10, 1, ['Software Developer']) + """ + + sql """ INSERT INTO ${tableName} (user_id, date, city, age, sex, note) VALUES + (2, '2017-10-01', ['Beijing China'], 10, 1, ['Communication Engineer']) + """ + + sql """ INSERT INTO ${tableName} (user_id, date, city, age, sex, note) VALUES + (3, '2017-10-01', ['Shanghai China'], 10, 1, ['electrical engineer']) + """ + + sql """ INSERT INTO ${tableName} (user_id, date, city, age, sex, note) VALUES + (4, '2017-10-02', ['Beijing China'], 10, 0, ['Both a teacher and a scientist']) + """ + + sql """ INSERT INTO ${tableName} (user_id, date, city, age, sex, note) VALUES + (5, '2017-10-02', ['Shenzhen China'], 10, 1, ['teacher']) + """ + + sql """ INSERT INTO ${tableName} (user_id, date, city, age, sex, note) VALUES + (6, '2017-10-03', ['Hongkong China'], 10, 1, ['Architectural designer']) + """ + + + + qt_select1 """ SELECT * FROM ${tableName} t ORDER BY user_id,date,city[1],age,sex; """ + qt_select2 """ SELECT * FROM ${tableName} t WHERE city MATCH 'beijing' ORDER BY user_id; """ + qt_select3 """ SELECT * FROM ${tableName} t WHERE city MATCH 'beijing' and sex = 1 ORDER BY user_id; """ + qt_select4 """ SELECT * FROM ${tableName} t WHERE note MATCH 'engineer' and sex = 0 ORDER BY user_id; """ + qt_select5 """ SELECT * FROM ${tableName} t WHERE note MATCH_PHRASE 'electrical engineer' ORDER BY user_id; """ + qt_select6 """ SELECT * FROM ${tableName} t WHERE note MATCH 'engineer Developer' AND city match_all 'Shanghai China' ORDER BY user_id; """ + + // create inverted index idx_city + sql """ CREATE INDEX idx_city ON ${tableName}(`city`) USING INVERTED PROPERTIES("parser"="english") """ + wait_for_latest_op_on_table_finish(tableName, timeout) + + // drop inverted index idx_user_id, idx_note + sql """ DROP INDEX idx_user_id ON ${tableName} """ + wait_for_latest_op_on_table_finish(tableName, timeout) + sql """ DROP INDEX idx_note ON ${tableName} """ + wait_for_latest_op_on_table_finish(tableName, timeout) + if (!isCloudMode()) { + wait_for_build_index_on_partition_finish(tableName, timeout) + } + + def show_result = sql "show index from ${tableName}" + logger.info("show index from " + tableName + " result: " + show_result) + assertEquals(show_result.size(), 1) + assertEquals(show_result[0][2], "idx_city") + + qt_select7 """ SELECT * FROM ${tableName} t WHERE array_contains(city, 'beijing') ORDER BY user_id; """ + qt_select8 """ SELECT * FROM ${tableName} t WHERE array_contains(city, 'beijing') and sex = 1 ORDER BY user_id; """ + qt_select9 """ SELECT * FROM ${tableName} t WHERE array_contains(note, 'engineer') and sex = 0 ORDER BY user_id; """ + qt_select10 """ SELECT * FROM ${tableName} t WHERE array_contains(note, 'electrical engineer') ORDER BY user_id; """ + qt_select11 """ SELECT * FROM ${tableName} t WHERE array_contains(note, 'engineer Developer') AND array_contains(city, 'Shanghai China') ORDER BY user_id; """ +} diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_index_change_4_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_index_change_4_arr.groovy new file mode 100644 index 00000000000000..910adcaae3bbcc --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_index_change_4_arr.groovy @@ -0,0 +1,145 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import org.codehaus.groovy.runtime.IOGroovyMethods + +suite("test_index_change_4_arr", "array_contains_inverted_index") { + def timeout = 60000 + def delta_time = 1000 + def alter_res = "null" + def useTime = 0 + + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + def wait_for_latest_op_on_table_finish = { table_name, OpTimeout -> + for(int t = delta_time; t <= OpTimeout; t += delta_time){ + alter_res = sql """SHOW ALTER TABLE COLUMN WHERE TableName = "${table_name}" ORDER BY CreateTime DESC LIMIT 1;""" + alter_res = alter_res.toString() + if(alter_res.contains("FINISHED")) { + sleep(10000) // wait change table state to normal + logger.info(table_name + " latest alter job finished, detail: " + alter_res) + break + } + useTime = t + sleep(delta_time) + } + assertTrue(useTime <= OpTimeout, "wait_for_latest_op_on_table_finish timeout") + } + + def wait_for_build_index_on_partition_finish = { table_name, OpTimeout -> + for(int t = delta_time; t <= OpTimeout; t += delta_time){ + alter_res = sql """SHOW BUILD INDEX WHERE TableName = "${table_name}";""" + def expected_finished_num = alter_res.size(); + def finished_num = 0; + for (int i = 0; i < expected_finished_num; i++) { + logger.info(table_name + " build index job state: " + alter_res[i][7] + i) + if (alter_res[i][7] == "FINISHED") { + ++finished_num; + } + } + if (finished_num == expected_finished_num) { + sleep(10000) + logger.info(table_name + " all build index jobs finished, detail: " + alter_res) + break + } + useTime = t + sleep(delta_time) + } + assertTrue(useTime <= OpTimeout, "wait_for_latest_build_index_on_partition_finish timeout") + } + + def tableName = "test_index_change_4_arr" + + sql """ DROP TABLE IF EXISTS ${tableName} """ + sql """ + CREATE TABLE IF NOT EXISTS ${tableName} ( + `user_id` LARGEINT NOT NULL COMMENT "用户id", + `date` DATE NOT NULL COMMENT "数据灌入日期时间", + + `age` SMALLINT COMMENT "用户年龄", + `sex` TINYINT COMMENT "用户性别", + `city` array COMMENT "用户所在城市", + `note` array COMMENT "备注", + INDEX idx_user_id (`user_id`) USING INVERTED COMMENT '', + INDEX idx_note (`note`) USING INVERTED PROPERTIES("parser" = "english") COMMENT '' + ) + DUPLICATE KEY(`user_id`, `date`, `age`, `sex`) DISTRIBUTED BY HASH(`user_id`) + PROPERTIES ( "replication_num" = "1" ); + """ + + sql """ INSERT INTO ${tableName} (user_id, date, city, age, sex, note) VALUES + (1, '2017-10-01', ['Beijing China'], 10, 1, ['Software Developer']) + """ + + sql """ INSERT INTO ${tableName} (user_id, date, city, age, sex, note) VALUES + (2, '2017-10-01', ['Beijing China'], 10, 1, ['Communication Engineer']) + """ + + sql """ INSERT INTO ${tableName} (user_id, date, city, age, sex, note) VALUES + (3, '2017-10-01', ['Shanghai China'], 10, 1, ['electrical engineer']) + """ + + sql """ INSERT INTO ${tableName} (user_id, date, city, age, sex, note) VALUES + (4, '2017-10-02', ['Beijing China'], 10, 0, ['Both a teacher and a scientist']) + """ + + sql """ INSERT INTO ${tableName} (user_id, date, city, age, sex, note) VALUES + (5, '2017-10-02', ['Shenzhen China'], 10, 1, ['teacher']) + """ + + sql """ INSERT INTO ${tableName} (user_id, date, city, age, sex, note) VALUES + (6, '2017-10-03', ['Hongkong China'], 10, 1, ['Architectural designer']) + """ + + + qt_select1 """ SELECT * FROM ${tableName} t ORDER BY user_id,date,city[1],age,sex; """ + qt_select2_v1 """ SELECT * FROM ${tableName} t WHERE array_contains(city, 'beijing') ORDER BY user_id; """ + qt_select3_v1 """ SELECT * FROM ${tableName} t WHERE array_contains(city, 'beijing') and sex = 1 ORDER BY user_id; """ + qt_select4_v1 """ SELECT * FROM ${tableName} t WHERE array_contains(note, 'engineer') and sex = 0 ORDER BY user_id; """ + qt_select5_v1 """ SELECT * FROM ${tableName} t WHERE array_contains(note, 'electrical engineer') ORDER BY user_id; """ + qt_select6_v1 """ SELECT * FROM ${tableName} t WHERE array_contains(note, 'engineer Developer') AND array_contains(city, 'Shanghai China') ORDER BY user_id; """ + + // drop inverted index idx_user_id, idx_note + sql """ DROP INDEX idx_user_id ON ${tableName} """ + wait_for_latest_op_on_table_finish(tableName, timeout) + sql """ DROP INDEX idx_note ON ${tableName} """ + wait_for_latest_op_on_table_finish(tableName, timeout) + // create inverted index idx_city + sql """ CREATE INDEX idx_note ON ${tableName}(`note`) USING INVERTED PROPERTIES("parser"="english") """ + wait_for_latest_op_on_table_finish(tableName, timeout) + // build index + if (!isCloudMode()) { + sql """ BUILD INDEX idx_note ON ${tableName} """ + wait_for_build_index_on_partition_finish(tableName, timeout) + } + + def show_result = sql "show index from ${tableName}" + logger.info("show index from " + tableName + " result: " + show_result) + assertEquals(show_result.size(), 1) + assertEquals(show_result[0][2], "idx_note") + + qt_select7_v1 """ SELECT * FROM ${tableName} t WHERE array_contains(city, 'beijing') ORDER BY user_id; """ + qt_select8_v1 """ SELECT * FROM ${tableName} t WHERE array_contains(city, 'beijing') and sex = 1 ORDER BY user_id; """ + qt_select9_v1 """ SELECT * FROM ${tableName} t WHERE array_contains(note, 'engineer') and sex = 0 ORDER BY user_id; """ + qt_select10_v1 """ SELECT * FROM ${tableName} t WHERE array_contains(note, 'electrical engineer') ORDER BY user_id; """ + qt_select11_v1 """ SELECT * FROM ${tableName} t WHERE array_contains(note, 'engineer Developer') AND array_contains(city, 'Shanghai China') ORDER BY user_id; """ +} diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_index_change_6_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_index_change_6_arr.groovy new file mode 100644 index 00000000000000..e06b0db5ed0567 --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_index_change_6_arr.groovy @@ -0,0 +1,149 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import org.codehaus.groovy.runtime.IOGroovyMethods + +suite("test_index_change_6_arr", "array_contains_inverted_index") { + def timeout = 60000 + def delta_time = 1000 + def alter_res = "null" + def useTime = 0 + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + def wait_for_latest_op_on_table_finish = { table_name, OpTimeout -> + for(int t = delta_time; t <= OpTimeout; t += delta_time){ + alter_res = sql """SHOW ALTER TABLE COLUMN WHERE TableName = "${table_name}" ORDER BY CreateTime DESC LIMIT 1;""" + alter_res = alter_res.toString() + if(alter_res.contains("FINISHED")) { + sleep(3000) // wait change table state to normal + logger.info(table_name + " latest alter job finished, detail: " + alter_res) + break + } + useTime = t + sleep(delta_time) + } + assertTrue(useTime <= OpTimeout, "wait_for_latest_op_on_table_finish timeout") + } + + def wait_for_build_index_on_partition_finish = { table_name, OpTimeout -> + for(int t = delta_time; t <= OpTimeout; t += delta_time){ + alter_res = sql """SHOW BUILD INDEX WHERE TableName = "${table_name}";""" + def expected_finished_num = alter_res.size(); + def finished_num = 0; + for (int i = 0; i < expected_finished_num; i++) { + logger.info(table_name + " build index job state: " + alter_res[i][7] + i) + if (alter_res[i][7] == "FINISHED") { + ++finished_num; + } + } + if (finished_num == expected_finished_num) { + logger.info(table_name + " all build index jobs finished, detail: " + alter_res) + break + } + useTime = t + sleep(delta_time) + } + assertTrue(useTime <= OpTimeout, "wait_for_latest_build_index_on_partition_finish timeout") + } + + def tableName = "test_index_change_6_arr" + + sql """ DROP TABLE IF EXISTS ${tableName} """ + sql """ + CREATE TABLE IF NOT EXISTS ${tableName} ( + `user_id` LARGEINT NOT NULL COMMENT "用户id", + `date` DATE NOT NULL COMMENT "数据灌入日期时间", + + `age` SMALLINT COMMENT "用户年龄", + `sex` TINYINT COMMENT "用户性别", + `city` array COMMENT "用户所在城市", + `note` array COMMENT "备注", + INDEX idx_user_id (`user_id`) USING INVERTED COMMENT '', + INDEX idx_note (`note`) USING INVERTED PROPERTIES("parser" = "english") COMMENT '' + ) + DUPLICATE KEY(`user_id`, `date`, `age`, `sex`) DISTRIBUTED BY HASH(`user_id`) + PROPERTIES ( "replication_num" = "1" ); + """ + + sql """ INSERT INTO ${tableName} (user_id, date, city, age, sex, note) VALUES + (1, '2017-10-01', ['Beijing China'], 10, 1, ['Software Developer']) + """ + + sql """ INSERT INTO ${tableName} (user_id, date, city, age, sex, note) VALUES + (2, '2017-10-01', ['Beijing China'], 10, 1, ['Communication Engineer']) + """ + + sql """ INSERT INTO ${tableName} (user_id, date, city, age, sex, note) VALUES + (3, '2017-10-01', ['Shanghai China'], 10, 1, ['electrical engineer']) + """ + + sql """ INSERT INTO ${tableName} (user_id, date, city, age, sex, note) VALUES + (4, '2017-10-02', ['Beijing China'], 10, 0, ['Both a teacher and a scientist']) + """ + + sql """ INSERT INTO ${tableName} (user_id, date, city, age, sex, note) VALUES + (5, '2017-10-02', ['Shenzhen China'], 10, 1, ['teacher']) + """ + + sql """ INSERT INTO ${tableName} (user_id, date, city, age, sex, note) VALUES + (6, '2017-10-03', ['Hongkong China'], 10, 1, ['Architectural designer']) + """ + + qt_select1 """ SELECT * FROM ${tableName} t ORDER BY user_id,date,city[1],age,sex; """ + qt_select2_v1 """ SELECT * FROM ${tableName} t WHERE array_contains(city, 'beijing') ORDER BY user_id; """ + qt_select3_v1 """ SELECT * FROM ${tableName} t WHERE array_contains(city, 'beijing') and sex = 1 ORDER BY user_id; """ + qt_select4_v1 """ SELECT * FROM ${tableName} t WHERE array_contains(note, 'engineer') and sex = 0 ORDER BY user_id; """ + qt_select5_v1 """ SELECT * FROM ${tableName} t WHERE array_contains(note, 'electrical engineer') ORDER BY user_id; """ + qt_select6_v1 """ SELECT * FROM ${tableName} t WHERE array_contains(note, 'engineer Developer') AND array_contains(city, 'Shanghai China') ORDER BY user_id; """ + + // drop inverted index idx_user_id, idx_note + sql """ DROP INDEX idx_user_id ON ${tableName} """ + wait_for_latest_op_on_table_finish(tableName, timeout) + sql """ DROP INDEX idx_note ON ${tableName} """ + wait_for_latest_op_on_table_finish(tableName, timeout) + + // create inverted index + sql """ CREATE INDEX idx_user_id ON ${tableName}(`user_id`) USING INVERTED """ + wait_for_latest_op_on_table_finish(tableName, timeout) + sql """ CREATE INDEX idx_note ON ${tableName}(`note`) USING INVERTED PROPERTIES("parser" = "unicode") """ + wait_for_latest_op_on_table_finish(tableName, timeout) + + // build inverted index + if (!isCloudMode()) { + sql """ BUILD INDEX idx_user_id ON ${tableName} """ + sql """ BUILD INDEX idx_note ON ${tableName} """ + wait_for_build_index_on_partition_finish(tableName, timeout) + } + + def show_result = sql "show index from ${tableName}" + logger.info("show index from " + tableName + " result: " + show_result) + assertEquals(show_result.size(), 2) + assertEquals(show_result[0][2], "idx_user_id") + assertEquals(show_result[1][2], "idx_note") + + qt_select7_v1 """ SELECT * FROM ${tableName} t WHERE array_contains(city, 'beijing') ORDER BY user_id; """ + qt_select8_v1 """ SELECT * FROM ${tableName} t WHERE array_contains(city, 'beijing') and sex = 1 ORDER BY user_id; """ + qt_select9_v1 """ SELECT * FROM ${tableName} t WHERE array_contains(note, 'engineer') and sex = 0 ORDER BY user_id; """ + qt_select10_v1 """ SELECT * FROM ${tableName} t WHERE array_contains(note, 'electrical engineer') ORDER BY user_id; """ + qt_select11_v1 """ SELECT * FROM ${tableName} t WHERE array_contains(note, 'engineer Developer') AND array_contains(city, 'Shanghai China') ORDER BY user_id; """ + + } diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_index_compaction_dup_keys_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_index_compaction_dup_keys_arr.groovy new file mode 100644 index 00000000000000..791b3965020caf --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_index_compaction_dup_keys_arr.groovy @@ -0,0 +1,250 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import org.codehaus.groovy.runtime.IOGroovyMethods + +suite("test_index_compaction_dup_keys_array", "array_contains_inverted_index") { + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + def isCloudMode = isCloudMode() + def tableName = "test_index_compaction_dup_keys_array" + def backendId_to_backendIP = [:] + def backendId_to_backendHttpPort = [:] + getBackendIpHttpPort(backendId_to_backendIP, backendId_to_backendHttpPort); + + boolean disableAutoCompaction = false + + def set_be_config = { key, value -> + for (String backend_id: backendId_to_backendIP.keySet()) { + def (code, out, err) = update_be_config(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), key, value) + logger.info("update config: code=" + code + ", out=" + out + ", err=" + err) + } + } + + def trigger_full_compaction_on_tablets = { tablets -> + for (def tablet : tablets) { + String tablet_id = tablet.TabletId + String backend_id = tablet.BackendId + int times = 1 + + String compactionStatus; + do{ + def (code, out, err) = be_run_full_compaction(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), tablet_id) + logger.info("Run compaction: code=" + code + ", out=" + out + ", err=" + err) + ++times + sleep(2000) + compactionStatus = parseJson(out.trim()).status.toLowerCase(); + } while (compactionStatus!="success" && times<=10) + + + if (compactionStatus == "fail") { + assertEquals(disableAutoCompaction, false) + logger.info("Compaction was done automatically!") + } + if (disableAutoCompaction) { + assertEquals("success", compactionStatus) + } + } + } + + def wait_full_compaction_done = { tablets -> + for (def tablet in tablets) { + boolean running = true + do { + Thread.sleep(1000) + String tablet_id = tablet.TabletId + String backend_id = tablet.BackendId + def (code, out, err) = be_get_compaction_status(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), tablet_id) + logger.info("Get compaction status: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def compactionStatus = parseJson(out.trim()) + assertEquals("success", compactionStatus.status.toLowerCase()) + running = compactionStatus.run_status + } while (running) + } + } + + def get_rowset_count = { tablets -> + int rowsetCount = 0 + for (def tablet in tablets) { + def (code, out, err) = curl("GET", tablet.CompactionStatus) + logger.info("Show tablets status: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def tabletJson = parseJson(out.trim()) + assert tabletJson.rowsets instanceof List + rowsetCount +=((List) tabletJson.rowsets).size() + } + return rowsetCount + } + + def check_config = { String key, String value -> + for (String backend_id: backendId_to_backendIP.keySet()) { + def (code, out, err) = show_be_config(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id)) + logger.info("Show config: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def configList = parseJson(out.trim()) + assert configList instanceof List + for (Object ele in (List) configList) { + assert ele instanceof List + if (((List) ele)[0] == key) { + assertEquals(value, ((List) ele)[2]) + } + } + } + } + + boolean invertedIndexCompactionEnable = false + boolean has_update_be_config = false + try { + String backend_id; + backend_id = backendId_to_backendIP.keySet()[0] + def (code, out, err) = show_be_config(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id)) + + logger.info("Show config: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def configList = parseJson(out.trim()) + assert configList instanceof List + + for (Object ele in (List) configList) { + assert ele instanceof List + if (((List) ele)[0] == "inverted_index_compaction_enable") { + invertedIndexCompactionEnable = Boolean.parseBoolean(((List) ele)[2]) + logger.info("inverted_index_compaction_enable: ${((List) ele)[2]}") + } + if (((List) ele)[0] == "disable_auto_compaction") { + disableAutoCompaction = Boolean.parseBoolean(((List) ele)[2]) + logger.info("disable_auto_compaction: ${((List) ele)[2]}") + } + } + set_be_config.call("inverted_index_compaction_enable", "true") + has_update_be_config = true + // check updated config + check_config.call("inverted_index_compaction_enable", "true"); + + sql """ DROP TABLE IF EXISTS ${tableName}; """ + sql """ + CREATE TABLE ${tableName} ( + `id` int(11) NULL, + `name` array NULL, + `hobbies` array NULL, + `score` array NULL, + index index_name (name) using inverted, + index index_hobbies (hobbies) using inverted properties("parser"="english"), + index index_score (score) using inverted + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES ( "replication_num" = "1", "disable_auto_compaction" = "true"); + """ + + sql """ INSERT INTO ${tableName} VALUES (1, ["andy"], ["andy love apple"], [100]); """ + sql """ INSERT INTO ${tableName} VALUES (1, ["bason"], ["bason hate pear"], [99]); """ + sql """ INSERT INTO ${tableName} VALUES (2, ["andy"], ["andy love apple"], [100]); """ + sql """ INSERT INTO ${tableName} VALUES (2, ["bason"], ["bason hate pear"], [99]); """ + sql """ INSERT INTO ${tableName} VALUES (3, ["andy"], ["andy love apple"], [100]); """ + sql """ INSERT INTO ${tableName} VALUES (3, ["bason"], ["bason hate pear"], [99]); """ + + qt_sql """ select * from ${tableName} order by id, name[1], hobbies[1], score[1] """ + qt_sql """ select * from ${tableName} where array_contains(name, "andy") order by id, name[1], hobbies[1], score[1] """ + qt_sql """ select * from ${tableName} where array_contains(hobbies, "pear") order by id, name[1], hobbies[1], score[1] """ + qt_sql """ select * from ${tableName} where score[1] < 100 order by id, name[1], hobbies[1], score[1] """ + + //TabletId,ReplicaId,BackendId,SchemaHash,Version,LstSuccessVersion,LstFailedVersion,LstFailedTime,LocalDataSize,RemoteDataSize,RowCount,State,LstConsistencyCheckTime,CheckVersion,VersionCount,PathHash,MetaUrl,CompactionStatus + def tablets = sql_return_maparray """ show tablets from ${tableName}; """ + def dedup_tablets = deduplicate_tablets(tablets) + + // In the p0 testing environment, there are no expected operations such as scaling down BE (backend) services + // if tablets or dedup_tablets is empty, exception is thrown, and case fail + int replicaNum = Math.floor(tablets.size() / dedup_tablets.size()) + if (replicaNum != 1 && replicaNum != 3) + { + assert(false); + } + + // before full compaction, there are 7 rowsets. + int rowsetCount = get_rowset_count.call(tablets); + assert (rowsetCount == 7 * replicaNum) + + // trigger full compactions for all tablets in ${tableName} + trigger_full_compaction_on_tablets.call(tablets) + + // wait for full compaction done + wait_full_compaction_done.call(tablets) + + // after full compaction, there is only 1 rowset. + rowsetCount = get_rowset_count.call(tablets); + if (isCloudMode) { + assert (rowsetCount == (1 + 1) * replicaNum) + } else { + assert (rowsetCount == 1 * replicaNum) + } + + qt_sql """ select * from ${tableName} order by id, name[1], hobbies[1], score[1] """ + qt_sql """ select * from ${tableName} where array_contains(name, "andy") order by id, name[1], hobbies[1], score[1] """ + qt_sql """ select * from ${tableName} where array_contains(hobbies, "pear") order by id, name[1], hobbies[1], score[1] """ + qt_sql """ select * from ${tableName} where score[1] < 100 order by id, name[1], hobbies[1], score[1] """ + + // insert more data and trigger full compaction again + sql """ INSERT INTO ${tableName} VALUES (1, ["andy"], ["andy love apple"], [100]); """ + sql """ INSERT INTO ${tableName} VALUES (1, ["bason"], ["bason hate pear"], [99]); """ + sql """ INSERT INTO ${tableName} VALUES (2, ["andy"], ["andy love apple"], [100]); """ + sql """ INSERT INTO ${tableName} VALUES (2, ["bason"], ["bason hate pear"], [99]); """ + sql """ INSERT INTO ${tableName} VALUES (3, ["andy"], ["andy love apple"], [100]); """ + sql """ INSERT INTO ${tableName} VALUES (3, ["bason"], ["bason hate pear"], [99]); """ + + qt_sql """ select * from ${tableName} order by id, name[1], hobbies[1], score[1] """ + qt_sql """ select * from ${tableName} where array_contains(name, "andy") order by id, name[1], hobbies[1], score[1] """ + qt_sql """ select * from ${tableName} where array_contains(hobbies, "pear") order by id, name[1], hobbies[1], score[1] """ + qt_sql """ select * from ${tableName} where score[1] < 100 order by id, name[1], hobbies[1], score[1] """ + + rowsetCount = get_rowset_count.call(tablets); + if (isCloudMode) { + assert (rowsetCount == (7 + 1) * replicaNum) + } else { + assert (rowsetCount == 7 * replicaNum) + } + // trigger full compactions for all tablets in ${tableName} + trigger_full_compaction_on_tablets.call(tablets) + + // wait for full compaction done + wait_full_compaction_done.call(tablets) + + // after full compaction, there is only 1 rowset. + rowsetCount = get_rowset_count.call(tablets); + if (isCloudMode) { + assert (rowsetCount == (1 + 1) * replicaNum) + } else { + assert (rowsetCount == 1 * replicaNum) + } + + qt_sql """ select * from ${tableName} order by id, name[1], hobbies[1], score[1] """ + qt_sql """ select * from ${tableName} where array_contains(name, "andy") order by id, name[1], hobbies[1], score[1] """ + qt_sql """ select * from ${tableName} where array_contains(hobbies, "pear") order by id, name[1], hobbies[1], score[1] """ + qt_sql """ select * from ${tableName} where score[1] < 100 order by id, name[1], hobbies[1], score[1] """ + + } finally { + if (has_update_be_config) { + set_be_config.call("inverted_index_compaction_enable", invertedIndexCompactionEnable.toString()) + } + } +} diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_index_compaction_null_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_index_compaction_null_arr.groovy new file mode 100644 index 00000000000000..cfe163b9e3af10 --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_index_compaction_null_arr.groovy @@ -0,0 +1,329 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import org.codehaus.groovy.runtime.IOGroovyMethods + +suite("test_index_compaction_null_arr", "array_contains_inverted_index") { + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + def isCloudMode = isCloudMode() + def tableName = "test_index_compaction_null_dups_arr" + def backendId_to_backendIP = [:] + def backendId_to_backendHttpPort = [:] + getBackendIpHttpPort(backendId_to_backendIP, backendId_to_backendHttpPort); + + boolean disableAutoCompaction = false + + def set_be_config = { key, value -> + for (String backend_id: backendId_to_backendIP.keySet()) { + def (code, out, err) = update_be_config(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), key, value) + logger.info("update config: code=" + code + ", out=" + out + ", err=" + err) + } + } + + def trigger_full_compaction_on_tablets = { tablets -> + for (def tablet : tablets) { + String tablet_id = tablet.TabletId + String backend_id = tablet.BackendId + int times = 1 + + String compactionStatus; + do{ + def (code, out, err) = be_run_full_compaction(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), tablet_id) + logger.info("Run compaction: code=" + code + ", out=" + out + ", err=" + err) + ++times + sleep(2000) + compactionStatus = parseJson(out.trim()).status.toLowerCase(); + } while (compactionStatus!="success" && times<=10 && compactionStatus!="e-6010") + + + if (compactionStatus == "fail") { + assertEquals(disableAutoCompaction, false) + logger.info("Compaction was done automatically!") + } + if (disableAutoCompaction && compactionStatus!="e-6010") { + assertEquals("success", compactionStatus) + } + } + } + + def wait_full_compaction_done = { tablets -> + for (def tablet in tablets) { + boolean running = true + do { + Thread.sleep(1000) + String tablet_id = tablet.TabletId + String backend_id = tablet.BackendId + def (code, out, err) = be_get_compaction_status(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), tablet_id) + logger.info("Get compaction status: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def compactionStatus = parseJson(out.trim()) + assertEquals("success", compactionStatus.status.toLowerCase()) + running = compactionStatus.run_status + } while (running) + } + } + + def get_rowset_count = { tablets -> + int rowsetCount = 0 + for (def tablet in tablets) { + def (code, out, err) = curl("GET", tablet.CompactionStatus) + logger.info("Show tablets status: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def tabletJson = parseJson(out.trim()) + assert tabletJson.rowsets instanceof List + rowsetCount +=((List) tabletJson.rowsets).size() + } + return rowsetCount + } + + def check_config = { String key, String value -> + for (String backend_id: backendId_to_backendIP.keySet()) { + def (code, out, err) = show_be_config(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id)) + logger.info("Show config: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def configList = parseJson(out.trim()) + assert configList instanceof List + for (Object ele in (List) configList) { + assert ele instanceof List + if (((List) ele)[0] == key) { + assertEquals(value, ((List) ele)[2]) + } + } + } + } + + def insert_data = { -> + sql """insert into ${tableName} values + (1,null,['addr qie3'],'yy','lj',[100]), + (2,null,['hehe'],null,'lala',[200]), + (3,['beijing'],['addr xuanwu'],'wugui',null,[300]), + (4,['beijing'],['addr fengtai'],'fengtai1','fengtai2',null), + (5,['beijing'],['addr chaoyang'],'wangjing','donghuqu',[500]), + (6,['shanghai'],[null],null,'haha',[null]), + (7,['tengxun'],['qie'],'addr gg','lj',[null]), + (8,['tengxun2'],['null'],null,'lj',[800]) + """ + } + + def run_sql = { -> + // select all data + qt_select_0 "SELECT * FROM ${tableName} ORDER BY id" + + // test IS NULL , IS NOT NULL + qt_select_is_null_1 "SELECT * FROM ${tableName} WHERE city IS NULL ORDER BY id" + qt_select_is_null_2 "SELECT * FROM ${tableName} WHERE city IS NOT NULL ORDER BY id" + qt_select_is_null_3 "SELECT * FROM ${tableName} WHERE addr IS NULL ORDER BY id" + qt_select_is_null_4 "SELECT * FROM ${tableName} WHERE addr IS NOT NULL ORDER BY id" + qt_select_is_null_5 "SELECT * FROM ${tableName} WHERE n IS NULL ORDER BY id" + qt_select_is_null_6 "SELECT * FROM ${tableName} WHERE n IS NOT NULL ORDER BY id" + + // test array element IS NULL , IS NOT NULL + qt_select_is_null_7 "SELECT * FROM ${tableName} WHERE city[1] IS NULL ORDER BY id" + qt_select_is_null_8 "SELECT * FROM ${tableName} WHERE city[1] IS NOT NULL ORDER BY id" + qt_select_is_null_9 "SELECT * FROM ${tableName} WHERE addr[1] IS NULL ORDER BY id" + qt_select_is_null_10 "SELECT * FROM ${tableName} WHERE addr[1] IS NOT NULL ORDER BY id" + qt_select_is_null_11 "SELECT * FROM ${tableName} WHERE n[1] IS NULL ORDER BY id" + qt_select_is_null_12 "SELECT * FROM ${tableName} WHERE n[1] IS NOT NULL ORDER BY id" + + + // test compare predicate + qt_select_compare_11 "SELECT * FROM ${tableName} WHERE array_contains(city, 'shanghai') ORDER BY id" + qt_select_compare_12 "SELECT * FROM ${tableName} WHERE !array_contains(city, 'shanghai') ORDER BY id" + qt_select_compare_13 "SELECT * FROM ${tableName} WHERE city[1] <= 'shanghai' ORDER BY id" + qt_select_compare_14 "SELECT * FROM ${tableName} WHERE city[1] >= 'shanghai' ORDER BY id" + + qt_select_compare_21 "SELECT * FROM ${tableName} WHERE array_contains(n, 500) ORDER BY id" + qt_select_compare_22 "SELECT * FROM ${tableName} WHERE !array_contains(n, 500) ORDER BY id" + + qt_select_compare_23 "SELECT * FROM ${tableName} WHERE n[1] <= 500 ORDER BY id" + qt_select_compare_24 "SELECT * FROM ${tableName} WHERE n[1] >= 500 ORDER BY id" + + // test match predicates + qt_select_match_1 "SELECT * FROM ${tableName} WHERE array_contains(addr, 'addr fengtai') ORDER BY id" + qt_select_match_2 "SELECT * FROM ${tableName} WHERE array_contains(addr, 'addr') ORDER BY id" + } + + def run_test = { tablets -> + insert_data.call() + insert_data.call() + + run_sql.call() + + int replicaNum = 1 + def dedup_tablets = deduplicate_tablets(tablets) + if (dedup_tablets.size() > 0) { + replicaNum = Math.round(tablets.size() / dedup_tablets.size()) + if (replicaNum != 1 && replicaNum != 3) { + assert(false) + } + } + + // before full compaction, there are 3 rowsets. + int rowsetCount = get_rowset_count.call(tablets); + assert (rowsetCount == 3 * replicaNum) + + // tigger full compaction for all tablets + trigger_full_compaction_on_tablets.call(tablets) + + // wait for full compaction done + wait_full_compaction_done.call(tablets) + + // after full compaction, there is only 1 rowset. + rowsetCount = get_rowset_count.call(tablets); + if (isCloudMode) { + assert (rowsetCount == (1 + 1) * replicaNum) + } else { + assert (rowsetCount == 1 * replicaNum) + } + + run_sql.call() + + // insert more data and trigger full compaction again + insert_data.call() + + run_sql.call() + + rowsetCount = get_rowset_count.call(tablets); + if (isCloudMode) { + assert (rowsetCount == (2 + 1) * replicaNum) + } else { + assert (rowsetCount == 2 * replicaNum) + } + + // tigger full compaction for all tablets + trigger_full_compaction_on_tablets.call(tablets) + + // wait for full compaction done + wait_full_compaction_done.call(tablets) + + // after full compaction, there is only 1 rowset. + rowsetCount = get_rowset_count.call(tablets); + if (isCloudMode) { + assert (rowsetCount == (1 + 1) * replicaNum) + } else { + assert (rowsetCount == 1 * replicaNum) + } + + run_sql.call() + } + + boolean invertedIndexCompactionEnable = false + boolean has_update_be_config = false + try { + String backend_id; + backend_id = backendId_to_backendIP.keySet()[0] + def (code, out, err) = show_be_config(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id)) + + logger.info("Show config: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def configList = parseJson(out.trim()) + assert configList instanceof List + + for (Object ele in (List) configList) { + assert ele instanceof List + if (((List) ele)[0] == "inverted_index_compaction_enable") { + invertedIndexCompactionEnable = Boolean.parseBoolean(((List) ele)[2]) + logger.info("inverted_index_compaction_enable: ${((List) ele)[2]}") + } + if (((List) ele)[0] == "disable_auto_compaction") { + disableAutoCompaction = Boolean.parseBoolean(((List) ele)[2]) + logger.info("disable_auto_compaction: ${((List) ele)[2]}") + } + } + set_be_config.call("inverted_index_compaction_enable", "true") + has_update_be_config = true + // check updated config + check_config.call("inverted_index_compaction_enable", "true"); + + + /** + * test for duplicated key table + */ + sql """ DROP TABLE IF EXISTS ${tableName}; """ + sql """ + CREATE TABLE IF NOT EXISTS `${tableName}` ( + `id` int NULL COMMENT "", + `city` array NULL COMMENT "[]", + `addr` array NULL COMMENT "[]", + `name` varchar(20) NULL COMMENT "", + `compy` varchar(20) NULL COMMENT "", + `n` array NULL COMMENT "[]", + INDEX idx_city(city) USING INVERTED, + INDEX idx_addr(addr) USING INVERTED PROPERTIES("parser"="english"), + INDEX idx_n(n) USING INVERTED + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT "OLAP" + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "disable_auto_compaction" = "true", + "in_memory" = "false", + "storage_format" = "V2" + ) + """ + + //TabletId,ReplicaId,BackendId,SchemaHash,Version,LstSuccessVersion,LstFailedVersion,LstFailedTime,LocalDataSize,RemoteDataSize,RowCount,State,LstConsistencyCheckTime,CheckVersion,VersionCount,PathHash,MetaUrl,CompactionStatus + def tablets = sql_return_maparray """ show tablets from ${tableName}; """ + + run_test.call(tablets) + + /** + * test for unique key table + */ + tableName = "test_index_compaction_null_unique_arr" + + sql """ DROP TABLE IF EXISTS ${tableName}; """ + sql """ + CREATE TABLE IF NOT EXISTS `${tableName}` ( + `id` int NULL COMMENT "", + `city` array NULL COMMENT "[]", + `addr` array NULL COMMENT "[]", + `name` varchar(20) NULL COMMENT "", + `compy` varchar(20) NULL COMMENT "", + `n` array NULL COMMENT "[]", + INDEX idx_city(city) USING INVERTED, + INDEX idx_addr(addr) USING INVERTED PROPERTIES("parser"="english"), + INDEX idx_n(n) USING INVERTED + ) ENGINE=OLAP + UNIQUE KEY(`id`) + COMMENT "OLAP" + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "disable_auto_compaction" = "true", + "enable_unique_key_merge_on_write" = "true", + "in_memory" = "false", + "storage_format" = "V2" + ) + """ + + tablets = sql_return_maparray """ show tablets from ${tableName}; """ + run_test.call(tablets) + + } finally { + if (has_update_be_config) { + set_be_config.call("inverted_index_compaction_enable", invertedIndexCompactionEnable.toString()) + } + } +} diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_index_compaction_unique_keys_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_index_compaction_unique_keys_arr.groovy new file mode 100644 index 00000000000000..013d5a558111e7 --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_index_compaction_unique_keys_arr.groovy @@ -0,0 +1,255 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import org.codehaus.groovy.runtime.IOGroovyMethods + +suite("test_index_compaction_unique_keys_arr", "array_contains_inverted_index") { + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + def isCloudMode = isCloudMode() + def tableName = "test_index_compaction_unique_keys_arr" + def backendId_to_backendIP = [:] + def backendId_to_backendHttpPort = [:] + getBackendIpHttpPort(backendId_to_backendIP, backendId_to_backendHttpPort); + + boolean disableAutoCompaction = false + + def set_be_config = { key, value -> + for (String backend_id: backendId_to_backendIP.keySet()) { + def (code, out, err) = update_be_config(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), key, value) + logger.info("update config: code=" + code + ", out=" + out + ", err=" + err) + } + } + + def trigger_full_compaction_on_tablets = { tablets -> + for (def tablet : tablets) { + String tablet_id = tablet.TabletId + String backend_id = tablet.BackendId + int times = 1 + + String compactionStatus; + do{ + def (code, out, err) = be_run_full_compaction(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), tablet_id) + logger.info("Run compaction: code=" + code + ", out=" + out + ", err=" + err) + ++times + sleep(2000) + compactionStatus = parseJson(out.trim()).status.toLowerCase(); + } while (compactionStatus!="success" && times<=10) + + + if (compactionStatus == "fail") { + assertEquals(disableAutoCompaction, false) + logger.info("Compaction was done automatically!") + } + if (disableAutoCompaction) { + assertEquals("success", compactionStatus) + } + } + } + + def wait_full_compaction_done = { tablets -> + for (def tablet in tablets) { + boolean running = true + do { + Thread.sleep(1000) + String tablet_id = tablet.TabletId + String backend_id = tablet.BackendId + def (code, out, err) = be_get_compaction_status(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), tablet_id) + logger.info("Get compaction status: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def compactionStatus = parseJson(out.trim()) + assertEquals("success", compactionStatus.status.toLowerCase()) + running = compactionStatus.run_status + } while (running) + } + } + + def get_rowset_count = { tablets -> + int rowsetCount = 0 + for (def tablet in tablets) { + def (code, out, err) = curl("GET", tablet.CompactionStatus) + logger.info("Show tablets status: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def tabletJson = parseJson(out.trim()) + assert tabletJson.rowsets instanceof List + rowsetCount +=((List) tabletJson.rowsets).size() + } + return rowsetCount + } + + def check_config = { String key, String value -> + for (String backend_id: backendId_to_backendIP.keySet()) { + def (code, out, err) = show_be_config(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id)) + logger.info("Show config: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def configList = parseJson(out.trim()) + assert configList instanceof List + for (Object ele in (List) configList) { + assert ele instanceof List + if (((List) ele)[0] == key) { + assertEquals(value, ((List) ele)[2]) + } + } + } + } + + boolean invertedIndexCompactionEnable = false + boolean has_update_be_config = false + try { + String backend_id; + backend_id = backendId_to_backendIP.keySet()[0] + def (code, out, err) = show_be_config(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id)) + + logger.info("Show config: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def configList = parseJson(out.trim()) + assert configList instanceof List + + for (Object ele in (List) configList) { + assert ele instanceof List + if (((List) ele)[0] == "inverted_index_compaction_enable") { + invertedIndexCompactionEnable = Boolean.parseBoolean(((List) ele)[2]) + logger.info("inverted_index_compaction_enable: ${((List) ele)[2]}") + } + if (((List) ele)[0] == "disable_auto_compaction") { + disableAutoCompaction = Boolean.parseBoolean(((List) ele)[2]) + logger.info("disable_auto_compaction: ${((List) ele)[2]}") + } + } + set_be_config.call("inverted_index_compaction_enable", "true") + has_update_be_config = true + // check updated config + check_config.call("inverted_index_compaction_enable", "true"); + + sql """ DROP TABLE IF EXISTS ${tableName}; """ + sql """ + CREATE TABLE ${tableName} ( + `id` int(11) NULL, + `name` varchar(255) NULL, + `hobbies` text NULL, + `score` int(11) NULL, + index index_name (name) using inverted, + index index_hobbies (hobbies) using inverted properties("parser"="english"), + index index_score (score) using inverted + ) ENGINE=OLAP + UNIQUE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1", + "disable_auto_compaction" = "true", + "enable_unique_key_merge_on_write" = "true" + ); + """ + + sql """ INSERT INTO ${tableName} VALUES (1, "andy", "andy love apple", 100); """ + sql """ INSERT INTO ${tableName} VALUES (1, "bason", "bason hate pear", 99); """ + sql """ INSERT INTO ${tableName} VALUES (2, "andy", "andy love apple", 100); """ + sql """ INSERT INTO ${tableName} VALUES (2, "bason", "bason hate pear", 99); """ + sql """ INSERT INTO ${tableName} VALUES (3, "andy", "andy love apple", 100); """ + sql """ INSERT INTO ${tableName} VALUES (3, "bason", "bason hate pear", 99); """ + + qt_sql """ select * from ${tableName} order by id, name, hobbies, score """ + qt_sql """ select * from ${tableName} where name match "andy" order by id, name, hobbies, score """ + qt_sql """ select * from ${tableName} where hobbies match "pear" order by id, name, hobbies, score """ + qt_sql """ select * from ${tableName} where score < 100 order by id, name, hobbies, score """ + + //TabletId,ReplicaId,BackendId,SchemaHash,Version,LstSuccessVersion,LstFailedVersion,LstFailedTime,LocalDataSize,RemoteDataSize,RowCount,State,LstConsistencyCheckTime,CheckVersion,VersionCount,PathHash,MetaUrl,CompactionStatus + def tablets = sql_return_maparray """ show tablets from ${tableName}; """ + def dedup_tablets = deduplicate_tablets(tablets) + + // In the p0 testing environment, there are no expected operations such as scaling down BE (backend) services + // if tablets or dedup_tablets is empty, exception is thrown, and case fail + int replicaNum = Math.floor(tablets.size() / dedup_tablets.size()) + if (replicaNum != 1 && replicaNum != 3) + { + assert(false); + } + + // before full compaction, there are 7 rowsets. + int rowsetCount = get_rowset_count.call(tablets); + assert (rowsetCount == 7 * replicaNum) + + // trigger full compactions for all tablets in ${tableName} + trigger_full_compaction_on_tablets.call(tablets) + + // wait for full compaction done + wait_full_compaction_done.call(tablets) + + // after full compaction, there is only 1 rowset. + rowsetCount = get_rowset_count.call(tablets); + if (isCloudMode) { + assert (rowsetCount == (1 + 1) * replicaNum) + } else { + assert (rowsetCount == 1 * replicaNum) + } + + qt_sql """ select * from ${tableName} order by id, name, hobbies, score """ + qt_sql """ select * from ${tableName} where name match "andy" order by id, name, hobbies, score """ + qt_sql """ select * from ${tableName} where hobbies match "pear" order by id, name, hobbies, score """ + qt_sql """ select * from ${tableName} where score < 100 order by id, name, hobbies, score """ + + // insert more data and trigger full compaction again + sql """ INSERT INTO ${tableName} VALUES (1, "andy", "andy love apple", 100); """ + sql """ INSERT INTO ${tableName} VALUES (1, "bason", "bason hate pear", 99); """ + sql """ INSERT INTO ${tableName} VALUES (2, "andy", "andy love apple", 100); """ + sql """ INSERT INTO ${tableName} VALUES (2, "bason", "bason hate pear", 99); """ + sql """ INSERT INTO ${tableName} VALUES (3, "andy", "andy love apple", 100); """ + sql """ INSERT INTO ${tableName} VALUES (3, "bason", "bason hate pear", 99); """ + + qt_sql """ select * from ${tableName} order by id, name, hobbies, score """ + qt_sql """ select * from ${tableName} where name match "andy" order by id, name, hobbies, score """ + qt_sql """ select * from ${tableName} where hobbies match "pear" order by id, name, hobbies, score """ + qt_sql """ select * from ${tableName} where score < 100 order by id, name, hobbies, score """ + + rowsetCount = get_rowset_count.call(tablets); + if (isCloudMode) { + assert (rowsetCount == (7 + 1) * replicaNum) + } else { + assert (rowsetCount == 7 * replicaNum) + } + + // trigger full compactions for all tablets in ${tableName} + trigger_full_compaction_on_tablets.call(tablets) + + // wait for full compaction done + wait_full_compaction_done.call(tablets) + + // after full compaction, there is only 1 rowset. + rowsetCount = get_rowset_count.call(tablets); + if (isCloudMode) { + assert (rowsetCount == (1 + 1) * replicaNum) + } else { + assert (rowsetCount == 1 * replicaNum) + } + + qt_sql """ select * from ${tableName} order by id, name, hobbies, score """ + qt_sql """ select * from ${tableName} where name match "andy" order by id, name, hobbies, score """ + qt_sql """ select * from ${tableName} where hobbies match "pear" order by id, name, hobbies, score """ + qt_sql """ select * from ${tableName} where score < 100 order by id, name, hobbies, score """ + + } finally { + if (has_update_be_config) { + set_be_config.call("inverted_index_compaction_enable", invertedIndexCompactionEnable.toString()) + } + } +} diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_index_compaction_with_multi_index_segments_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_index_compaction_with_multi_index_segments_arr.groovy new file mode 100644 index 00000000000000..cddb35635f2479 --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_index_compaction_with_multi_index_segments_arr.groovy @@ -0,0 +1,410 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import org.codehaus.groovy.runtime.IOGroovyMethods + +suite("test_index_compaction_with_multi_index_segments_arr", "array_contains_inverted_index") { + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + + def isCloudMode = isCloudMode() + def tableName = "test_index_compaction_with_multi_index_segments_arr" + def backendId_to_backendIP = [:] + def backendId_to_backendHttpPort = [:] + getBackendIpHttpPort(backendId_to_backendIP, backendId_to_backendHttpPort); + + boolean disableAutoCompaction = false + + def set_be_config = { key, value -> + for (String backend_id: backendId_to_backendIP.keySet()) { + def (code, out, err) = update_be_config(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), key, value) + logger.info("update config: code=" + code + ", out=" + out + ", err=" + err) + } + } + + def trigger_full_compaction_on_tablets = { tablets -> + for (def tablet : tablets) { + String tablet_id = tablet.TabletId + String backend_id = tablet.BackendId + int times = 1 + + String compactionStatus; + do{ + def (code, out, err) = be_run_full_compaction(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), tablet_id) + logger.info("Run compaction: code=" + code + ", out=" + out + ", err=" + err) + ++times + sleep(2000) + compactionStatus = parseJson(out.trim()).status.toLowerCase(); + } while (compactionStatus!="success" && times<=10) + + + if (compactionStatus == "fail") { + assertEquals(disableAutoCompaction, false) + logger.info("Compaction was done automatically!") + } + if (disableAutoCompaction) { + assertEquals("success", compactionStatus) + } + } + } + + def wait_full_compaction_done = { tablets -> + for (def tablet in tablets) { + boolean running = true + do { + Thread.sleep(1000) + String tablet_id = tablet.TabletId + String backend_id = tablet.BackendId + def (code, out, err) = be_get_compaction_status(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id), tablet_id) + logger.info("Get compaction status: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def compactionStatus = parseJson(out.trim()) + assertEquals("success", compactionStatus.status.toLowerCase()) + running = compactionStatus.run_status + } while (running) + } + } + + def get_rowset_count = { tablets -> + int rowsetCount = 0 + for (def tablet in tablets) { + def (code, out, err) = curl("GET", tablet.CompactionStatus) + logger.info("Show tablets status: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def tabletJson = parseJson(out.trim()) + assert tabletJson.rowsets instanceof List + rowsetCount +=((List) tabletJson.rowsets).size() + } + return rowsetCount + } + + def check_config = { String key, String value -> + for (String backend_id: backendId_to_backendIP.keySet()) { + def (code, out, err) = show_be_config(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id)) + logger.info("Show config: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def configList = parseJson(out.trim()) + assert configList instanceof List + for (Object ele in (List) configList) { + assert ele instanceof List + if (((List) ele)[0] == key) { + assertEquals(value, ((List) ele)[2]) + } + } + } + } + + boolean invertedIndexCompactionEnable = false + int invertedIndexMaxBufferedDocs = -1; + boolean has_update_be_config = false + + try { + String backend_id = backendId_to_backendIP.keySet()[0] + def (code, out, err) = show_be_config(backendId_to_backendIP.get(backend_id), backendId_to_backendHttpPort.get(backend_id)) + + logger.info("Show config: code=" + code + ", out=" + out + ", err=" + err) + assertEquals(code, 0) + def configList = parseJson(out.trim()) + assert configList instanceof List + + for (Object ele in (List) configList) { + assert ele instanceof List + if (((List) ele)[0] == "inverted_index_compaction_enable") { + invertedIndexCompactionEnable = Boolean.parseBoolean(((List) ele)[2]) + logger.info("inverted_index_compaction_enable: ${((List) ele)[2]}") + } + if (((List) ele)[0] == "inverted_index_max_buffered_docs") { + invertedIndexMaxBufferedDocs = Integer.parseInt(((List) ele)[2]) + logger.info("inverted_index_max_buffered_docs: ${((List) ele)[2]}") + } + } + set_be_config.call("inverted_index_compaction_enable", "true") + set_be_config.call("inverted_index_max_buffered_docs", "5") + has_update_be_config = true + + // check config + check_config.call("inverted_index_compaction_enable", "true") + check_config.call("inverted_index_max_buffered_docs", "5") + + /** + * test duplicated tables + * 1. insert 10 rows + * 2. insert another 10 rows + * 3. full compaction + * 4. insert 10 rows, again + * 5. full compaction + */ + table_name = "test_index_compaction_with_multi_index_segments_dups_arr" + sql """ DROP TABLE IF EXISTS ${tableName}; """ + sql """ + CREATE TABLE ${tableName} ( + `file_time` DATETIME NOT NULL, + `comment_id` array NULL, + `body` array NULL DEFAULT "[]", + INDEX idx_comment_id (`comment_id`) USING INVERTED COMMENT '''', + INDEX idx_body (`body`) USING INVERTED PROPERTIES("parser" = "unicode") COMMENT '''' + ) ENGINE=OLAP + DUPLICATE KEY(`file_time`) + COMMENT 'OLAP' + DISTRIBUTED BY RANDOM BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "disable_auto_compaction" = "true" + ); + """ + + // insert 10 rows + sql """ INSERT INTO ${tableName} VALUES ("2018-02-21 12:00:00", [1], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [2], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [3], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [4], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [5], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [6], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [7], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [8], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [9], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [10], ["I\'m using the builds"]); """ + // insert another 10 rows + sql """ INSERT INTO ${tableName} VALUES ("2018-02-21 12:00:00", [1], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [2], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [3], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [4], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [5], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [6], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [7], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [8], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [9], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [10], ["I\'m using the builds"]); """ + + qt_sql """ select * from ${tableName} order by file_time, comment_id[1], body[1] """ + qt_sql """ select * from ${tableName} where array_contains(body, "using") order by file_time, comment_id[1], body[1] """ + qt_sql """ select * from ${tableName} where array_contains(body, "the") order by file_time, comment_id[1], body[1] """ + qt_sql """ select * from ${tableName} where comment_id[1]< 8 order by file_time, comment_id[1], body[1] """ + + //TabletId,ReplicaId,BackendId,SchemaHash,Version,LstSuccessVersion,LstFailedVersion,LstFailedTime,LocalDataSize,RemoteDataSize,RowCount,State,LstConsistencyCheckTime,CheckVersion,VersionCount,PathHash,MetaUrl,CompactionStatus + def tablets = sql_return_maparray """ show tablets from ${tableName}; """ + def dedup_tablets = deduplicate_tablets(tablets) + + // In the p0 testing environment, there are no expected operations such as scaling down BE (backend) services + // if tablets or dedup_tablets is empty, exception is thrown, and case fail + int replicaNum = Math.floor(tablets.size() / dedup_tablets.size()) + if (replicaNum != 1 && replicaNum != 3) + { + assert(false); + } + + // before full compaction, there are 3 rowsets. + int rowsetCount = get_rowset_count.call(tablets) + assert (rowsetCount == 3 * replicaNum) + + // trigger full compactions for all tablets in ${tableName} + trigger_full_compaction_on_tablets.call(tablets) + + // wait for full compaction done + wait_full_compaction_done.call(tablets) + + // after full compaction, there is only 1 rowset. + rowsetCount = get_rowset_count.call(tablets) + if (isCloudMode) { + assert (rowsetCount == (1 + 1) * replicaNum) + } else { + assert (rowsetCount == 1 * replicaNum) + } + + qt_sql """ select * from ${tableName} order by file_time, comment_id[1], body[1] """ + qt_sql """ select * from ${tableName} where array_contains(body, "using") order by file_time, comment_id[1], body[1] """ + qt_sql """ select * from ${tableName} where array_contains(body, "the") order by file_time, comment_id[1], body[1] """ + qt_sql """ select * from ${tableName} where comment_id[1]< 8 order by file_time, comment_id[1], body[1] """ + + // insert 10 rows, again + sql """ INSERT INTO ${tableName} VALUES ("2018-02-21 12:00:00", [1], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [2], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [3], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [4], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [5], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [6], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [7], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [8], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [9], ["I\'m using the builds"]), + ("2018-02-21 12:00:00", [10], ["I\'m using the builds"]); """ + + sql """ select * from ${tableName} """ + + tablets = sql_return_maparray """ show tablets from ${tableName}; """ + + // before full compaction, there are 2 rowsets. + rowsetCount = get_rowset_count.call(tablets) + if (isCloudMode) { + assert (rowsetCount == (2 + 1) * replicaNum) + } else { + assert (rowsetCount == 2 * replicaNum) + } + // trigger full compactions for all tablets in ${tableName} + trigger_full_compaction_on_tablets.call(tablets) + + // wait for full compaction done + wait_full_compaction_done.call(tablets) + + // after full compaction, there is only 1 rowset. + rowsetCount = get_rowset_count.call(tablets) + if (isCloudMode) { + assert (rowsetCount == (1 + 1) * replicaNum) + } else { + assert (rowsetCount == 1 * replicaNum) + } + + qt_sql """ select * from ${tableName} order by file_time, comment_id[1], body[1] """ + qt_sql """ select * from ${tableName} where array_contains(body, "using") order by file_time, comment_id[1], body[1] """ + qt_sql """ select * from ${tableName} where array_contains(body, "the") order by file_time, comment_id[1], body[1] """ + qt_sql """ select * from ${tableName} where comment_id[1]< 8 order by file_time, comment_id[1], body[1] """ + + /** + * test unique tables + * 1. insert 10 rows + * 2. insert another 10 rows + * 3. full compaction + * 4. insert 10 rows, again + * 5. full compaction + */ + table_name = "test_index_compaction_with_multi_index_segments_unique_arr" + sql """ DROP TABLE IF EXISTS ${tableName}; """ + sql """ + CREATE TABLE ${tableName} ( + `file_time` DATETIME NOT NULL, + `comment_id` array NULL, + `body` array NULL DEFAULT "[]", + INDEX idx_comment_id (`comment_id`) USING INVERTED COMMENT '''', + INDEX idx_body (`body`) USING INVERTED PROPERTIES("parser" = "unicode") COMMENT '''' + ) ENGINE=OLAP + UNIQUE KEY(`file_time`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`file_time`) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "disable_auto_compaction" = "true", + "enable_unique_key_merge_on_write" = "true" + ); + """ + + // insert 10 rows + sql """ INSERT INTO ${tableName} VALUES ("2018-02-21 12:00:00", [1], ["I\'m using the builds"]), + ("2018-02-21 13:00:00", [2], ["I\'m using the builds"]), + ("2018-02-21 14:00:00", [3], ["I\'m using the builds"]), + ("2018-02-21 15:00:00", [4], ["I\'m using the builds"]), + ("2018-02-21 16:00:00", [5], ["I\'m using the builds"]), + ("2018-02-21 17:00:00", [6], ["I\'m using the builds"]), + ("2018-02-21 18:00:00", [7], ["I\'m using the builds"]), + ("2018-02-21 19:00:00", [8], ["I\'m using the builds"]), + ("2018-02-21 20:00:00", [9], ["I\'m using the builds"]), + ("2018-02-21 21:00:00", [10], ["I\'m using the builds"]); """ + // insert another 10 rows + sql """ INSERT INTO ${tableName} VALUES ("2018-02-21 12:00:00", [1], ["I\'m using the builds"]), + ("2018-02-21 13:00:00", [2], ["I\'m using the builds"]), + ("2018-02-21 14:00:00", [3], ["I\'m using the builds"]), + ("2018-02-21 15:00:00", [4], ["I\'m using the builds"]), + ("2018-02-21 16:00:00", [5], ["I\'m using the builds"]), + ("2018-02-21 17:00:00", [6], ["I\'m using the builds"]), + ("2018-02-21 18:00:00", [7], ["I\'m using the builds"]), + ("2018-02-21 19:00:00", [8], ["I\'m using the builds"]), + ("2018-02-21 20:00:00", [9], ["I\'m using the builds"]), + ("2018-02-21 21:00:00", [10], ["I\'m using the builds"]); """ + + qt_sql """ select * from ${tableName} order by file_time, comment_id[1], body[1] """ + qt_sql """ select * from ${tableName} where array_contains(body, "using") order by file_time, comment_id[1], body[1] """ + qt_sql """ select * from ${tableName} where array_contains(body, "the") order by file_time, comment_id[1], body[1] """ + qt_sql """ select * from ${tableName} where comment_id[1]< 8 order by file_time, comment_id[1], body[1] """ + + //TabletId,ReplicaId,BackendId,SchemaHash,Version,LstSuccessVersion,LstFailedVersion,LstFailedTime,LocalDataSize,RemoteDataSize,RowCount,State,LstConsistencyCheckTime,CheckVersion,VersionCount,PathHash,MetaUrl,CompactionStatus + tablets = sql_return_maparray """ show tablets from ${tableName}; """ + + // before full compaction, there are 3 rowsets. + rowsetCount = get_rowset_count.call(tablets) + assert (rowsetCount == 3 * replicaNum) + + // trigger full compactions for all tablets in ${tableName} + trigger_full_compaction_on_tablets.call(tablets) + + // wait for full compaction done + wait_full_compaction_done.call(tablets) + + // after full compaction, there is only 1 rowset. + rowsetCount = get_rowset_count.call(tablets) + if (isCloudMode) { + assert (rowsetCount == (1 + 1) * replicaNum) + } else { + assert (rowsetCount == 1 * replicaNum) + } + + qt_sql """ select * from ${tableName} order by file_time, comment_id[1], body[1] """ + qt_sql """ select * from ${tableName} where array_contains(body, "using") order by file_time, comment_id[1], body[1] """ + qt_sql """ select * from ${tableName} where array_contains(body, "the") order by file_time, comment_id[1], body[1] """ + qt_sql """ select * from ${tableName} where comment_id[1]< 8 order by file_time, comment_id[1], body[1] """ + + // insert 10 rows, again + sql """ INSERT INTO ${tableName} VALUES ("2018-02-21 12:00:00", [1], ["I\'m using the builds"]), + ("2018-02-21 13:00:00", [2], ["I\'m using the builds"]), + ("2018-02-21 14:00:00", [3], ["I\'m using the builds"]), + ("2018-02-21 15:00:00", [4], ["I\'m using the builds"]), + ("2018-02-21 16:00:00", [5], ["I\'m using the builds"]), + ("2018-02-21 17:00:00", [6], ["I\'m using the builds"]), + ("2018-02-21 18:00:00", [7], ["I\'m using the builds"]), + ("2018-02-21 19:00:00", [8], ["I\'m using the builds"]), + ("2018-02-21 20:00:00", [9], ["I\'m using the builds"]), + ("2018-02-21 21:00:00", [10], ["I\'m using the builds"]); """ + + sql """ select * from ${tableName} """ + + tablets = sql_return_maparray """ show tablets from ${tableName}; """ + + // before full compaction, there are 2 rowsets. + rowsetCount = get_rowset_count.call(tablets) + if (isCloudMode) { + assert (rowsetCount == (2 + 1) * replicaNum) + } else { + assert (rowsetCount == 2 * replicaNum) + } + // trigger full compactions for all tablets in ${tableName} + trigger_full_compaction_on_tablets.call(tablets) + + // wait for full compaction done + wait_full_compaction_done.call(tablets) + + // after full compaction, there is only 1 rowset. + rowsetCount = get_rowset_count.call(tablets) + if (isCloudMode) { + assert (rowsetCount == (1 + 1) * replicaNum) + } else { + assert (rowsetCount == 1 * replicaNum) + } + qt_sql """ select * from ${tableName} order by file_time, comment_id[1], body[1] """ + qt_sql """ select * from ${tableName} where array_contains(body, "using") order by file_time, comment_id[1], body[1] """ + qt_sql """ select * from ${tableName} where array_contains(body, "the") order by file_time, comment_id[1], body[1] """ + qt_sql """ select * from ${tableName} where comment_id[1]< 8 order by file_time, comment_id[1], body[1] """ + + + } finally { + if (has_update_be_config) { + set_be_config.call("inverted_index_compaction_enable", invertedIndexCompactionEnable.toString()) + set_be_config.call("inverted_index_max_buffered_docs", invertedIndexMaxBufferedDocs.toString()) + } + } +} diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_index_delete_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_index_delete_arr.groovy new file mode 100644 index 00000000000000..32448cd170ae44 --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_index_delete_arr.groovy @@ -0,0 +1,80 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + + +suite("test_index_delete_arr", "array_contains_inverted_index") { + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + def indexTbName1 = "test_index_delete_arr" + + sql "DROP TABLE IF EXISTS ${indexTbName1}" + + sql """ + CREATE TABLE ${indexTbName1} ( + `a` int(11) NULL COMMENT "", + `b` array NULL COMMENT "[]", + INDEX b_idx (`b`) USING INVERTED PROPERTIES("parser" = "english", "support_phrase" = "true") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`a`) + COMMENT "OLAP" + DISTRIBUTED BY RANDOM BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "disable_auto_compaction" = "true" + ); + """ + + sql """ INSERT INTO ${indexTbName1} VALUES (1, ["1"]); """ + sql """ INSERT INTO ${indexTbName1} VALUES (2, ["1"]); """ + sql """ INSERT INTO ${indexTbName1} VALUES (3, ["1"]); """ + sql """ INSERT INTO ${indexTbName1} VALUES (4, ["2"]); """ + sql """ INSERT INTO ${indexTbName1} VALUES (5, ["2"]); """ + sql """ INSERT INTO ${indexTbName1} VALUES (6, ["2"]); """ + sql """ INSERT INTO ${indexTbName1} VALUES (7, ["3"]); """ + sql """ INSERT INTO ${indexTbName1} VALUES (8, ["3"]); """ + sql """ INSERT INTO ${indexTbName1} VALUES (9, ["3"]); """ + sql """ INSERT INTO ${indexTbName1} VALUES (10, ["4"]); """ + + try { + sql "sync" + + sql """ delete from ${indexTbName1} where a >= 9; """ + sql "sync" + + qt_sql """ select count() from ${indexTbName1} where a >= 1 and a <= 10; """ + qt_sql """ select count() from ${indexTbName1} where a >= 1; """ + qt_sql """ select count() from ${indexTbName1} where a <= 10; """ + + test { + sql """ delete from test_index_delete_arr where array_contains(b,'3'); """ + exception("errCode = 2") + } + + sql "sync" + + qt_sql """ select count() from ${indexTbName1} where a >= 1; """ + qt_sql """ select count() from ${indexTbName1} where array_contains(b, '3'); """ + + } finally { + //try_sql("DROP TABLE IF EXISTS ${testTable}") + } +} \ No newline at end of file diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_index_empty_string_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_index_empty_string_arr.groovy new file mode 100644 index 00000000000000..7c9d2eae781ec6 --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_index_empty_string_arr.groovy @@ -0,0 +1,59 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + + +suite("test_index_empty_string_arr", "array_contains_inverted_index"){ + def timeout = 60000 + def delta_time = 1000 + def alter_res = "null" + def useTime = 0 + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + def indexTblName = "test_index_empty_string_arr" + + sql "DROP TABLE IF EXISTS ${indexTblName}" + // create 1 replica table + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName}( + `id` int(11) NOT NULL, + `a` ARRAY NULL DEFAULT "[]", + `b` ARRAY NULL DEFAULT "[]", + INDEX a_idx(`a`) USING INVERTED COMMENT '', + INDEX b_idx(`b`) USING INVERTED PROPERTIES("parser" = "english") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + sql """ + INSERT INTO $indexTblName VALUES + (1, [''], ['1']), + (2, ['2'], ['']); + """ + + qt_sql "SELECT count() FROM $indexTblName WHERE array_contains(a,'');" + qt_sql "SELECT count() FROM $indexTblName WHERE array_contains(b,'');" +} diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_index_equal_select_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_index_equal_select_arr.groovy new file mode 100644 index 00000000000000..6df3a5eb213754 --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_index_equal_select_arr.groovy @@ -0,0 +1,247 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +suite("test_index_equal_select_arr", "array_contains_inverted_index"){ + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + def indexTbName1 = "index_equal_select_arr" + + sql "DROP TABLE IF EXISTS ${indexTbName1}" + + // create table with different index + sql """ + CREATE TABLE IF NOT EXISTS ${indexTbName1} ( + name varchar(50), + age array NOT NULL, + grade array NOT NULL, + registDate datetime NULL, + studentInfo array, + tearchComment array, + selfComment array, + fatherName array, + matherName varchar(50), + otherinfo varchar(100), + INDEX name_idx(name) USING INVERTED COMMENT 'name index', + INDEX age_idx(age) USING INVERTED COMMENT 'age index', + INDEX grade_idx(grade) USING INVERTED PROPERTIES("parser"="none") COMMENT 'grade index', + INDEX tearchComment_index(tearchComment) USING INVERTED PROPERTIES("parser"="english") COMMENT 'tearchComment index', + INDEX studentInfo_index(studentInfo) USING INVERTED PROPERTIES("parser"="standard") COMMENT 'studentInfo index', + INDEX selfComment_index(selfComment) USING INVERTED PROPERTIES("parser"="standard") COMMENT 'studentInfo index', + INDEX fatherName_idx(fatherName) USING INVERTED PROPERTIES("parser"="standard") COMMENT ' fatherName index' + ) + DUPLICATE KEY(`name`) + DISTRIBUTED BY HASH(`name`) BUCKETS 10 + properties("replication_num" = "1"); + """ + // insert data + sql """ insert into ${indexTbName1} VALUES + ("zhang san", [10], ["grade 5"],"2017-10-01", ["tall:120cm, weight: 35kg, hobbies: sing, dancing"],["Like cultural and recreational activities"],["Class activists"],["zhang yi"],"chen san", "buy dancing book"), + ("zhang san yi", [11], ["grade 5"],"2017-10-01", ["tall:120cm, weight: 35kg, hobbies: reading book"],["A quiet little boy"],["learn makes me happy"],["zhang yi"],"chen san", "buy"), + ("li si", [9], ["grade 4"],"2018-10-01", ["tall:100cm, weight: 30kg, hobbies: playing ball"],["A naughty boy"],["i just want go outside"],["li er"],"wan jiu", ""), + ("san zhang", [10], ["grade 5"],"2017-10-01", ["tall:100cm, weight: 30kg, hobbies:"],[""],[""],[""],"", ""), + ("li sisi", [11], ["grade 6"],"2016-10-01", ["tall:150cm, weight: 40kg, hobbies: sing, dancing, running"],["good at handiwork and beaty"],[""],["li ba"],"li liuliu", "") + """ + + // case1: test equal + // case1.0: test index coulume equal '' + test { + sql """select * from ${indexTbName1} where array_contains(name, '') order by name""" + exception("errCode = 2") + } + + qt_sql "select * from ${indexTbName1} where array_contains(grade, '') order by name" + qt_sql "select * from ${indexTbName1} where array_contains(studentInfo, '') order by name" + qt_sql "select * from ${indexTbName1} where array_contains(tearchComment, '') order by name" + qt_sql "select * from ${indexTbName1} where array_contains(selfComment, '') order by name" + qt_sql "select * from ${indexTbName1} where array_contains(fatherName, '') order by name" + // case1.1 test index colume equal + qt_sql "select * from ${indexTbName1} where name='zhang san' order by name" + qt_sql "select * from ${indexTbName1} where array_contains(age, 10) order by name" + qt_sql "select * from ${indexTbName1} where array_contains(grade, 'grade 5') order by name" + qt_sql "select * from ${indexTbName1} where array_contains(studentInfo, 'tall:120cm, weight: 35kg') order by name" + qt_sql "select * from ${indexTbName1} where array_contains(selfComment, 'learn makes me happy') order by name" + qt_sql "select * from ${indexTbName1} where array_contains(tearchComment, 'A quiet little boy') order by name" + qt_sql "select * from ${indexTbName1} where array_contains(fatherName, 'zhang yi') order by name" + + // case1.2 test index colume not equal + qt_sql "select * from ${indexTbName1} where !array_contains(age, 10) order by name" + qt_sql "select * from ${indexTbName1} where !array_contains(grade, 'grade 5') order by name" + qt_sql "select * from ${indexTbName1} where !array_contains(studentInfo, 'tall:120cm, weight: 35kg') order by name" + qt_sql "select * from ${indexTbName1} where !array_contains(selfComment, 'learn makes me happy') order by name" + qt_sql "select * from ${indexTbName1} where !array_contains(tearchComment, 'A quiet little boy') order by name" + qt_sql "select * from ${indexTbName1} where !array_contains(fatherName, 'zhang yi') order by name" + + // case1.3 test index colume and normal colume mix select + // case1.3.0 default(simple) index and normal colume mix select + // case 1.3.1 none index and normal colume mix select + qt_sql """ + select * from ${indexTbName1} where array_contains(grade, 'grade 5') and registDate="2017-10-01" order by name + """ + qt_sql """ + select * from ${indexTbName1} where !array_contains(grade, 'grade 5') and registDate="2017-10-01" order by name + """ + qt_sql """ + select * from ${indexTbName1} where !array_contains(grade, 'grade 5') and registDate!="2017-10-01" order by name + """ + // case 1.3.2 simple index and normal colume mix select + qt_sql """ + select * from ${indexTbName1} where array_contains(tearchComment, 'A quiet little boy') and registDate="2017-10-01" order by name + """ + qt_sql """ + select * from ${indexTbName1} where !array_contains(tearchComment, 'A quiet little boy') and registDate="2017-10-01" order by name + """ + qt_sql """ + select * from ${indexTbName1} where !array_contains(tearchComment, 'A quiet little boy') and registDate!="2017-10-01" order by name + """ + // case 1.3.3 standard index char and normal colume mix select + qt_sql """ + select * from ${indexTbName1} where array_contains(studentInfo, 'tall:120cm, weight: 35kg') and registDate="2017-10-01" order by name + """ + qt_sql """ + select * from ${indexTbName1} where !array_contains(studentInfo, 'tall:120cm, weight: 35kg') and registDate="2017-10-01" order by name + """ + qt_sql """ + select * from ${indexTbName1} where !array_contains(selfComment, 'learn makes me happy') and registDate!="2017-10-01" order by name + """ + // case 1.3.4 standard index string and normal colume mix select + qt_sql """ + select * from ${indexTbName1} where array_contains(selfComment, 'learn makes me happy') and registDate="2017-10-01" order by name + """ + qt_sql """ + select * from ${indexTbName1} where !array_contains(selfComment, 'learn makes me happy') and registDate="2017-10-01" order by name + """ + qt_sql """ + select * from ${indexTbName1} where !array_contains(selfComment, 'learn makes me happy') and registDate!="2017-10-01" order by name + """ + // case 1.3.5 standard index varchar and normal colume mix select + qt_sql """ + select * from ${indexTbName1} where array_contains(fatherName, 'zhang yi') and registDate="2017-10-01" order by name + """ + qt_sql """ + select * from ${indexTbName1} where !array_contains(fatherName, 'zhang yi') and registDate="2017-10-01" order by name + """ + qt_sql """ + select * from ${indexTbName1} where !array_contains(fatherName, 'zhang yi') and registDate!="2017-10-01" order by name + """ + // case1.3.6 data index and normal colume mix select + qt_sql """ + select * from ${indexTbName1} where array_contains(age, 10) and registDate="2017-10-01" order by name + """ + qt_sql """ + select * from ${indexTbName1} where !array_contains(age, 10) and registDate="2017-10-01" order by name + """ + qt_sql """ + select * from ${indexTbName1} where !array_contains(age, 10) and registDate!="2017-10-01" order by name + """ + + // case 1.4 different colume mix select + // case1.4.0 data index and string defalut(simple) index mix select + qt_sql """ + select * from ${indexTbName1} where array_contains(age, 10) and name='zhang san' order by name + """ + qt_sql """ + select * from ${indexTbName1} where array_contains(age, 10) or name='zhang san' order by name + """ + // case1.4.1 data index and string none index mix select + qt_sql """ + select * from ${indexTbName1} where array_contains(age, 10) and array_contains(grade, 'grade 5') order by name + """ + qt_sql """ + select * from ${indexTbName1} where array_contains(age, 10) or array_contains(grade, 'grade 5') order by name + """ + // case1.4.2 data index and string simple mix select + qt_sql """ + select * from ${indexTbName1} where array_contains(age, 10) and !array_contains(tearchComment, 'A quiet little boy') order by name + """ + qt_sql """ + select * from ${indexTbName1} where array_contains(age, 10) or !array_contains(tearchComment, 'A quiet little boy') order by name + """ + // case1.4.3 data index and string standard mix select + // case1.4.3.0 data index and varchar standard mix select + qt_sql """ + select * from ${indexTbName1} where array_contains(age, 10) and array_contains(fatherName, 'zhang yi') order by name + """ + qt_sql """ + select * from ${indexTbName1} where array_contains(age, 10) or array_contains(fatherName, 'zhang yi') order by name + """ + // case1.4.3.1 data index and char standard mix select + qt_sql """ + select * from ${indexTbName1} where array_contains(age, 10) and array_contains(studentInfo, 'tall:120cm, weight: 35kg') order by name + """ + qt_sql """ + select * from ${indexTbName1} where array_contains(age, 10) or array_contains(studentInfo, 'tall:120cm, weight: 35kg') order by name + """ + // case1.4.3.2 data index and string standard mix select + qt_sql """ + select * from ${indexTbName1} where array_contains(age, 10) and array_contains(selfComment, 'learn makes me happy') order by name + """ + qt_sql """ + select * from ${indexTbName1} where array_contains(age, 10) or array_contains(selfComment, 'learn makes me happy') order by name + """ + + // case1.4.4 none and simple index colume mix select + qt_sql """ + select * from ${indexTbName1} where array_contains(grade, 'grade 5') and name='zhang san' order by name + """ + qt_sql """ + select * from ${indexTbName1} where array_contains(grade, 'grade 5') or name='zhang san' order by name + """ + qt_sql """ + select * from ${indexTbName1} where !array_contains(grade, 'grade 5') and !name='zhang san' order by name + """ + qt_sql """ + select * from ${indexTbName1} where !array_contains(grade, 'grade 5') or !name='zhang san' order by name + """ + // case1.4.5 none and standard index colume mix select + qt_sql """ + select * from ${indexTbName1} where array_contains(grade, 'grade 5') and array_contains(selfComment, 'learn makes me happy') order by name + """ + qt_sql """ + select * from ${indexTbName1} where array_contains(grade, 'grade 5') or array_contains(selfComment, 'learn makes me happy') order by name + """ + qt_sql """ + select * from ${indexTbName1} where !array_contains(grade, 'grade 5') and !array_contains(selfComment, 'learn makes me happy') order by name + """ + qt_sql """ + select * from ${indexTbName1} where !array_contains(grade, 'grade 5') or !array_contains(selfComment, 'learn makes me happy') order by name + """ + // case1.4.5 simple and standard index colume mix select + qt_sql """ + select * from ${indexTbName1} where array_contains(grade, 'grade 5') and array_contains(fatherName, 'zhang yi') order by name + """ + qt_sql """ + select * from ${indexTbName1} where array_contains(grade, 'grade 5') or array_contains(fatherName, 'zhang yi') order by name + """ + qt_sql """ + select * from ${indexTbName1} where !array_contains(grade, 'grade 5') and array_contains(fatherName, 'zhang yi') order by name + """ + qt_sql """ + select * from ${indexTbName1} where !array_contains(grade, 'grade 5') or array_contains(fatherName, 'zhang yi') order by name + """ + // case1.4.6 standard and standard index colume mix select + qt_sql """ + select * from ${indexTbName1} where array_contains(studentInfo, 'tall:120cm, weight: 35kg') or array_contains(fatherName, 'zhang yi') or array_contains(selfComment, 'learn makes me happy') order by name + """ + qt_sql """ + select * from ${indexTbName1} where array_contains(studentInfo, 'tall:120cm, weight: 35kg') or array_contains(fatherName, 'zhang yi') and array_contains(selfComment, 'learn makes me happy') order by name + """ +} diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_index_match_phrase_edge_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_index_match_phrase_edge_arr.groovy new file mode 100644 index 00000000000000..2c82674f408dc3 --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_index_match_phrase_edge_arr.groovy @@ -0,0 +1,76 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + + +suite("test_index_match_phrase_edge_arr", "array_contains_inverted_index"){ + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + def indexTbName1 = "test_index_match_phrase_edge_arr" + + sql "DROP TABLE IF EXISTS ${indexTbName1}" + + sql """ + CREATE TABLE ${indexTbName1} ( + `a` int(11) NULL COMMENT "", + `b` array NULL COMMENT "[]", + `c` array NULL COMMENT "[]", + INDEX b_idx (`b`) USING INVERTED PROPERTIES("parser" = "english", "support_phrase" = "true") COMMENT '', + INDEX c_idx (`c`) USING INVERTED PROPERTIES("parser" = "unicode", "support_phrase" = "true") COMMENT '', + ) ENGINE=OLAP + DUPLICATE KEY(`a`) + COMMENT "OLAP" + DISTRIBUTED BY RANDOM BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + sql """ INSERT INTO ${indexTbName1} VALUES (1, ["index.html"], ["首先我 index html 想说的是这里有 index html 条评论看了之后很让人无语"]); """ + sql """ INSERT INTO ${indexTbName1} VALUES (2, ["nav_inet.html"], ["尤其看看 nav inet html 原价应当 nav inet html 是一本精美的书"]); """ + sql """ INSERT INTO ${indexTbName1} VALUES (3, ["splash_inet.html"], ["封面 splash inet html 红色 splash inet html 书封非常精致"]); """ + sql """ INSERT INTO ${indexTbName1} VALUES (4, ["nav_top_inet.html"], ["个人觉得定义 nav top inet html 和 nav top inet html 写法特别有帮助"]); """ + sql """ INSERT INTO ${indexTbName1} VALUES (5, ["nav_bg_top.gif"], ["该书研究了英语 nav bg top gif 各种语法 nav bg top gif 结构下的歧义问题"]); """ + sql """ INSERT INTO ${indexTbName1} VALUES (6, ["nav_news_off.gif"], ["作品当然是 nav news off gif 喜欢的 nav news off gif 否则也不会买原版"]); """ + sql """ INSERT INTO ${indexTbName1} VALUES (7, ["nav_comp_off.gif"], ["对于理解英语的 nav comp off gif 节奏和 nav comp off gif 韵律很有好处"]); """ + sql """ INSERT INTO ${indexTbName1} VALUES (8, ["nav_venue_off.gif"], ["本书既适合 nav venue off gif 家长 nav venue off gif 和孩子一起学习使用"]); """ + sql """ INSERT INTO ${indexTbName1} VALUES (9, ["hm_bg.jpg"], ["前几日 hm bg jpg 在别处 hm bg jpg 购得"]); """ + sql """ INSERT INTO ${indexTbName1} VALUES (10, ["nav_tickets_off.gif"], ["习惯于生活中很多 nav tickets off gif 虚假 nav tickets off gif 美化的人来说"]); """ + + try { + sql "sync" + + qt_sql """ select * from ${indexTbName1} where array_contains(b, 'x.h'); """ + qt_sql """ select * from ${indexTbName1} where array_contains(b, 'v_i'); """ + qt_sql """ select * from ${indexTbName1} where array_contains(b, 'sh_inet.h'); """ + qt_sql """ select * from ${indexTbName1} where array_contains(b, 'v_bg_t'); """ + qt_sql """ select * from ${indexTbName1} where array_contains(b, 'v_venue_of'); """ + + qt_sql """ select * from ${indexTbName1} where array_contains(c, 'ml 想说的是这里有 in'); """ + qt_sql """ select * from ${indexTbName1} where array_contains(c, 'ml 原价应当 na'); """ + qt_sql """ select * from ${indexTbName1} where array_contains(c, 'op gif 各种语法 nav b'); """ + qt_sql """ select * from ${indexTbName1} where array_contains(c, 'ue off gif 家长 na'); """ + qt_sql """ select * from ${indexTbName1} where array_contains(c, 'if 虚假 na'); """ + + } finally { + //try_sql("DROP TABLE IF EXISTS ${testTable}") + } +} \ No newline at end of file diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_index_match_regexp_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_index_match_regexp_arr.groovy new file mode 100644 index 00000000000000..49ee9b64e3c38a --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_index_match_regexp_arr.groovy @@ -0,0 +1,100 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + + +suite("test_index_match_regexp_arr", "array_contains_inverted_index"){ + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + def indexTbName1 = "test_index_match_regexp_arr" + + sql "DROP TABLE IF EXISTS ${indexTbName1}" + + sql """ + CREATE TABLE ${indexTbName1} ( + `@timestamp` int(11) NULL COMMENT "", + `clientip` varchar(20) NULL COMMENT "", + `request` array NULL COMMENT "[]", + `status` int(11) NULL COMMENT "", + `size` int(11) NULL COMMENT "", + INDEX request_idx (`request`) USING INVERTED PROPERTIES("parser" = "english") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`@timestamp`) + COMMENT "OLAP" + DISTRIBUTED BY RANDOM BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + def load_httplogs_data = {table_name, label, read_flag, format_flag, file_name, ignore_failure=false, + expected_succ_rows = -1, load_to_single_tablet = 'true' -> + + // load the json data + streamLoad { + table "${table_name}" + + // set http request header params + set 'label', label + "_" + UUID.randomUUID().toString() + set 'read_json_by_line', read_flag + set 'format', format_flag + file file_name // import json file + time 10000 // limit inflight 10s + if (expected_succ_rows >= 0) { + set 'max_filter_ratio', '1' + } + + // if declared a check callback, the default check condition will ignore. + // So you must check all condition + check { result, exception, startTime, endTime -> + if (ignore_failure && expected_succ_rows < 0) { return } + if (exception != null) { + throw exception + } + log.info("Stream load result: ${result}".toString()) + def json = parseJson(result) + assertEquals("success", json.Status.toLowerCase()) + if (expected_succ_rows >= 0) { + assertEquals(json.NumberLoadedRows, expected_succ_rows) + } else { + assertEquals(json.NumberTotalRows, json.NumberLoadedRows + json.NumberUnselectedRows) + assertTrue(json.NumberLoadedRows > 0 && json.LoadBytes > 0) + } + } + } + } + + try { + load_httplogs_data.call(indexTbName1, 'test_index_match_regexp_arr', 'true', 'json', 'documents-1000.json') + + sql "sync" + + qt_sql """ select count() from test_index_match_regexp_arr where array_contains(request, '^h'); """ + qt_sql """ select count() from test_index_match_regexp_arr where array_contains(request, '^team'); """ + qt_sql """ select count() from test_index_match_regexp_arr where array_contains(request, 's\$'); """ + qt_sql """ select count() from test_index_match_regexp_arr where array_contains(request, 'er\$'); """ + qt_sql """ select count() from test_index_match_regexp_arr where array_contains(request, '.*tickets.*'); """ + qt_sql """ select count() from test_index_match_regexp_arr where array_contains(request, 'nonexistence'); """ + + } finally { + //try_sql("DROP TABLE IF EXISTS ${testTable}") + } +} \ No newline at end of file diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_index_null_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_index_null_arr.groovy new file mode 100644 index 00000000000000..03d9d8c3f4ee27 --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_index_null_arr.groovy @@ -0,0 +1,56 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + + +suite("test_null_index_arr", "array_contains_inverted_index"){ + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + // prepare test table + def timeout = 60000 + def delta_time = 1000 + def alter_res = "null" + def useTime = 0 + + def indexTblName = "null_index_test_arr" + + sql "DROP TABLE IF EXISTS ${indexTblName}" + // create 1 replica table + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName}( + `id` int(11) NOT NULL, + `value` array NULL DEFAULT "[]", + INDEX c_value_idx(`value`) USING INVERTED PROPERTIES("parser" = "english") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + sql "INSERT INTO $indexTblName VALUES (1, []), (2, null), (3, []), (1, [null]);" + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(value, 'a');" + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(value, null);" + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(value, '[]');" + qt_sql "SELECT * FROM $indexTblName WHERE value IS NULL;" +} diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_invalid_param.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_invalid_param.groovy new file mode 100644 index 00000000000000..2d3409eb8779de --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_invalid_param.groovy @@ -0,0 +1,118 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + + +suite("test_invalid_param", "array_contains_inverted_index"){ + // prepare test table + def indexTblName = "unicode_test1_arr" + sql """ set enable_profile = true; """ + sql """ set enable_inverted_index_query=true; """ + sql """ set enable_common_expr_pushdown=true; """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true; """ + sql "DROP TABLE IF EXISTS ${indexTblName}" + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName}( + `id`int(11)NULL, + `c` ARRAY NULL, + INDEX c_idx(`c`) USING INVERTED PROPERTIES("parser"="unicode") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + sql "INSERT INTO $indexTblName VALUES (1, ['the']), (2, ['there be']), (3, ['then but ']), (4, ['at it was here']), (5, ['the will']), (6, null), (7, []), (8, ['']), (9, [' '])" + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'the') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'there') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'then') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'at') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'the will') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'there be') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'then but ') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'then but') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'at it was here') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, '') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, ' ') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, '[]') ORDER BY id"; + + + def indexTblName2 = "english_test2_arr" + + sql "DROP TABLE IF EXISTS ${indexTblName2}" + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName2}( + `id`int(11)NULL, + `c` array NULL, + INDEX c_idx(`c`) USING INVERTED PROPERTIES("parser"="english") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + sql "INSERT INTO $indexTblName VALUES (1, ['the']), (2, ['there be']), (3, ['then but ']), (4, ['at it was here']), (5, ['the will']), (6, null), (7, []), (8, ['']), (9, [' '])" + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'the') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'there') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'then') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'at') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'the will') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'there be') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'then but ') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'then but') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'at it was here') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, '') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, ' ') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, '[]') ORDER BY id"; + + def indexTblName3 = "none_test3_arr" + + sql "DROP TABLE IF EXISTS ${indexTblName3}" + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName3}( + `id`int(11)NULL, + `c` array NULL, + INDEX c_idx(`c`) USING INVERTED PROPERTIES("parser"="none") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + sql "INSERT INTO $indexTblName VALUES (1, ['the']), (2, ['there be']), (3, ['then but ']), (4, ['at it was here']), (5, ['the will']), (6, null), (7, []), (8, ['']), (9, [' '])" + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'the') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'there') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'then') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'at') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'the will') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'there be') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'then but ') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'then but') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'at it was here') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, '') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, ' ') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, '[]') ORDER BY id"; + +} diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_inverted_index_null_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_inverted_index_null_arr.groovy new file mode 100644 index 00000000000000..53a7781ab6f2e6 --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_inverted_index_null_arr.groovy @@ -0,0 +1,100 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +suite("test_inverted_index_null_arr", "array_contains_inverted_index") { + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + def tableName = "test_inverted_index_null_arr" + + sql "drop table if exists ${tableName}" + + sql """ + CREATE TABLE IF NOT EXISTS `${tableName}` ( + `id` int NULL COMMENT "", + `city` array NULL COMMENT "[]", + `addr` array NULL COMMENT "[]", + `name` varchar(20) NULL COMMENT "", + `compy` varchar(20) NULL COMMENT "", + `n` array NULL COMMENT "[]", + INDEX idx_city(city) USING INVERTED, + INDEX idx_addr(addr) USING INVERTED PROPERTIES("parser"="english"), + INDEX idx_n(n) USING INVERTED + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT "OLAP" + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "in_memory" = "false", + "storage_format" = "V2" + ) + """ + + + sql """insert into ${tableName} values + (1,null,['addr qie3'],'yy','lj',[100]), + (2,null,['hehe'],null,'lala',[200]), + (3,['beijing'],['addr xuanwu'],'wugui',null,[300]), + (4,['beijing'],['addr fengtai'],'fengtai1','fengtai2',null), + (5,['beijing'],['addr chaoyang'],'wangjing','donghuqu',[500]), + (6,['shanghai'],[null],null,'haha',[null]), + (7,['tengxun'],['qie'],'addr gg','lj',[null]), + (8,['tengxun2'],['null'],null,'lj',[800]) + """ + + // select all data + qt_select_0 "SELECT * FROM ${tableName} ORDER BY id" + + // test IS NULL , IS NOT NULL + qt_select_is_null_1 "SELECT * FROM ${tableName} WHERE city IS NULL ORDER BY id" + qt_select_is_null_2 "SELECT * FROM ${tableName} WHERE city IS NOT NULL ORDER BY id" + qt_select_is_null_3 "SELECT * FROM ${tableName} WHERE addr IS NULL ORDER BY id" + qt_select_is_null_4 "SELECT * FROM ${tableName} WHERE addr IS NOT NULL ORDER BY id" + qt_select_is_null_5 "SELECT * FROM ${tableName} WHERE n IS NULL ORDER BY id" + qt_select_is_null_6 "SELECT * FROM ${tableName} WHERE n IS NOT NULL ORDER BY id" + + // test array element IS NULL , IS NOT NULL + qt_select_is_null_7 "SELECT * FROM ${tableName} WHERE city[1] IS NULL ORDER BY id" + qt_select_is_null_8 "SELECT * FROM ${tableName} WHERE city[1] IS NOT NULL ORDER BY id" + qt_select_is_null_9 "SELECT * FROM ${tableName} WHERE addr[1] IS NULL ORDER BY id" + qt_select_is_null_10 "SELECT * FROM ${tableName} WHERE addr[1] IS NOT NULL ORDER BY id" + qt_select_is_null_11 "SELECT * FROM ${tableName} WHERE n[1] IS NULL ORDER BY id" + qt_select_is_null_12 "SELECT * FROM ${tableName} WHERE n[1] IS NOT NULL ORDER BY id" + + + // test compare predicate + qt_select_compare_11 "SELECT * FROM ${tableName} WHERE array_contains(city, 'shanghai') ORDER BY id" + qt_select_compare_12 "SELECT * FROM ${tableName} WHERE !array_contains(city, 'shanghai') ORDER BY id" + qt_select_compare_13 "SELECT * FROM ${tableName} WHERE city[1] <= 'shanghai' ORDER BY id" + qt_select_compare_14 "SELECT * FROM ${tableName} WHERE city[1] >= 'shanghai' ORDER BY id" + + qt_select_compare_21 "SELECT * FROM ${tableName} WHERE array_contains(n, 500) ORDER BY id" + qt_select_compare_22 "SELECT * FROM ${tableName} WHERE !array_contains(n, 500) ORDER BY id" + + qt_select_compare_23 "SELECT * FROM ${tableName} WHERE n[1] <= 500 ORDER BY id" + qt_select_compare_24 "SELECT * FROM ${tableName} WHERE n[1] >= 500 ORDER BY id" + + // test match predicates + qt_select_match_1 "SELECT * FROM ${tableName} WHERE array_contains(addr, 'addr fengtai') ORDER BY id" + qt_select_match_2 "SELECT * FROM ${tableName} WHERE array_contains(addr, 'addr') ORDER BY id" +} + diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_lowercase_arr.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_lowercase_arr.groovy new file mode 100644 index 00000000000000..aa0b1070a372da --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_lowercase_arr.groovy @@ -0,0 +1,249 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + + +suite("test_lowercase_arr", "array_contains_inverted_index"){ + // here some variable to control inverted index query + sql """ set enable_profile=true""" + sql """ set enable_pipeline_x_engine=true;""" + sql """ set enable_inverted_index_query=true""" + sql """ set enable_common_expr_pushdown=true """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true """ + + // prepare test table + def indexTblName = "lowercase_test1_arr" + + sql "DROP TABLE IF EXISTS ${indexTblName}" + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName}( + `id`int(11)NULL, + `c` ARRAY NULL, + INDEX c_idx(`c`) USING INVERTED PROPERTIES("parser"="english") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + sql "INSERT INTO $indexTblName VALUES (1, ['hello world']), (2, ['HELLO WORLD']), (3, ['Hello World']);" + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'hello') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'HELLO') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'Hello') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'HELLO WORLD') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'Hello World') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'hello world') ORDER BY id"; + + def indexTblName2 = "lowercase_test2_arr" + + sql "DROP TABLE IF EXISTS ${indexTblName2}" + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName2}( + `id`int(11)NULL, + `c` array NULL, + INDEX c_idx(`c`) USING INVERTED PROPERTIES("parser"="unicode") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + sql "INSERT INTO $indexTblName2 VALUES (1, ['hello 我来到北京清华大学']), (2, ['HELLO 我爱你中国']), (3, ['Hello 人民可以得到更多实惠']);" + qt_sql "SELECT * FROM $indexTblName2 WHERE array_contains(c, 'hello') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName2 WHERE array_contains(c, 'HELLO') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName2 WHERE array_contains(c, 'Hello') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName2 WHERE array_contains(c, 'hello 我来到北京清华大学') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName2 WHERE array_contains(c, 'HELLO 我爱你中国') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName2 WHERE array_contains(c, 'Hello 人民可以得到更多实惠') ORDER BY id"; + + def indexTblName3 = "lowercase_test3_arr" + + sql "DROP TABLE IF EXISTS ${indexTblName3}" + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName3}( + `id`int(11)NULL, + `c` array NULL, + INDEX c_idx(`c`) USING INVERTED PROPERTIES("parser"="chinese") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + sql "INSERT INTO $indexTblName3 VALUES (1, ['hello 我来到北京清华大学']), (2, ['HELLO 我爱你中国']), (3, ['Hello 人民可以得到更多实惠']);" + qt_sql "SELECT * FROM $indexTblName2 WHERE array_contains(c, 'hello') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName2 WHERE array_contains(c, 'HELLO') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName2 WHERE array_contains(c, 'Hello') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName2 WHERE array_contains(c, 'hello 我来到北京清华大学') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName2 WHERE array_contains(c, 'HELLO 我爱你中国') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName2 WHERE array_contains(c, 'Hello 人民可以得到更多实惠') ORDER BY id"; + + def indexTblName4 = "lowercase_test11_arr" + + sql "DROP TABLE IF EXISTS ${indexTblName4}" + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName4}( + `id`int(11)NULL, + `c` array NULL, + INDEX c_idx(`c`) USING INVERTED PROPERTIES("parser"="english","lower_case"="true") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + sql "INSERT INTO $indexTblName4 VALUES (1, ['hello world']), (2, ['HELLO WORLD']), (3, ['Hello World']);" + qt_sql "SELECT * FROM $indexTblName4 WHERE array_contains(c, 'hello') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName4 WHERE array_contains(c, 'HELLO') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName4 WHERE array_contains(c, 'Hello') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName4 WHERE array_contains(c, 'HELLO WORLD') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName4 WHERE array_contains(c, 'Hello World') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName4 WHERE array_contains(c, 'hello world') ORDER BY id"; + + def indexTblName5 = "lowercase_test12_arr" + + sql "DROP TABLE IF EXISTS ${indexTblName5}" + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName5}( + `id`int(11)NULL, + `c` array NULL, + INDEX c_idx(`c`) USING INVERTED PROPERTIES("parser"="unicode","lower_case"="true") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + sql "INSERT INTO $indexTblName5 VALUES (1, ['hello 我来到北京清华大学']), (2, ['HELLO 我爱你中国']), (3, ['Hello 人民可以得到更多实惠']);" + qt_sql "SELECT * FROM $indexTblName5 WHERE array_contains(c, 'hello') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName5 WHERE array_contains(c, 'HELLO') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName5 WHERE array_contains(c, 'Hello') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName5 WHERE array_contains(c, 'hello 我来到北京清华大学') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName5 WHERE array_contains(c, 'HELLO 我爱你中国') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName5 WHERE array_contains(c, 'Hello 人民可以得到更多实惠') ORDER BY id"; + + def indexTblName6 = "lowercase_test13_arr" + + sql "DROP TABLE IF EXISTS ${indexTblName6}" + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName6}( + `id`int(11)NULL, + `c` array NULL, + INDEX c_idx(`c`) USING INVERTED PROPERTIES("parser"="chinese","lower_case"="true") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + sql "INSERT INTO $indexTblName6 VALUES (1, ['hello 我来到北京清华大学']), (2, ['HELLO 我爱你中国']), (3, ['Hello 人民可以得到更多实惠']);" + qt_sql "SELECT * FROM $indexTblName6 WHERE array_contains(c, 'hello') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName6 WHERE array_contains(c, 'HELLO') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName6 WHERE array_contains(c, 'Hello') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName6 WHERE array_contains(c, 'hello 我来到北京清华大学') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName6 WHERE array_contains(c, 'HELLO 我爱你中国') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName6 WHERE array_contains(c, 'Hello 人民可以得到更多实惠') ORDER BY id"; + + def indexTblName7 = "lowercase_test21_arr" + + sql "DROP TABLE IF EXISTS ${indexTblName7}" + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName7}( + `id`int(11)NULL, + `c` array NULL, + INDEX c_idx(`c`) USING INVERTED PROPERTIES("parser"="english","lower_case"="false") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + sql "INSERT INTO $indexTblName7 VALUES (1, ['hello world']), (2, ['HELLO WORLD']), (3, ['Hello World']);" + qt_sql "SELECT * FROM $indexTblName7 WHERE array_contains(c, 'hello') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName7 WHERE array_contains(c, 'HELLO') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName7 WHERE array_contains(c, 'Hello') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName7 WHERE array_contains(c, 'HELLO WORLD') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName7 WHERE array_contains(c, 'Hello World') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName7 WHERE array_contains(c, 'hello world') ORDER BY id"; + + def indexTblName8 = "lowercase_test22_arr" + + sql "DROP TABLE IF EXISTS ${indexTblName8}" + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName8}( + `id`int(11)NULL, + `c` array NULL, + INDEX c_idx(`c`) USING INVERTED PROPERTIES("parser"="unicode","lower_case"="false") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + sql "INSERT INTO $indexTblName8 VALUES (1, ['hello 我来到北京清华大学']), (2, ['HELLO 我爱你中国']), (3, ['Hello 人民可以得到更多实惠']);" + qt_sql "SELECT * FROM $indexTblName8 WHERE array_contains(c, 'hello') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName8 WHERE array_contains(c, 'HELLO') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName8 WHERE array_contains(c, 'Hello') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName8 WHERE array_contains(c, 'hello 我来到北京清华大学') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName8 WHERE array_contains(c, 'HELLO 我爱你中国') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName8 WHERE array_contains(c, 'Hello 人民可以得到更多实惠') ORDER BY id"; + + def indexTblName9 = "lowercase_test23_arr" + + sql "DROP TABLE IF EXISTS ${indexTblName9}" + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName9}( + `id`int(11)NULL, + `c` array NULL, + INDEX c_idx(`c`) USING INVERTED PROPERTIES("parser"="chinese","lower_case"="false") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + sql "INSERT INTO $indexTblName9 VALUES (1, ['hello 我来到北京清华大学']), (2, ['HELLO 我爱你中国']), (3, ['Hello 人民可以得到更多实惠']);" + qt_sql "SELECT * FROM $indexTblName9 WHERE array_contains(c, 'hello') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName9 WHERE array_contains(c, 'HELLO') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName9 WHERE array_contains(c, 'Hello') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName9 WHERE array_contains(c, 'hello 我来到北京清华大学') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName9 WHERE array_contains(c, 'HELLO 我爱你中国') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName9 WHERE array_contains(c, 'Hello 人民可以得到更多实惠') ORDER BY id"; +} diff --git a/regression-test/suites/inverted_index_p0/array_contains/test_parser_with_none_stopwords.groovy b/regression-test/suites/inverted_index_p0/array_contains/test_parser_with_none_stopwords.groovy new file mode 100644 index 00000000000000..e24a439fa1c941 --- /dev/null +++ b/regression-test/suites/inverted_index_p0/array_contains/test_parser_with_none_stopwords.groovy @@ -0,0 +1,118 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + + +suite("test_parser_with_none_stopwords", "array_contains_inverted_index"){ + // prepare test table + def indexTblName = "unicode_test1_arr_no_stopwords" + sql """ set enable_profile = true; """ + sql """ set enable_inverted_index_query=true; """ + sql """ set enable_common_expr_pushdown=true; """ + sql """ set enable_common_expr_pushdown_for_inverted_index=true; """ + sql "DROP TABLE IF EXISTS ${indexTblName}" + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName}( + `id`int(11)NULL, + `c` ARRAY NULL, + INDEX c_idx(`c`) USING INVERTED PROPERTIES("parser"="unicode", "stopwords" = "none") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + sql "INSERT INTO $indexTblName VALUES (1, ['the']), (2, ['there be']), (3, ['then but ']), (4, ['at it was here']), (5, ['the will']), (6, null), (7, []), (8, ['']), (9, [' '])" + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'the') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'there') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'then') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'at') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'the will') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'there be') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'then but ') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'then but') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'at it was here') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, '') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, ' ') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, '[]') ORDER BY id"; + + + def indexTblName2 = "english_test2_arr" + + sql "DROP TABLE IF EXISTS ${indexTblName2}" + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName2}( + `id`int(11)NULL, + `c` array NULL, + INDEX c_idx(`c`) USING INVERTED PROPERTIES("parser"="english", "stopwords" = "none") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + sql "INSERT INTO $indexTblName VALUES (1, ['the']), (2, ['there be']), (3, ['then but ']), (4, ['at it was here']), (5, ['the will']), (6, null), (7, []), (8, ['']), (9, [' '])" + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'the') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'there') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'then') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'at') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'the will') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'there be') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'then but ') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'then but') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'at it was here') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, '') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, ' ') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, '[]') ORDER BY id"; + + def indexTblName3 = "none_test3_arr" + + sql "DROP TABLE IF EXISTS ${indexTblName3}" + sql """ + CREATE TABLE IF NOT EXISTS ${indexTblName3}( + `id`int(11)NULL, + `c` array NULL, + INDEX c_idx(`c`) USING INVERTED PROPERTIES("parser"="none", "stopwords" = "none") COMMENT '' + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + sql "INSERT INTO $indexTblName VALUES (1, ['the']), (2, ['there be']), (3, ['then but ']), (4, ['at it was here']), (5, ['the will']), (6, null), (7, []), (8, ['']), (9, [' '])" + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'the') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'there') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'then') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'at') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'the will') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'there be') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'then but ') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'then but') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, 'at it was here') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, '') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, ' ') ORDER BY id"; + qt_sql "SELECT * FROM $indexTblName WHERE array_contains(c, '[]') ORDER BY id"; + +}