Description
Current digests for RexNode, RelNode, RelType, and similar cases use String concatenation.
It is easy to implement, however, it has drawbacks:
1) String objects cannot be reused. For instance, RexCall has operands, however, the digest is duplicated. It causes extra memory use and extra CPU for string copying
2) There's no way to have multiple #toString() methods. RelType might need multiple digests: "including field names", "excluding field names".
A suggested resolution might be behind the lines of
class Digest { // immutable final int hashCode; // speedup hashCode and equals final Object[] contents; // The values are either other Digest objects or Strings String toString(); // e.g. for debugging purposes int compareTo(Digest); // e.g. for debugging purposes. }
Note how fields in Kotlin are aligned much better, and it makes it easier to read:
class Digest { // immutable val hashCode: Int // speedup hashCode and equals val contents: Array<Any> // The values are either other Digest objects or Strings fun toString(): String // e.g. for debugging purposes fun compareTo(other: Digest): Int // e.g. for debugging purposes. }
Then the digest for RexCall could be the bits relevant to RexCall itself + digests of the operands (which can be reused as is)
Attachments
Attachments
1.
|
Add benchmark test for new Digest interface | Open | Danny Chen |
|