66 行
3.1 KiB
Ruby
66 行
3.1 KiB
Ruby
# Server-owned version identities, attributes and field types. No client SQL is accepted.
|
|
class CountsResourceDefinition
|
|
COMMON = { 'resource_id' => :integer, 'version_no' => :integer,
|
|
'event_type' => :enum, 'user' => :integer, 'created_at' => :datetime }.freeze
|
|
DEFINITIONS = {
|
|
'posts' => [PostVersion, ['post_id'], {
|
|
'title' => :string, 'url' => :string, 'thumbnail_base' => :string,
|
|
'tags_json' => :json, 'parent_post_ids' => :string, 'video_ms' => :integer,
|
|
'original_created_from' => :datetime, 'original_created_before' => :datetime }],
|
|
'tags' => [TagVersion, ['tag_id'], {
|
|
'name' => :string, 'names' => :json, 'category' => :enum, 'aliases' => :string,
|
|
'parent_tag_ids' => :string, 'deprecated_at' => :datetime }],
|
|
'nico_tags' => [NicoTagVersion, ['tag_id'], {
|
|
'name' => :string, 'linked_tags' => :string }],
|
|
'tag_descriptions' => [TagDescriptionVersion, ['tag_id', 'language_code'], {
|
|
'language_code' => :enum, 'body' => :string,
|
|
'source_language_code' => :enum, 'source_version_no' => :integer }],
|
|
'tag_groups' => [TagGroupVersion, ['tag_group_id'], {
|
|
'name' => :string, 'description' => :string,
|
|
'members' => :json, 'placements' => :json }],
|
|
'materials' => [MaterialVersion, ['material_id'], {
|
|
'url' => :string, 'parent_id' => :integer, 'tag_id' => :integer,
|
|
'tag_name' => :string, 'tag_category' => :enum,
|
|
'discarded_at' => :datetime, 'updated_at' => :datetime,
|
|
'updated_by_user_id' => :integer, 'export_paths_json' => :json,
|
|
'file_blob_id' => :integer, 'file_filename' => :string,
|
|
'file_content_type' => :string, 'file_byte_size' => :integer,
|
|
'file_checksum' => :string, 'file_sha256' => :string,
|
|
'source_kind' => :enum, 'source_uri' => :string, 'source_path' => :string,
|
|
'source_file_id' => :string, 'normalized_source_key' => :string }] }.freeze
|
|
OPERATORS = {
|
|
string: ['eq', 'ne', 'like'], enum: ['eq', 'ne'], boolean: ['eq', 'ne'],
|
|
integer: ['eq', 'ne', 'gt', 'lt', 'ge', 'le', 'range'],
|
|
datetime: ['eq', 'ne', 'gt', 'lt', 'ge', 'le', 'range'] }.freeze
|
|
|
|
attr_reader :model, :keys, :fields, :resource
|
|
|
|
def initialize(resource)
|
|
@resource = resource
|
|
@model, @keys, attributes = DEFINITIONS.fetch(resource) { raise ArgumentError }
|
|
@fields = COMMON.merge(attributes)
|
|
end
|
|
|
|
def table = model.table_name
|
|
def time_column = 'created_at'
|
|
def column(key)
|
|
raise ArgumentError unless fields.key?(key)
|
|
|
|
{ 'resource_id' => keys.first, 'user' => 'created_by_user_id' }.fetch(key, key)
|
|
end
|
|
|
|
def expression(key, row = 'v') = "#{ row }.#{ column(key) }"
|
|
def changes = fields.keys - COMMON.keys - ['updated_at', 'updated_by_user_id']
|
|
def axes(history)
|
|
fields.reject { |_key, type| type == :json }.keys +
|
|
(resource == 'posts' ? ['tags'] : []) + (history ? ['changed_field'] : [])
|
|
end
|
|
|
|
def metadata
|
|
fields.map do |key, type|
|
|
{ key:, type:, nullable: model.columns_hash.fetch(column(key)).null,
|
|
operators: OPERATORS.fetch(type, []) }
|
|
end
|
|
end
|
|
end
|