**Describe the situation**
hasAll() filter condition not relying on bloom filter, but re-writing as series of has() AND has()... (or series of indexOf conditions) does use bloom filter 

**How to reproduce**
* ClickHouse server version: 21.2.7.2

Test Table: 
- 33M records, 10 columns
- MergeTree() engine, has a sort order specified
- Has a field STRING_ARRAY that is a Array(String) column. It has a bloom filter data-skipping index (`TYPE bloom_filter(0.01) GRANULARITY 1`)

The following query takes 1.5 seconds: 
```
SELECT * FROM db_name.table_name
WHERE hasAll(STRING_ARRAY, ['value_1', 'value_2', 'value_3']
```
Running `EXPLAIN indexes = 1`, only the primary key is picked up. The bloom filter isn't used. 

The following query takes 0.45 seconds: 
```
SELECT * FROM db_name.table_name
WHERE has(STRING_ARRAY, 'value_1') AND has(STRING_ARRAY, 'value_2') AND has(STRING_ARRAY, 'value_3')
```
Running `EXPLAIN indexes = 1`, the bloom filter is used. 

**Expected performance**
Expecting the hasAll() filter condition to also get performance improvement from the bloom filter on STRING_ARRAY. 

for (const auto & element : rpn)
    {
        if (element.function == RPNElement::FUNCTION_UNKNOWN)
        {
            rpn_stack.emplace_back(true, true);
        }
        else if (element.function == RPNElement::FUNCTION_IN
            || element.function == RPNElement::FUNCTION_NOT_IN
            || element.function == RPNElement::FUNCTION_EQUALS
            || element.function == RPNElement::FUNCTION_NOT_EQUALS
            || element.function == RPNElement::FUNCTION_HAS
            || element.function == RPNElement::FUNCTION_HAS_ANY)
        {
            bool match_rows = true;
            const auto & predicate = element.predicate;
            for (size_t index = 0; match_rows && index < predicate.size(); ++index)
            {
                const auto & query_index_hash = predicate[index];
                const auto & filter = filters[query_index_hash.first];
                const ColumnPtr & hash_column = query_index_hash.second;
                match_rows = maybeTrueOnBloomFilter(&*hash_column, filter, hash_functions);
            }
            rpn_stack.emplace_back(match_rows, true);
            if (element.function == RPNElement::FUNCTION_NOT_EQUALS || element.function == RPNElement::FUNCTION_NOT_IN)
                rpn_stack.back() = !rpn_stack.back();
        }
        else if (element.function == RPNElement::FUNCTION_NOT)
        {
            rpn_stack.back() = !rpn_stack.back();
        }