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);
}