このコミットが含まれているのは:
@@ -111,6 +111,30 @@ class CountsResourceDefinition
|
||||
|
||||
def field_label(key) = LABELS.fetch(key, "counts:attributes.#{ key }")
|
||||
|
||||
def self.name_key(code) = "name_#{ code.to_s.downcase.tr('-', '_') }"
|
||||
|
||||
def name_columns
|
||||
@name_columns ||= Locale.order(:code).map do |locale|
|
||||
{ key: self.class.name_key(locale.code), label: 'counts:localeName',
|
||||
label_values: { locale: locale.name },
|
||||
name_locale: { code: locale.code, language_code: locale.language_code,
|
||||
script_code: locale.script_code } }
|
||||
end
|
||||
end
|
||||
|
||||
def name_column(key) = name_columns.find { _1[:key] == key }
|
||||
|
||||
def name_expression(key, row = 'v')
|
||||
locale = name_column(key).fetch(:name_locale)
|
||||
connection = model.connection
|
||||
path = connection.quote("$.#{ locale[:language_code].to_json }")
|
||||
script = connection.quote(locale[:script_code])
|
||||
"CASE WHEN LOWER(JSON_UNQUOTE(JSON_EXTRACT(#{ row }.names, " +
|
||||
"CONCAT(#{ path }, '.script_code')))) = LOWER(#{ script }) " +
|
||||
"THEN JSON_UNQUOTE(NULLIF(JSON_EXTRACT(#{ row }.names, " +
|
||||
"CONCAT(#{ path }, '.name')), CAST('null' AS JSON))) END"
|
||||
end
|
||||
|
||||
def output_fields
|
||||
content = case resource
|
||||
when 'posts'
|
||||
@@ -122,7 +146,9 @@ class CountsResourceDefinition
|
||||
keys = ['resource_id', 'version_no', 'latest'] + (content - ['thumbnail']) +
|
||||
['event_type', 'user', 'created_at']
|
||||
keys.unshift('thumbnail') if content.include?('thumbnail')
|
||||
keys.map do |key|
|
||||
keys.flat_map do |key|
|
||||
next name_columns if key == 'name' && resource == 'tags'
|
||||
next [] if key == 'names' && resource == 'tags'
|
||||
label = if key == 'parents'
|
||||
resource == 'tags' ? 'tags:parents' : 'shared:labels.parentPosts'
|
||||
else field_label(key)
|
||||
@@ -130,16 +156,15 @@ class CountsResourceDefinition
|
||||
field = { key:, label: }
|
||||
children = child_fields(key)
|
||||
field[:children] = children if children.any?
|
||||
field
|
||||
[field]
|
||||
end
|
||||
end
|
||||
|
||||
def child_fields(key, depth = 4)
|
||||
keys = case key
|
||||
when 'tags' then ['id', 'versionNo', 'kind', 'name', 'category', 'sections', 'names']
|
||||
when 'tags' then ['id', 'versionNo', 'kind', 'name', 'category', 'sections', 'aliases']
|
||||
when 'names' then ['languageCode', 'scriptCode', 'name', 'aliases', 'autoGenerated']
|
||||
when 'aliases'
|
||||
resource == 'tags' ? ['languageCode', 'name', 'scriptCode'] : ['name', 'scriptCode']
|
||||
when 'aliases' then ['languageCode', 'name', 'scriptCode']
|
||||
when 'parents' then resource == 'tags' ? ['id', 'name'] : ['id']
|
||||
when 'members' then ['tagId', 'tagGroupId', 'versionNo']
|
||||
when 'export_paths_json' then ['profile', 'path']
|
||||
@@ -148,17 +173,39 @@ class CountsResourceDefinition
|
||||
scalar + (depth > 0 ? ['children'] : [])
|
||||
else []
|
||||
end
|
||||
keys.map do |child|
|
||||
keys.flat_map do |child|
|
||||
if child == 'name' && ['tags', 'parents'].include?(key)
|
||||
next [{ key: child, label: CHILD_LABELS.fetch(child) }, *name_columns]
|
||||
end
|
||||
label = key == 'members' && child == 'tagId' ?
|
||||
'counts:columns.resourceId' : CHILD_LABELS.fetch(child)
|
||||
field = { key: child, label: }
|
||||
children = child_fields(child, child == 'children' ? depth - 1 : depth)
|
||||
# Language is attached to top-level aliases, not to aliases inside a language entry.
|
||||
children = children.reject { _1[:key] == 'languageCode' } if child == 'aliases'
|
||||
if child == 'aliases' && key == 'names'
|
||||
children = children.reject { _1[:key] == 'languageCode' }
|
||||
end
|
||||
field[:children] = children if children.any?
|
||||
field
|
||||
[field]
|
||||
end
|
||||
end
|
||||
|
||||
def condition_fields
|
||||
fields = output_fields
|
||||
if resource == 'tags'
|
||||
fields += [{ key: 'name', label: 'counts:columns.name' },
|
||||
{ key: 'names', label: 'counts:columns.names', children: child_fields('names') }]
|
||||
end
|
||||
if resource == 'posts'
|
||||
fields = fields.map do |field|
|
||||
next field unless field[:key] == 'tags'
|
||||
|
||||
field.merge(children: field[:children] + [
|
||||
{ key: 'names', label: 'counts:columns.names', children: child_fields('names') }])
|
||||
end
|
||||
end
|
||||
fields
|
||||
end
|
||||
|
||||
def filter_metadata = @filter_metadata ||= CountsCondition.fields(self)
|
||||
end
|
||||
|
||||
新しいイシューから参照
ユーザーをブロックする