equals method
Checks if two NodeValue are equivalent in values.
Implementation
@override
bool equals(Object? n2, [bool ignoreTimestamp = true]) {
if (n2 == null || n2 is! NodeImpl) {
if (_debug) {
print('## Equals: #1');
}
return false;
}
// check if both are in same skeletonized state
if (skeleton != n2.skeleton) {
return false;
}
if (!skeleton) {
// check ordinals
if (_ordinals.length != n2._ordinals.length) {
if (_debug) {
print('## Equals: #5');
}
return false;
}
List<Field> lf = Field.values;
if (ignoreTimestamp) {
lf.remove(Field.lastModified);
}
for (Field e in lf) {
try {
if (n2._ordinals[e] != _ordinals[e]) {
if (_debug) {
print('## Equals: #6');
}
return false;
}
} on Exception {
if (_debug) {
print('## Equals: #7');
}
throw Exception(
'Oops.... this should not happen... contact developer');
}
}
//check values
if (_values.length != n2._values.length) {
if (_debug) {
print('## Equals: #8');
}
return false;
}
for (var e in _values.entries) {
try {
if (!(e.value.equals(n2._values[e.key]))) {
if (_debug) {
print('## Equals: #9');
}
return false;
}
} on StorageException {
if (_debug) {
print('## Equals: #10');
}
return false;
}
}
//check child nodes
if (_childNodes.length != n2._childNodes.length) {
if (_debug) {
print(
'## Equals: #11 difference in child nodes (local: ${_childNodes.length}; remote:${n2._childNodes.length})');
}
return false;
}
for (var n in _childNodes.keys) {
if (n2._childNodes[n] == null) {
if (_debug) {
print('## Equals: #12');
}
return false;
}
}
} else {
if (path != n2.path) {
if (_debug) {
print('## Equals: #3');
}
return false;
}
if (controller != n2.controller) {
if (_debug) {
print('## Equals: #14');
}
return false;
}
}
return true;
}