bool celix_filter_equals()

in libs/utils/src/filter.c [896:958]


bool celix_filter_equals(const celix_filter_t* filter1, const celix_filter_t* filter2) {
    if (filter1 == filter2) {
        return true;
    }
    if (!filter1 || !filter2) {
        return false;
    }
    if (filter1->operand != filter2->operand) {
        return false;
    }

    if (filter1->operand == CELIX_FILTER_OPERAND_AND || filter1->operand == CELIX_FILTER_OPERAND_OR ||
        filter1->operand == CELIX_FILTER_OPERAND_NOT) {
        assert(filter1->children != NULL);
        assert(filter2->children != NULL);
        int sizeSrc = celix_arrayList_size(filter1->children);
        int sizeDest = celix_arrayList_size(filter2->children);
        if (sizeSrc == sizeDest) {
            int i;
            int k;
            int sameCount = 0;
            for (i = 0; i < sizeSrc; ++i) {
                bool same = false;
                celix_filter_t* srcPart = celix_arrayList_get(filter1->children, i);
                for (k = 0; k < sizeDest; ++k) {
                    celix_filter_t* destPart = celix_arrayList_get(filter2->children, k);
                    filter_match_filter(srcPart, destPart, &same);
                    if (same) {
                        sameCount += 1;
                        break;
                    }
                }
            }
            return sameCount == sizeSrc;
        }
        return false;
    }

    if (!celix_utils_stringEquals(filter1->attribute, filter2->attribute)) {
        return false;
    }

    if (filter1->operand == CELIX_FILTER_OPERAND_SUBSTRING) {
        assert(filter1->children != NULL);
        assert(filter2->children != NULL);
        int sizeSrc = celix_arrayList_size(filter1->children);
        int sizeDest = celix_arrayList_size(filter2->children);
        if (sizeSrc == sizeDest) {
            int i;
            for (i = 0; i < celix_arrayList_size(filter1->children); i++) {
                const char* srcPart = celix_arrayList_getString(filter1->children, i);
                const char* destPart = celix_arrayList_getString(filter2->children, i);
                if (!celix_utils_stringEquals(srcPart, destPart)) {
                    break;
                }
            }
            return i == sizeSrc;
        }
        return false;
    }

    return celix_utils_stringEquals(filter1->value, filter2->value);
}