提交 6f26e99c 编写于 作者: J Jean Boussier

Improve == and hash methods on various schema cache structs to be allocation free.

The previous implementation would allocate 2 arrays per comparisons.

I tried relying on Struct, but they do allocate one Hash inside `Struct#hash`.
上级 ac786cd1
......@@ -63,19 +63,24 @@ def encode_with(coder)
def ==(other)
other.is_a?(Column) &&
attributes_for_hash == other.attributes_for_hash
name == other.name &&
default == other.default &&
sql_type_metadata == other.sql_type_metadata &&
null == other.null &&
default_function == other.default_function &&
collation == other.collation
end
alias :eql? :==
def hash
attributes_for_hash.hash
Column.hash ^
name.hash ^
default.hash ^
sql_type_metadata.hash ^
null.hash ^
default_function.hash ^
collation.hash
end
protected
def attributes_for_hash
[self.class, name, default, sql_type_metadata, null, default_function, collation, comment]
end
end
class NullColumn < Column
......
......@@ -16,19 +16,16 @@ def initialize(type_metadata, extra: "")
def ==(other)
other.is_a?(MySQL::TypeMetadata) &&
attributes_for_hash == other.attributes_for_hash
__getobj__ == other.__getobj__ &&
extra == other.extra
end
alias eql? ==
def hash
attributes_for_hash.hash
TypeMetadata.hash ^
__getobj__.hash ^
extra.hash
end
protected
def attributes_for_hash
[self.class, @type_metadata, extra]
end
end
end
end
......
......@@ -22,19 +22,20 @@ def sql_type
def ==(other)
other.is_a?(PostgreSQLTypeMetadata) &&
attributes_for_hash == other.attributes_for_hash
__getobj__ == other.__getobj__ &&
oid == other.oid &&
fmod == other.fmod &&
array == other.array
end
alias eql? ==
def hash
attributes_for_hash.hash
PostgreSQLTypeMetadata.hash ^
__getobj__.hash ^
oid.hash ^
fmod.hash ^
array.hash
end
protected
def attributes_for_hash
[self.class, @type_metadata, oid, fmod]
end
end
end
end
......@@ -16,19 +16,22 @@ def initialize(sql_type: nil, type: nil, limit: nil, precision: nil, scale: nil)
def ==(other)
other.is_a?(SqlTypeMetadata) &&
attributes_for_hash == other.attributes_for_hash
sql_type == other.sql_type &&
type == other.type &&
limit == other.limit &&
precision == other.precision &&
scale == other.scale
end
alias eql? ==
def hash
attributes_for_hash.hash
SqlTypeMetadata.hash ^
sql_type.hash ^
type.hash ^
limit.hash ^
precision.hash >> 1 ^
scale.hash >> 2
end
protected
def attributes_for_hash
[self.class, sql_type, type, limit, precision, scale]
end
end
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册