Initial commit

This commit is contained in:
2022-07-06 21:35:05 +02:00
commit b2494052ff
97220 changed files with 2449256 additions and 0 deletions
+448
View File
@@ -0,0 +1,448 @@
# EditorConfig is awesome:http://EditorConfig.org
# top-most EditorConfig file
root = true
# All Files
# See http://kent-boogaart.com/blog/editorconfig-reference-for-c-developers
[*]
# Don't use tabs for indentation.
indent_style = space
# (Please don't specify an indent_size here; that has too many unintended consequences.)
# Code files
# See http://kent-boogaart.com/blog/editorconfig-reference-for-c-developers
[*.{cs,csx,vb,vbx}]
charset = utf-8-bom
end_of_line = crlf
indent_style = space
indent_size = 4
insert_final_newline = false
trim_trailing_whitespace = true
# Solution Files
[*.sln]
indent_style = tab
# XML Project Files
[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}]
indent_size = 2
# Configuration Files
[*.{json,xml,yml,config,props,targets,nuspec,resx,ruleset,vsixmanifest,vsct}]
indent_size = 4
# Markdown Files
[*.md]
trim_trailing_whitespace = false
# Web Files
[*.{htm,html,js,ts,css,scss,less}]
indent_size = 4
insert_final_newline = true
# Bash Files
[*.sh]
end_of_line = lf
# Dotnet Code Style Settings
# See https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference
# See http://kent-boogaart.com/blog/editorconfig-reference-for-c-developers
[*.{cs,csx,cake,vb}]
dotnet_sort_system_directives_first = true
dotnet_style_coalesce_expression = true:warning
dotnet_style_collection_initializer = true:warning
dotnet_style_explicit_tuple_names = true:warning
dotnet_style_null_propagation = true:warning
dotnet_style_object_initializer = true:warning
dotnet_style_predefined_type_for_locals_parameters_members = true:warning
dotnet_style_predefined_type_for_member_access = true:warning
dotnet_style_qualification_for_event = false:suggestion
dotnet_style_qualification_for_field = false:suggestion
dotnet_style_qualification_for_method = false:suggestion
dotnet_style_qualification_for_property = false:suggestion
# Naming Symbols
# constant_fields - Define constant fields
dotnet_naming_symbols.constant_fields.applicable_kinds = field
dotnet_naming_symbols.constant_fields.required_modifiers = const
# non_private_readonly_fields - Define public, internal and protected readonly fields
dotnet_naming_symbols.non_private_readonly_fields.applicable_accessibilities = public, internal, protected
dotnet_naming_symbols.non_private_readonly_fields.applicable_kinds = field
dotnet_naming_symbols.non_private_readonly_fields.required_modifiers = readonly
# static_readonly_fields - Define static and readonly fields
dotnet_naming_symbols.static_readonly_fields.applicable_kinds = field
dotnet_naming_symbols.static_readonly_fields.required_modifiers = static, readonly
# private_readonly_fields - Define private readonly fields
dotnet_naming_symbols.private_readonly_fields.applicable_accessibilities = private
dotnet_naming_symbols.private_readonly_fields.applicable_kinds = field
dotnet_naming_symbols.private_readonly_fields.required_modifiers = readonly
# public_internal_fields - Define public and internal fields
dotnet_naming_symbols.public_internal_fields.applicable_accessibilities = public, internal
dotnet_naming_symbols.public_internal_fields.applicable_kinds = field
# private_protected_fields - Define private and protected fields
dotnet_naming_symbols.private_protected_fields.applicable_accessibilities = private, protected
dotnet_naming_symbols.private_protected_fields.applicable_kinds = field
# public_symbols - Define any public symbol
dotnet_naming_symbols.public_symbols.applicable_accessibilities = public, internal, protected, protected_internal
dotnet_naming_symbols.public_symbols.applicable_kinds = method, property, event, delegate
# parameters - Defines any parameter
dotnet_naming_symbols.parameters.applicable_kinds = parameter
# non_interface_types - Defines class, struct, enum and delegate types
dotnet_naming_symbols.non_interface_types.applicable_kinds = class, struct, enum, delegate
# interface_types - Defines interfaces
dotnet_naming_symbols.interface_types.applicable_kinds = interface
# Naming Styles
# camel_case - Define the camelCase style
dotnet_naming_style.camel_case.capitalization = camel_case
# pascal_case - Define the Pascal_case style
dotnet_naming_style.pascal_case.capitalization = pascal_case
# first_upper - The first character must start with an upper-case character
dotnet_naming_style.first_upper.capitalization = first_word_upper
# prefix_interface_interface_with_i - Interfaces must be PascalCase and the first character of an interface must be an 'I'
dotnet_naming_style.prefix_interface_interface_with_i.capitalization = pascal_case
dotnet_naming_style.prefix_interface_interface_with_i.required_prefix = I
# Naming Rules
# Constant fields must be PascalCase
dotnet_naming_rule.constant_fields_must_be_pascal_case.severity = warning
dotnet_naming_rule.constant_fields_must_be_pascal_case.symbols = constant_fields
dotnet_naming_rule.constant_fields_must_be_pascal_case.style = pascal_case
# Public, internal and protected readonly fields must be PascalCase
dotnet_naming_rule.non_private_readonly_fields_must_be_pascal_case.severity = warning
dotnet_naming_rule.non_private_readonly_fields_must_be_pascal_case.symbols = non_private_readonly_fields
dotnet_naming_rule.non_private_readonly_fields_must_be_pascal_case.style = pascal_case
# Static readonly fields must be PascalCase
dotnet_naming_rule.static_readonly_fields_must_be_pascal_case.severity = warning
dotnet_naming_rule.static_readonly_fields_must_be_pascal_case.symbols = static_readonly_fields
dotnet_naming_rule.static_readonly_fields_must_be_pascal_case.style = pascal_case
# Private readonly fields must be camelCase
dotnet_naming_rule.private_readonly_fields_must_be_camel_case.severity = warning
dotnet_naming_rule.private_readonly_fields_must_be_camel_case.symbols = private_readonly_fields
dotnet_naming_rule.private_readonly_fields_must_be_camel_case.style = camel_case
# Public and internal fields must be PascalCase
dotnet_naming_rule.public_internal_fields_must_be_pascal_case.severity = warning
dotnet_naming_rule.public_internal_fields_must_be_pascal_case.symbols = public_internal_fields
dotnet_naming_rule.public_internal_fields_must_be_pascal_case.style = pascal_case
# Private and protected fields must be camelCase
dotnet_naming_rule.private_protected_fields_must_be_camel_case.severity = warning
dotnet_naming_rule.private_protected_fields_must_be_camel_case.symbols = private_protected_fields
dotnet_naming_rule.private_protected_fields_must_be_camel_case.style = camel_case
# Public members must be capitalized
dotnet_naming_rule.public_members_must_be_capitalized.severity = warning
dotnet_naming_rule.public_members_must_be_capitalized.symbols = public_symbols
dotnet_naming_rule.public_members_must_be_capitalized.style = first_upper
# Parameters must be camelCase
dotnet_naming_rule.parameters_must_be_camel_case.severity = warning
dotnet_naming_rule.parameters_must_be_camel_case.symbols = parameters
dotnet_naming_rule.parameters_must_be_camel_case.style = camel_case
# Class, struct, enum and delegates must be PascalCase
dotnet_naming_rule.non_interface_types_must_be_pascal_case.severity = warning
dotnet_naming_rule.non_interface_types_must_be_pascal_case.symbols = non_interface_types
dotnet_naming_rule.non_interface_types_must_be_pascal_case.style = pascal_case
# Interfaces must be PascalCase and start with an 'I'
dotnet_naming_rule.interface_types_must_be_prefixed_with_i.severity = warning
dotnet_naming_rule.interface_types_must_be_prefixed_with_i.symbols = interface_types
dotnet_naming_rule.interface_types_must_be_prefixed_with_i.style = prefix_interface_interface_with_i
# C# Code Style Settings
# See https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference
# See http://kent-boogaart.com/blog/editorconfig-reference-for-c-developers
[*.{cs,csx,cake}]
# Indentation Preferences
# http://kent-boogaart.com/blog/editorconfig-reference-for-c-developers#csharp_indent_block_contents
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents = true
csharp_indent_labels = one_less_than_current
csharp_indent_switch_labels = true
# New Line Preferences
# See http://kent-boogaart.com/blog/editorconfig-reference-for-c-developers#csharp_new_line_before_catch
csharp_new_line_before_catch = true
csharp_new_line_before_else = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_open_brace = all
csharp_new_line_between_query_expression_clauses = true
csharp_prefer_braces = true:suggestion
csharp_prefer_simple_default_expression = true:warning
# Wrapping Preferences
# See http://kent-boogaart.com/blog/editorconfig-reference-for-c-developers#csharp_preserve_single_line_blocks
csharp_preserve_single_line_blocks = true
csharp_preserve_single_line_statements = false
# Spacing Preferences
# See http://kent-boogaart.com/blog/editorconfig-reference-for-c-developers#csharp_space_after_cast
csharp_space_after_cast = false
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_after_comma = true
csharp_space_after_dot = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_after_semicolon_in_for_statement = true
csharp_space_around_binary_operators = before_and_after
csharp_space_around_declaration_statements = do_not_ignore
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_before_comma = false
csharp_space_before_dot = false
csharp_space_before_open_square_brackets = false
csharp_space_before_semicolon_in_for_statement = false
csharp_space_between_empty_square_brackets = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_parentheses = none
csharp_space_between_square_brackets = false
# CSharp Style Preferences
# See http://kent-boogaart.com/blog/editorconfig-reference-for-c-developers#csharp_style_conditional_delegate_call
csharp_style_conditional_delegate_call = true:warning
csharp_style_expression_bodied_accessors = true:warning
csharp_style_expression_bodied_constructors = false:warning
csharp_style_expression_bodied_indexers = true:warning
csharp_style_expression_bodied_methods = false:warning
csharp_style_expression_bodied_operators =false:warning
csharp_style_expression_bodied_properties = true:warning
csharp_style_inlined_variable_declaration = true:warning
csharp_style_pattern_matching_over_as_with_null_check = true:warning
csharp_style_pattern_matching_over_is_with_cast_check = true:warning
csharp_style_throw_expression = true:warning
csharp_style_var_elsewhere = true:suggestion
csharp_style_var_for_built_in_types = true:none
csharp_style_var_when_type_is_apparent = true:suggestion
# Resharper preferences
# See https://www.jetbrains.com/help/rider/EditorConfig_Properties.html
csharp_keep_blank_lines_in_declarations = 1
csharp_remove_blank_lines_near_braces_in_declarations = true
csharp_keep_blank_lines_in_code = 1
csharp_remove_blank_lines_near_braces_in_code = true
csharp_blank_lines_around_namespace = 1
csharp_blank_lines_inside_namespace = 0
csharp_blank_lines_around_type = 1
csharp_blank_lines_inside_type = 0
csharp_blank_lines_around_field = 0
csharp_blank_lines_around_single_line_field = 0
csharp_blank_lines_around_property = 1
csharp_blank_lines_around_single_line_property = 1
csharp_blank_lines_around_auto_property = 1
csharp_blank_lines_around_single_line_auto_property = 1
csharp_blank_lines_around_invocable = 1
csharp_blank_lines_around_single_line_invocable = 1
csharp_blank_lines_around_local_method = 1
csharp_blank_lines_around_single_line_local_method = 1
csharp_blank_lines_around_region = 1
csharp_blank_lines_inside_region = 1
csharp_blank_lines_between_using_groups = 0
csharp_blank_lines_after_using_list = 1
csharp_blank_lines_after_start_comment = 1
csharp_blank_lines_before_single_line_comment = 1
csharp_blank_lines_after_control_transfer_statements = 1
csharp_type_declaration_braces = next_line
csharp_invocable_declaration_braces = next_line
csharp_anonymous_method_declaration_braces = next_line
csharp_accessor_owner_declaration_braces = next_line
csharp_accessor_declaration_braces = next_line
csharp_case_block_braces = next_line
csharp_initializer_braces = next_line
csharp_other_braces = next_line
csharp_empty_block_style = multiline
csharp_indent_style = space
csharp_indent_size = 4
csharp_tab_width = 4
csharp_keep_user_linebreaks = false
csharp_simple_embedded_statement_style = line_break
csharp_simple_case_statement_style = line_break
csharp_simple_embedded_block_style = line_break
csharp_new_line_before_else = true
csharp_new_line_before_while = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_max_line_length = 160
csharp_wrap_parameters_style = chop_if_long
csharp_wrap_before_declaration_lpar = false
csharp_wrap_after_declaration_lpar = true
csharp_wrap_arguments_style = chop_if_long
csharp_wrap_before_invocation_lpar = false
csharp_wrap_after_invocation_lpar = true
csharp_wrap_before_comma = false
csharp_wrap_before_arrow_with_expressions = false
csharp_wrap_after_dot_in_method_calls = false
csharp_wrap_chained_method_calls = chop_if_long
csharp_wrap_before_extends_colon = false
csharp_wrap_extends_list_style = chop_if_long
csharp_wrap_for_stmt_header_style = chop_if_long
csharp_wrap_before_ternary_opsigns = true
csharp_wrap_ternary_expr_style = chop_if_long
csharp_wrap_multiple_declaration_style = wrap_if_long
csharp_wrap_linq_expressions = chop_if_long
csharp_wrap_before_binary_opsign = false
csharp_wrap_chained_binary_expressions = chop_if_long
csharp_force_chop_compound_if_expression = false
csharp_force_chop_compound_while_expression = false
csharp_force_chop_compound_do_expression = false
csharp_wrap_multiple_type_parameter_constraints_style = chop_always
csharp_wrap_object_and_collection_initializer_style = chop_always
csharp_wrap_array_initializer_style = chop_always
csharp_wrap_before_first_type_parameter_constraint = false
csharp_wrap_before_type_parameter_langle = false
csharp_place_abstract_accessorholder_on_single_line = true
csharp_place_simple_accessorholder_on_single_line = false
csharp_place_accessor_with_attrs_holder_on_single_line = false
csharp_place_simple_accessor_on_single_line = true
csharp_place_simple_method_on_single_line = false
csharp_place_simple_anonymousmethod_on_single_line = false
csharp_place_simple_initializer_on_single_line = true
csharp_place_type_attribute_on_same_line = false
csharp_place_method_attribute_on_same_line = false
csharp_place_accessorholder_attribute_on_same_line = false
csharp_place_simple_accessor_attribute_on_same_line = false
csharp_place_complex_accessor_attribute_on_same_line = false
csharp_place_field_attribute_on_same_line = false
csharp_place_constructor_initializer_on_same_line = false
csharp_place_type_constraints_on_same_line = false
csharp_allow_comment_after_lbrace = false
csharp_continuous_indent_multiplier = false
csharp_indent_switch_labels = true
csharp_indent_nested_usings_stmt = true
csharp_indent_nested_fixed_stmt = true
csharp_indent_nested_lock_stmt = true
csharp_indent_nested_for_stmt = true
csharp_indent_nested_foreach_stmt = true
csharp_indent_nested_while_stmt = true
csharp_indent_type_constraints = true
csharp_stick_comment = false
csharp_indent_method_decl_pars = inside
csharp_indent_invocation_pars = inside
csharp_indent_statement_pars = inside
csharp_indent_typeparam_angles = inside
csharp_indent_typearg_angles = inside
csharp_indent_pars = inside
csharp_align_multiline_parameter = false
csharp_align_first_arg_by_paren = false
csharp_align_multiline_argument = false
csharp_align_multiline_extends_list = false
csharp_align_multiline_expression = false
csharp_align_multiline_binary_expressions_chain = false
csharp_align_multiline_calls_chain = false
csharp_align_multiline_array_and_object_initializer = false
csharp_indent_anonymous_method_block = false
csharp_align_multiline_for_stmt = false
csharp_align_multiple_declaration = false
csharp_align_multline_type_parameter_list = false
csharp_align_multline_type_parameter_constrains = false
csharp_align_linq_query = false
csharp_special_else_if_treatment = true
csharp_insert_final_newline = false
csharp_old_engine = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_before_open_square_brackets = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_before_typeof_parentheses = false
csharp_space_before_default_parentheses = false
csharp_space_before_checked_parentheses = false
csharp_space_before_sizeof_parentheses = false
csharp_space_before_nameof_parentheses = false
csharp_space_before_type_parameter_angle = false
csharp_space_before_type_argument_angle = false
csharp_space_around_binary_operator = true
csharp_space_around_member_access_operator = false
csharp_space_after_logical_not_op = false
csharp_space_after_unary_minus_op = false
csharp_space_after_unary_plus_op = false
csharp_space_after_ampersand_op = false
csharp_space_after_asterik_op = false
csharp_space_within_parentheses = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_square_brackets = false
csharp_space_between_typecast_parentheses = false
space_between_parentheses_of_control_flow_statements = false
csharp_space_within_typeof_parentheses = false
csharp_space_within_default_parentheses = false
csharp_space_within_checked_parentheses = false
csharp_space_within_sizeof_parentheses = false
csharp_space_within_nameof_parentheses = false
csharp_space_within_type_parameter_angles = false
csharp_space_within_type_argument_angles = false
csharp_space_before_ternary_quest = true
csharp_space_after_ternary_quest = true
csharp_space_before_ternary_colon = true
csharp_space_after_ternary_colon = true
csharp_space_after_cast = false
csharp_space_near_postfix_and_prefix_op = false
csharp_space_before_comma = false
csharp_space_after_comma = true
csharp_space_before_semicolon_in_for_statement = false
csharp_space_after_semicolon_in_for_statement = true
csharp_space_before_attribute_colon = false
csharp_space_after_attribute_colon = true
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_around_dot = false
csharp_space_around_lambda_arrow = true
csharp_space_before_singleline_accessorholder = true
csharp_space_in_singleline_accessorholder = true
csharp_space_between_accessors_in_singleline_property = true
csharp_space_between_attribute_sections = false
csharp_space_withing_empty_braces = true
csharp_space_in_singleline_method = true
csharp_space_in_singleline_anonymous_method = true
csharp_space_between_square_brackets = false
csharp_space_before_open_square_brackets = false
csharp_space_between_square_brackets = false
csharp_space_between_empty_square_brackets = false
csharp_space_within_single_line_array_initializer_braces = true
csharp_space_before_pointer_asterik_declaration = false
csharp_space_before_semicolon = false
csharp_space_before_colon_in_case = false
csharp_space_before_nullable_mark = false
csharp_space_before_type_parameter_constraint_colon = true
csharp_space_after_type_parameter_constraint_colon = true
csharp_space_around_alias_eq = true
csharp_space_before_trailing_comment = true
csharp_space_after_operator_keyword = true
xmldoc_wrap_tags_and_pi = false
xmldoc_spaces_around_eq_in_pi_attribute = false
xmldoc_space_after_last_pi_attribute = false
xmldoc_pi_attribute_style = on_single_line
xmldoc_pi_attributes_indent = single_indent
xmldoc_blank_line_after_pi = false
xmldoc_spaces_around_eq_in_attribute = false
xmldoc_space_after_last_attribute = false
xmldoc_space_before_self_closing = false
xmldoc_attribute_style = on_single_line
xmldoc_attribute_indent = single_indent
xmldoc_keep_user_linebreaks = false
xmldoc_linebreaks_inside_tags_for_multiline_elements = true
xmldoc_linebreaks_inside_tags_for_elements_with_child_elements = true
xmldoc_linebreaks_inside_tags_for_elements_longer_than = 0
xmldoc_spaces_inside_tags = 1
xmldoc_wrap_text = false
xmldoc_wrap_around_elements = true
xmldoc_indent_child_elements = zeroindent
xmldoc_indent_text = zeroident
xmldoc_max_blank_lines_between_tags = 0
xmldoc_linebreak_before_multiline_elements = true
xmldoc_linebreak_before_singleline_elements = false
csharp_trailing_comma_in_multiline_lists = true
+454
View File
@@ -0,0 +1,454 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# Tye
.tye/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
##
## Visual studio for Mac
##
# globs
Makefile.in
*.userprefs
*.usertasks
config.make
config.status
aclocal.m4
install-sh
autom4te.cache/
*.tar.gz
tarballs/
test-results/
# Mac bundle stuff
*.dmg
*.app
# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore
# Windows thumbnail cache files
Thumbs.db
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
# Windows shortcuts
*.lnk
# JetBrains Rider
.idea/
*.sln.iml
##
## Visual Studio Code
##
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
+25
View File
@@ -0,0 +1,25 @@
**/.dockerignore
**/.env
**/.git
**/.gitignore
**/.project
**/.settings
**/.toolstarget
**/.vs
**/.vscode
**/.idea
**/*.*proj.user
**/*.dbmdl
**/*.jfm
**/azds.yaml
**/bin
**/charts
**/docker-compose*
**/Dockerfile*
**/node_modules
**/npm-debug.log
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
LICENSE
README.md
@@ -0,0 +1,18 @@
using Autofac;
using Gos.Infrastructure.CompositionRoot;
using Gos.Services.CompositionRoot;
namespace Gos.Console.CompositionRoot
{
public class ConsoleBootstrapper
{
public IContainer Bootstrap()
{
var builder = new ContainerBuilder();
builder.RegisterModule(new InfrastructureModule());
builder.RegisterModule(new ServicesModule());
builder.RegisterModule(new ConsoleModule());
return builder.Build();
}
}
}
@@ -0,0 +1,14 @@
using Autofac;
using Gos.Core.Interfaces;
using Gos.Infrastructure.Sessions;
namespace Gos.Console.CompositionRoot;
public class ConsoleModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<DefaultSessionIdResolver>().As<ISessionIdResolver>().SingleInstance();
builder.RegisterType<DefaultTraceIdentifierResolver>().As<ITraceIdentifierResolver>().SingleInstance();
}
}
+3
View File
@@ -0,0 +1,3 @@
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS base
COPY ["./publish", "."]
CMD tail -f /dev/null
+19
View File
@@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Autofac" Version="6.3.0" />
<PackageReference Include="CommandLineParser" Version="2.8.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Gos.Infrastructure\Gos.Infrastructure.csproj" />
<ProjectReference Include="..\Gos.Services\Gos.Services.csproj" />
</ItemGroup>
</Project>
+109
View File
@@ -0,0 +1,109 @@
using System.Threading.Tasks;
using Autofac;
using CommandLine;
using Gos.Console.CompositionRoot;
using Gos.ServiceModel.Requests.Corpus;
using Gos.Services.Framework;
using MediatR;
namespace Gos.Console
{
internal class Program
{
private static IContainer container;
private static async Task<int> HandleDeleteCorpusIndex(IMediator mediator, DeleteCorpusIndexOptions opt)
{
await mediator.Send(new DeleteCorpusIndex());
return 3;
}
private static async Task<int> HandleImportCorpus(IMediator mediator, ImportCorpusOptions opt)
{
await mediator.Send(
new ImportCorpus
{
SourcePath = opt.SourcePath
});
return 1;
}
private static async Task<int> HandleIndexCorpus(IMediator mediator, IndexCorpusOptions opt)
{
// Warm up cache with part of speeches and msds
container.Resolve<CacheWarmUp>().WarmUp();
await mediator.Send(new IndexCorpus());
return 2;
}
private static async Task<int> HandleImportCounters(IMediator mediator, ImportCountersOptions opt)
{
await mediator.Send(
new ImportCounters
{
SourcePath = opt.SourcePath,
});
return 3;
}
private static async Task<int> HandleImportLexicon(IMediator mediator, ImportLexiconOptions opt)
{
await mediator.Send(
new ImportLexicon()
{
SourcePath = opt.SourcePath,
});
return 4;
}
public static async Task Main(string[] args)
{
container = new ConsoleBootstrapper().Bootstrap();
var mediator = container.Resolve<IMediator>();
await Parser.Default
.ParseArguments<ImportCorpusOptions, IndexCorpusOptions, DeleteCorpusIndexOptions, ImportCountersOptions, ImportLexiconOptions>(args)
.MapResult(
(ImportCorpusOptions opt) => HandleImportCorpus(mediator, opt),
(DeleteCorpusIndexOptions opt) => HandleDeleteCorpusIndex(mediator, opt),
(IndexCorpusOptions opt) => HandleIndexCorpus(mediator, opt),
(ImportCountersOptions opt) => HandleImportCounters(mediator, opt),
(ImportLexiconOptions opt) => HandleImportLexicon(mediator, opt),
errs => Task.FromResult(0));
System.Console.WriteLine("Finished. Press any key to continue...");
System.Console.ReadKey();
}
[Verb("deleteindex", HelpText = "Delete corpus index")]
private class DeleteCorpusIndexOptions
{
}
[Verb("import", HelpText = "Imports corpus to database")]
private class ImportCorpusOptions
{
[Option("path", HelpText = "Full path to xml file")]
public string SourcePath { get; set; }
}
[Verb("index", HelpText = "Indexes corpus to ElasticSearch")]
private class IndexCorpusOptions
{
}
[Verb("counters", HelpText = "Imports counters and forms/lemmas to database")]
private class ImportCountersOptions
{
[Option("path", HelpText = "Full path to xml file")]
public string SourcePath { get; set; }
}
[Verb("lexicon", HelpText = "Imports lexicon forms/lemmas to database")]
private class ImportLexiconOptions
{
[Option("path", HelpText = "Full path to xml file")]
public string SourcePath { get; set; }
}
}
}
+40
View File
@@ -0,0 +1,40 @@
using System;
namespace Gos.Core
{
public static class Cache
{
public static class Duration
{
public static TimeSpan Long = TimeSpan.FromDays(7);
}
public static class CacheKeys
{
public static class Msd
{
private const string Prefix = nameof(Msd);
public static string All()
{
return $"{Prefix}_{nameof(All)}";
}
public static string ByCode(string code)
{
return $"{Prefix}_{nameof(ByCode)}_{code}";
}
}
public static class PartOfSpeech
{
private const string Prefix = nameof(PartOfSpeech);
public static string ByCode(string code)
{
return $"{Prefix}_{nameof(ByCode)}_{code}";
}
}
}
}
}
+24
View File
@@ -0,0 +1,24 @@
namespace Gos.Core
{
public static class ConfigurationKey
{
private const string Prefix = "GOS";
public static string SoundFilesFolder => $"{Prefix}:{nameof(SoundFilesFolder)}";
public static class Database
{
public static string ConnectionString => $"{Prefix}:{nameof(Database)}:{nameof(ConnectionString)}";
}
public static class Elastic
{
public static string ConnectionString => $"{Prefix}:{nameof(Elastic)}:{nameof(ConnectionString)}";
}
public static class Logging
{
public static string LogPath => $"{Prefix}:{nameof(Logging)}:{nameof(LogPath)}";
}
}
}
+39
View File
@@ -0,0 +1,39 @@
using System.Xml.Linq;
namespace Gos.Core
{
public static class Constants
{
public const string TeiNamespace = "http://www.tei-c.org/ns/1.0";
public const string XmlNamespace = "http://www.w3.org/XML/1998/namespace";
public const string IncludeNamespace = "http://www.w3.org/2001/XInclude";
public static readonly XNamespace TeiNs;
public static readonly XNamespace XmlNs;
public static readonly XNamespace IncludeNs;
static Constants()
{
TeiNs = XNamespace.Get(TeiNamespace);
XmlNs = XNamespace.Get(XmlNamespace);
IncludeNs = XNamespace.Get(IncludeNamespace);
}
public static class InterfaceLanguages
{
public static string English = "en";
public static string EnglishName = "English";
public static string Slovene = "sl";
public static string SloveneName = "Slovenščina";
}
public static class Formats
{
public static string CountsFormat = "#,##0";
}
public static class Search
{
public static int DefaultPageSize = 20;
}
}
}
+21
View File
@@ -0,0 +1,21 @@
using System;
namespace Gos.Core.Entities
{
public class AuditLog : BaseEntity
{
public long DurationMs { get; set; }
public DateTime EndDate { get; set; }
public string Message { get; set; }
public string ObjectType { get; set; }
public string SessionId { get; set; }
public DateTime StartDate { get; set; }
public string TraceIdentifier { get; set; }
}
}
+7
View File
@@ -0,0 +1,7 @@
namespace Gos.Core.Entities
{
public abstract class BaseEntity : IEntity
{
public int Id { get; set; }
}
}
+11
View File
@@ -0,0 +1,11 @@
namespace Gos.Core.Entities
{
public class CorpusCounter : BaseEntity
{
public int Discourses { get; set; }
public int Statements { get; set; }
public int Words { get; set; }
}
}
+9
View File
@@ -0,0 +1,9 @@
namespace Gos.Core.Entities
{
public class CorpusForm : BaseEntity
{
public string StandardForm { get; set; }
public string Lemma { get; set; }
}
}
+29
View File
@@ -0,0 +1,29 @@
using System;
namespace Gos.Core.Entities
{
public class Discourse : BaseEntity
{
public DiscourseChannel Channel { get; set; }
public string Code { get; set; }
public DateTime Date { get; set; }
public string Description { get; set; }
public DiscourseEvent Event { get; set; }
public int Length { get; set; }
public string Location { get; set; }
public int NumberOfSpeakers { get; set; }
public DiscourseRegion Region { get; set; }
public string Source { get; set; }
public DiscourseType Type { get; set; }
}
}
+23
View File
@@ -0,0 +1,23 @@
using System.Globalization;
namespace Gos.Core.Entities
{
public class DiscourseChannel : BaseEntity, ILocalizableEntity<DiscourseChannelTranslation>
{
public string Title
{
get => Translations[CultureInfo.CurrentCulture].Title;
set => Translations[CultureInfo.CurrentCulture].Title = value;
}
public TranslationCollection<DiscourseChannelTranslation> Translations { get; set; } = new();
}
public enum DiscourseChannelKeys
{
Radio = 1,
Televizija = 2,
OsebniStik = 3,
Telefon = 4,
}
}
@@ -0,0 +1,7 @@
namespace Gos.Core.Entities
{
public class DiscourseChannelTranslation : Translation<DiscourseChannelTranslation>
{
public string Title { get; set; }
}
}
+42
View File
@@ -0,0 +1,42 @@
using System.Globalization;
namespace Gos.Core.Entities
{
public class DiscourseEvent : BaseEntity, ILocalizableEntity<DiscourseEventTranslation>
{
public string Title
{
get => Translations[CultureInfo.CurrentCulture].Title;
set => Translations[CultureInfo.CurrentCulture].Title = value;
}
public TranslationCollection<DiscourseEventTranslation> Translations { get; set; } = new();
}
public enum DiscourseEventKeys
{
NovinarskiPrispevek = 1,
ModeriraniPogovorTv = 2,
ModeriranaOddaja = 3,
ResnicnostniSov = 4,
SportniPrenos = 5,
ModeriraniProgram = 6,
ModeriraniPogovorRadio = 7,
OsnovnosolskaUcnaUra = 8,
SrednjesolskaUcnaUra = 9,
Tecaj = 10,
FakultetnoPredavanje = 11,
JavnoPredavanje = 12,
FormalniDelovniSestanek = 13,
NeformalniDelovniSestanek = 14,
Konzultacija = 15,
Storitev = 16,
FormalniRazgovor = 17,
ProdajaTrgovina = 18,
Svetovanje = 19,
Informacije = 20,
Tajnistvo = 21,
PogovorVDruzini = 22,
PogovorMedPrijateljiZnanci = 23,
}
}
@@ -0,0 +1,7 @@
namespace Gos.Core.Entities
{
public class DiscourseEventTranslation : Translation<DiscourseEventTranslation>
{
public string Title { get; set; }
}
}
+43
View File
@@ -0,0 +1,43 @@
using System.Globalization;
namespace Gos.Core.Entities
{
public class DiscourseRegion : BaseEntity, ILocalizableEntity<DiscourseRegionTranslation>
{
public string ShortTitle
{
get => Translations[CultureInfo.CurrentCulture].ShortTitle;
set => Translations[CultureInfo.CurrentCulture].ShortTitle = value;
}
public string Title
{
get => Translations[CultureInfo.CurrentCulture].Title;
set => Translations[CultureInfo.CurrentCulture].Title = value;
}
public TranslationCollection<DiscourseRegionTranslation> Translations { get; set; } = new();
}
public enum DiscourseRegionKeys
{
Celjska = 1,
Novogoriska = 2,
Krska = 3,
Koprska = 4,
Kranjska = 5,
Ljubljanska = 6,
Mariborska = 7,
Murskosoboska = 8,
Novomeska = 9,
Postojnska = 10,
Slovenjgraska = 11,
CelotnaSlovenija = 12,
SeverovzhodnaSlovenija = 13,
JugozahodnaSlovenija = 14,
Avstrija = 15,
Italija = 16,
Madzarska = 17,
Neznano = 18,
}
}
@@ -0,0 +1,9 @@
namespace Gos.Core.Entities
{
public class DiscourseRegionTranslation : Translation<DiscourseRegionTranslation>
{
public string ShortTitle { get; set; }
public string Title { get; set; }
}
}
+29
View File
@@ -0,0 +1,29 @@
using System.Globalization;
namespace Gos.Core.Entities
{
public class DiscourseType : BaseEntity, ILocalizableEntity<DiscourseTypeTranslation>
{
public string ShortTitle
{
get => Translations[CultureInfo.CurrentCulture].ShortTitle;
set => Translations[CultureInfo.CurrentCulture].ShortTitle = value;
}
public string Title
{
get => Translations[CultureInfo.CurrentCulture].Title;
set => Translations[CultureInfo.CurrentCulture].Title = value;
}
public TranslationCollection<DiscourseTypeTranslation> Translations { get; set; } = new();
}
public enum DiscourseTypeKeys
{
JavniInformativnoIzobrazevalni = 1,
JavniRazvedrilni = 2,
NejavniNezasebni = 3,
NejavniZasebni = 4,
}
}
@@ -0,0 +1,9 @@
namespace Gos.Core.Entities
{
public class DiscourseTypeTranslation : Translation<DiscourseTypeTranslation>
{
public string ShortTitle { get; set; }
public string Title { get; set; }
}
}
+7
View File
@@ -0,0 +1,7 @@
namespace Gos.Core.Entities
{
public interface IEntity
{
int Id { get; set; }
}
}
@@ -0,0 +1,8 @@
namespace Gos.Core.Entities
{
public interface ILocalizableEntity<TTranslation>
where TTranslation : Translation<TTranslation>, new()
{
TranslationCollection<TTranslation> Translations { get; set; }
}
}
+17
View File
@@ -0,0 +1,17 @@
using System.Globalization;
namespace Gos.Core.Entities
{
public class Msd : BaseEntity, ILocalizableEntity<MsdTranslation>
{
public string Code { get; set; }
public string Title
{
get => Translations[CultureInfo.CurrentCulture].Title;
set => Translations[CultureInfo.CurrentCulture].Title = value;
}
public TranslationCollection<MsdTranslation> Translations { get; set; } = new();
}
}
+7
View File
@@ -0,0 +1,7 @@
namespace Gos.Core.Entities
{
public class MsdTranslation : Translation<MsdTranslation>
{
public string Title { get; set; }
}
}
+22
View File
@@ -0,0 +1,22 @@
using System.Collections.Generic;
using System.Globalization;
namespace Gos.Core.Entities
{
public class PartOfSpeech : BaseEntity, ILocalizableEntity<PartOfSpeechTranslation>
{
public List<PartOfSpeechAttribute> Attributes { get; set; } = new();
public string Code { get; set; }
public short RecordOrder { get; set; }
public string Title
{
get => Translations[CultureInfo.CurrentCulture].Title;
set => Translations[CultureInfo.CurrentCulture].Title = value;
}
public TranslationCollection<PartOfSpeechTranslation> Translations { get; set; } = new();
}
}
@@ -0,0 +1,20 @@
using System.Collections.Generic;
using System.Globalization;
namespace Gos.Core.Entities
{
public class PartOfSpeechAttribute : BaseEntity, ILocalizableEntity<PartOfSpeechAttributeTranslation>
{
public short RecordOrder { get; set; }
public string Title
{
get => Translations[CultureInfo.CurrentCulture].Title;
set => Translations[CultureInfo.CurrentCulture].Title = value;
}
public TranslationCollection<PartOfSpeechAttributeTranslation> Translations { get; set; } = new();
public List<PartOfSpeechAttributeValue> Values { get; set; } = new();
}
}
@@ -0,0 +1,7 @@
namespace Gos.Core.Entities
{
public class PartOfSpeechAttributeTranslation : Translation<PartOfSpeechAttributeTranslation>
{
public string Title { get; set; }
}
}
@@ -0,0 +1,19 @@
using System.Globalization;
namespace Gos.Core.Entities
{
public class PartOfSpeechAttributeValue : BaseEntity, ILocalizableEntity<PartOfSpeechAttributeValueTranslation>
{
public string Code { get; set; }
public short RecordOrder { get; set; }
public string Title
{
get => Translations[CultureInfo.CurrentCulture].Title;
set => Translations[CultureInfo.CurrentCulture].Title = value;
}
public TranslationCollection<PartOfSpeechAttributeValueTranslation> Translations { get; set; } = new();
}
}
@@ -0,0 +1,7 @@
namespace Gos.Core.Entities
{
public class PartOfSpeechAttributeValueTranslation : Translation<PartOfSpeechAttributeValueTranslation>
{
public string Title { get; set; }
}
}
@@ -0,0 +1,7 @@
namespace Gos.Core.Entities
{
public class PartOfSpeechTranslation : Translation<PartOfSpeechTranslation>
{
public string Title { get; set; }
}
}
+11
View File
@@ -0,0 +1,11 @@
namespace Gos.Core.Entities
{
public class Segment : BaseEntity
{
public int Order { get; set; }
public string SoundFile { get; set; }
public Statement Statement { get; set; }
}
}
+21
View File
@@ -0,0 +1,21 @@
namespace Gos.Core.Entities
{
public class Speaker : BaseEntity
{
public SpeakerAge Age { get; set; }
public string Code { get; set; }
public SpeakerEducation Education { get; set; }
public SpeakerLanguage Language { get; set; }
public SpeakerRegion Region1 { get; set; }
public SpeakerRegion Region2 { get; set; }
public SpeakerRegion Region3 { get; set; }
public SpeakerSex Sex { get; set; }
}
}
+27
View File
@@ -0,0 +1,27 @@
using System.Globalization;
namespace Gos.Core.Entities
{
public class SpeakerAge : BaseEntity, ILocalizableEntity<SpeakerAgeTranslation>
{
public string Title
{
get => Translations[CultureInfo.CurrentCulture].Title;
set => Translations[CultureInfo.CurrentCulture].Title = value;
}
public TranslationCollection<SpeakerAgeTranslation> Translations { get; set; } = new();
}
public enum SpeakerAgeKeys
{
Do10Let = 1,
Od10Do14Let = 2,
Od15Do18Let = 3,
Od19Do24Let = 4,
Od25Do34Let = 5,
Od35Do59Let = 6,
Nad60Let = 7,
Neznano = 8,
}
}
@@ -0,0 +1,7 @@
namespace Gos.Core.Entities
{
public class SpeakerAgeTranslation : Translation<SpeakerAgeTranslation>
{
public string Title { get; set; }
}
}
+24
View File
@@ -0,0 +1,24 @@
using System.Globalization;
namespace Gos.Core.Entities
{
public class SpeakerEducation : BaseEntity, ILocalizableEntity<SpeakerEducationTranslation>
{
public string Title
{
get => Translations[CultureInfo.CurrentCulture].Title;
set => Translations[CultureInfo.CurrentCulture].Title = value;
}
public TranslationCollection<SpeakerEducationTranslation> Translations { get; set; } = new();
}
public enum SpeakerEducationKeys
{
OsAliManj = 1,
SrednjaSola = 2,
VisjaAliVisokaSola = 3,
FakultetaAliVec = 4,
Neznano = 5,
}
}
@@ -0,0 +1,7 @@
namespace Gos.Core.Entities
{
public class SpeakerEducationTranslation : Translation<SpeakerEducationTranslation>
{
public string Title { get; set; }
}
}
+31
View File
@@ -0,0 +1,31 @@
using System.Globalization;
namespace Gos.Core.Entities
{
public class SpeakerLanguage : BaseEntity, ILocalizableEntity<SpeakerLanguageTranslation>
{
public string Title
{
get => Translations[CultureInfo.CurrentCulture].Title;
set => Translations[CultureInfo.CurrentCulture].Title = value;
}
public TranslationCollection<SpeakerLanguageTranslation> Translations { get; set; } = new();
}
public enum SpeakerLanguageKeys
{
Slovenscina = 1,
Anglescina = 2,
Nemscina = 3,
Italijanscina = 4,
Madzarscina = 5,
Juznoslovanski = 6,
Albanscina = 7,
DrugiSlovanski = 8,
DrugiGermanski = 9,
DrugiRomanski = 10,
Neindoevropski = 11,
Neznano = 12,
}
}
@@ -0,0 +1,7 @@
namespace Gos.Core.Entities
{
public class SpeakerLanguageTranslation : Translation<SpeakerLanguageTranslation>
{
public string Title { get; set; }
}
}
+41
View File
@@ -0,0 +1,41 @@
using System.Globalization;
namespace Gos.Core.Entities
{
public class SpeakerRegion : BaseEntity, ILocalizableEntity<SpeakerRegionTranslation>
{
public string ShortTitle
{
get => Translations[CultureInfo.CurrentCulture].ShortTitle;
set => Translations[CultureInfo.CurrentCulture].ShortTitle = value;
}
public string Title
{
get => Translations[CultureInfo.CurrentCulture].Title;
set => Translations[CultureInfo.CurrentCulture].Title = value;
}
public TranslationCollection<SpeakerRegionTranslation> Translations { get; set; } = new();
}
public enum SpeakerRegionKeys
{
Celjska = 1,
Novogoriska = 2,
Krska = 3,
Koprska = 4,
Kranjska = 5,
Ljubljanska = 6,
Mariborska = 7,
Murskosoboska = 8,
Novomeska = 9,
Postojnska = 10,
Slovenjgraska = 11,
Avstrija = 12,
Italija = 13,
Madzarska = 14,
Tujina = 15,
Neznano = 16,
}
}
@@ -0,0 +1,9 @@
namespace Gos.Core.Entities
{
public class SpeakerRegionTranslation : Translation<SpeakerRegionTranslation>
{
public string ShortTitle { get; set; }
public string Title { get; set; }
}
}
+22
View File
@@ -0,0 +1,22 @@
using System.Globalization;
namespace Gos.Core.Entities
{
public class SpeakerSex : BaseEntity, ILocalizableEntity<SpeakerSexTranslation>
{
public string Title
{
get => Translations[CultureInfo.CurrentCulture].Title;
set => Translations[CultureInfo.CurrentCulture].Title = value;
}
public TranslationCollection<SpeakerSexTranslation> Translations { get; set; } = new();
}
public enum SpeakerSexKeys
{
Moski = 1,
Zenski = 2,
Neznano = 3,
}
}
@@ -0,0 +1,7 @@
namespace Gos.Core.Entities
{
public class SpeakerSexTranslation : Translation<SpeakerSexTranslation>
{
public string Title { get; set; }
}
}
+13
View File
@@ -0,0 +1,13 @@
namespace Gos.Core.Entities
{
public class Statement : BaseEntity
{
public string Code { get; set; }
public Discourse Discourse { get; set; }
public int Order { get; set; }
public Speaker Speaker { get; set; }
}
}
+32
View File
@@ -0,0 +1,32 @@
using Gos.Core.Model;
namespace Gos.Core.Entities
{
public class Token : BaseEntity
{
public string ConversationalForm { get; set; }
public int DiscourseOrder { get; set; }
public string Lemma { get; set; }
public string Msd { get; set; }
public int Order { get; set; }
public Segment Segment { get; set; }
public string StandardForm { get; set; }
public TokenType Type { get; set; }
public Token()
{
}
public Token(TokenType type)
{
Type = type;
}
}
}
+10
View File
@@ -0,0 +1,10 @@
namespace Gos.Core.Entities
{
public abstract class Translation<T>
where T : Translation<T>, new()
{
public string CultureName { get; set; }
public int Id { get; set; }
}
}
@@ -0,0 +1,41 @@
using System.Collections.ObjectModel;
using System.Globalization;
using System.Linq;
namespace Gos.Core.Entities
{
public class TranslationCollection<T> : Collection<T>
where T : Translation<T>, new()
{
public T this[CultureInfo culture]
{
get
{
var translation = this.FirstOrDefault(t => t.CultureName == culture.Name);
if (translation == null)
{
translation = new T();
translation.CultureName = culture.Name;
Add(translation);
}
return translation;
}
set
{
var translation = this.FirstOrDefault(t => t.CultureName == culture.Name);
if (translation != null)
{
Remove(translation);
}
Add(value);
}
}
public bool HasCulture(CultureInfo culture)
{
return this.Any(t => t.CultureName == culture.Name);
}
}
}
@@ -0,0 +1,58 @@
using System;
namespace Gos.Core.Extensions
{
public static class ArrayExtensions
{
public static void ForEach(this Array array, Action<Array, int[]> action)
{
if (array.LongLength == 0)
{
return;
}
var walker = new ArrayTraverse(array);
do
{
action(array, walker.Position);
}
while (walker.Step());
}
}
internal class ArrayTraverse
{
public int[] Position;
private readonly int[] maxLengths;
public ArrayTraverse(Array array)
{
maxLengths = new int[array.Rank];
for (var i = 0; i < array.Rank; ++i)
{
maxLengths[i] = array.GetLength(i) - 1;
}
Position = new int[array.Rank];
}
public bool Step()
{
for (var i = 0; i < Position.Length; ++i)
{
if (Position[i] < maxLengths[i])
{
Position[i]++;
for (var j = 0; j < i; j++)
{
Position[j] = 0;
}
return true;
}
}
return false;
}
}
}
@@ -0,0 +1,122 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Gos.Core.Entities;
using Gos.Core.Model;
using Gos.ServiceModel.Requests.Concordance;
namespace Gos.Core.Extensions
{
public static class ConcordanceExtensions
{
public static void SetToken(this Concordance concordance, Token token, int position)
{
switch (position)
{
case -10:
concordance.TokenLeft10 = token;
break;
case -9:
concordance.TokenLeft9 = token;
break;
case -8:
concordance.TokenLeft8 = token;
break;
case -7:
concordance.TokenLeft7 = token;
break;
case -6:
concordance.TokenLeft6 = token;
break;
case -5:
concordance.TokenLeft5 = token;
break;
case -4:
concordance.TokenLeft4 = token;
break;
case -3:
concordance.TokenLeft3 = token;
break;
case -2:
concordance.TokenLeft2 = token;
break;
case -1:
concordance.TokenLeft1 = token;
break;
case 0:
concordance.Token = token;
break;
case 1:
concordance.TokenRight1 = token;
break;
case 2:
concordance.TokenRight2 = token;
break;
case 3:
concordance.TokenRight3 = token;
break;
case 4:
concordance.TokenRight4 = token;
break;
case 5:
concordance.TokenRight5 = token;
break;
case 6:
concordance.TokenRight6 = token;
break;
case 7:
concordance.TokenRight7 = token;
break;
case 8:
concordance.TokenRight8 = token;
break;
case 9:
concordance.TokenRight9 = token;
break;
case 10:
concordance.TokenRight10 = token;
break;
default:
throw new Exception($"Invalid position {position}. Position should be between -10 and 10");
}
}
private static string ToForm(IEnumerable<ConcordanceToken> tokens, Func<ConcordanceToken, string> formFunc)
{
if (tokens == null)
{
return null;
}
var sb = new StringBuilder();
foreach (var token in tokens)
{
var form = formFunc(token);
if (string.IsNullOrEmpty(form))
{
continue;
}
if (sb.Length > 0)
{
sb.Append(' ');
}
sb.Append(form);
}
return sb.ToString();
}
public static string ToConversationalFormText(this IEnumerable<ConcordanceToken> tokens)
{
return ToForm(tokens, token => token.ConversationalForm);
}
public static string ToStandardFormText(this IEnumerable<ConcordanceToken> tokens)
{
return ToForm(tokens, token => token.StandardForm);
}
}
}
@@ -0,0 +1,30 @@
using System.Collections.Generic;
using System.Linq;
namespace Gos.Core.Extensions
{
public static class EnumerableExtensions
{
public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences)
{
IEnumerable<IEnumerable<T>> emptyProduct = new[]
{
Enumerable.Empty<T>()
};
return sequences.Aggregate(
emptyProduct,
(accumulator, sequence) => from accseq in accumulator
from item in sequence
select accseq.Concat(
new[]
{
item
}));
}
public static bool IsNullOrEmpty<TSource>(this IEnumerable<TSource> collection)
{
return collection == null || !collection.Any();
}
}
}
+138
View File
@@ -0,0 +1,138 @@
using System;
using System.Collections.Generic;
using System.Reflection;
namespace Gos.Core.Extensions
{
/// <summary>
/// https://stackoverflow.com/questions/129389/how-do-you-do-a-deep-copy-of-an-object-in-net-c-specifically
/// https://github.com/Burtsev-Alexey/net-object-deep-copy/blob/master/ObjectExtensions.cs
/// </summary>
public static class ObjectExtensions
{
private static readonly MethodInfo CloneMethod = typeof(object).GetMethod("MemberwiseClone", BindingFlags.NonPublic | BindingFlags.Instance);
public static object Copy(this object originalObject)
{
return InternalCopy(originalObject, new Dictionary<object, object>(new ReferenceEqualityComparer()));
}
public static T Copy<T>(this T original)
{
return (T)Copy((object)original);
}
public static bool IsPrimitive(this Type type)
{
if (type == typeof(string))
{
return true;
}
return type.IsValueType & type.IsPrimitive;
}
private static void CopyFields(
object originalObject,
IDictionary<object, object> visited,
object cloneObject,
Type typeToReflect,
BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy,
Func<FieldInfo, bool> filter = null)
{
foreach (var fieldInfo in typeToReflect.GetFields(bindingFlags))
{
if (filter != null && filter(fieldInfo) == false)
{
continue;
}
if (IsPrimitive(fieldInfo.FieldType))
{
continue;
}
var originalFieldValue = fieldInfo.GetValue(originalObject);
var clonedFieldValue = InternalCopy(originalFieldValue, visited);
fieldInfo.SetValue(cloneObject, clonedFieldValue);
}
}
private static object InternalCopy(object originalObject, IDictionary<object, object> visited)
{
if (originalObject == null)
{
return null;
}
var typeToReflect = originalObject.GetType();
if (IsPrimitive(typeToReflect))
{
return originalObject;
}
if (visited.ContainsKey(originalObject))
{
return visited[originalObject];
}
if (typeof(Delegate).IsAssignableFrom(typeToReflect))
{
return null;
}
var cloneObject = CloneMethod.Invoke(originalObject, null);
if (typeToReflect.IsArray)
{
var arrayType = typeToReflect.GetElementType();
if (IsPrimitive(arrayType) == false)
{
var clonedArray = (Array)cloneObject;
clonedArray.ForEach((array, indices) => array.SetValue(InternalCopy(clonedArray.GetValue(indices), visited), indices));
}
}
visited.Add(originalObject, cloneObject);
CopyFields(originalObject, visited, cloneObject, typeToReflect);
RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect);
return cloneObject;
}
private static void RecursiveCopyBaseTypePrivateFields(
object originalObject,
IDictionary<object, object> visited,
object cloneObject,
Type typeToReflect)
{
if (typeToReflect.BaseType != null)
{
RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect.BaseType);
CopyFields(
originalObject,
visited,
cloneObject,
typeToReflect.BaseType,
BindingFlags.Instance | BindingFlags.NonPublic,
info => info.IsPrivate);
}
}
}
public class ReferenceEqualityComparer : EqualityComparer<object>
{
public override bool Equals(object x, object y)
{
return ReferenceEquals(x, y);
}
public override int GetHashCode(object obj)
{
if (obj == null)
{
return 0;
}
return obj.GetHashCode();
}
}
}
@@ -0,0 +1,32 @@
using Gos.Core.Search.Queries;
using Gos.ServiceModel.Interfaces;
namespace Gos.Core.Extensions
{
public static class QueryExtensions
{
public static TQuery WithFilters<TQuery>(this TQuery query, ServiceModel.Requests.Search request)
where TQuery : Query
{
query.DiscourseTypeIds = request.DiscourseTypeIds;
query.DiscourseChannelIds = request.DiscourseChannelIds;
query.DiscourseEventIds = request.DiscourseEventIds;
query.DiscourseRegionIds = request.DiscourseRegionIds;
query.DiscourseYears = request.DiscourseYears;
query.SpeakerAgeIds = request.SpeakerAgeIds;
query.SpeakerEducationIds = request.SpeakerEducationIds;
query.SpeakerLanguageIds = request.SpeakerLanguageIds;
query.SpeakerRegionIds = request.SpeakerRegionIds;
query.SpeakerSexIds = request.SpeakerSexIds;
return query;
}
public static TQuery WithPageInfo<TQuery>(this TQuery query, IPagedSearch request)
where TQuery : Query
{
query.From = request.From;
query.Size = request.Size;
return query;
}
}
}
@@ -0,0 +1,30 @@
using System.Linq;
using System.Linq.Expressions;
namespace Gos.Core.Extensions
{
public static class QueryableExtensions
{
public static IQueryable<TEntity> OrderBy<TEntity>(this IQueryable<TEntity> source, string orderByProperty, bool desc)
{
// https://stackoverflow.com/a/7265354
var command = desc ? "OrderByDescending" : "OrderBy";
var type = typeof(TEntity);
var property = type.GetProperty(orderByProperty);
var parameter = Expression.Parameter(type, "p");
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
var orderByExpression = Expression.Lambda(propertyAccess, parameter);
var resultExpression = Expression.Call(
typeof(Queryable),
command,
new[]
{
type,
property.PropertyType
},
source.Expression,
Expression.Quote(orderByExpression));
return source.Provider.CreateQuery<TEntity>(resultExpression);
}
}
}
@@ -0,0 +1,43 @@
using Gos.Core.Entities;
using Gos.Core.Model;
namespace Gos.Core.Extensions
{
public static class TokenExtensions
{
public static Token WithConversationForm(this Token token, string conversationalForm)
{
token.ConversationalForm = conversationalForm?.Trim();
return token;
}
public static Token WithLemma(this Token token, string lemma)
{
token.Lemma = lemma?.Trim();
return token;
}
public static Token WithMsd(this Token token, string msd)
{
if (!string.IsNullOrEmpty(msd) && msd.ToLower().StartsWith("mte:"))
{
msd = msd[4..];
}
token.Msd = msd;
return token;
}
public static Token WithStandardForm(this Token token, string standardForm)
{
token.StandardForm = standardForm?.Trim();
return token;
}
public static Token WithType(this Token token, TokenType type)
{
token.Type = type;
return token;
}
}
}
+11
View File
@@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Gos.ServiceModel\Gos.ServiceModel.csproj" />
</ItemGroup>
</Project>
@@ -0,0 +1,7 @@
namespace Gos.Core.Interfaces
{
public interface ISessionIdResolver
{
string Resolve();
}
}
@@ -0,0 +1,7 @@
namespace Gos.Core.Interfaces
{
public interface ITraceIdentifierResolver
{
string Resolve();
}
}
+51
View File
@@ -0,0 +1,51 @@
using Gos.Core.Entities;
namespace Gos.Core.Model
{
public class Concordance
{
public Statement Statement { get; set; }
public Token Token { get; set; }
public Token TokenLeft1 { get; set; }
public Token TokenLeft10 { get; set; }
public Token TokenLeft2 { get; set; }
public Token TokenLeft3 { get; set; }
public Token TokenLeft4 { get; set; }
public Token TokenLeft5 { get; set; }
public Token TokenLeft6 { get; set; }
public Token TokenLeft7 { get; set; }
public Token TokenLeft8 { get; set; }
public Token TokenLeft9 { get; set; }
public Token TokenRight1 { get; set; }
public Token TokenRight10 { get; set; }
public Token TokenRight2 { get; set; }
public Token TokenRight3 { get; set; }
public Token TokenRight4 { get; set; }
public Token TokenRight5 { get; set; }
public Token TokenRight6 { get; set; }
public Token TokenRight7 { get; set; }
public Token TokenRight8 { get; set; }
public Token TokenRight9 { get; set; }
}
}
+8
View File
@@ -0,0 +1,8 @@
namespace Gos.Core.Model
{
public enum TokenType
{
Word,
Character,
}
}
@@ -0,0 +1,11 @@
using System.Collections.Generic;
using Gos.Core.Search.Queries;
namespace Gos.Core.Search.Aggregations
{
public interface IAggregator
{
IDictionary<string, int> Get<TQuery>(TQuery query)
where TQuery : Query;
}
}
@@ -0,0 +1,9 @@
using Gos.ServiceModel.Enums;
namespace Gos.Core.Search.Aggregations
{
public interface IAggregatorFactory
{
IAggregator GetAggregator(AggregationType aggregationType);
}
}
+22
View File
@@ -0,0 +1,22 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Gos.Core.Search.Queries;
namespace Gos.Core.Search
{
public interface ISearchEngine
{
Task Commit();
Task CreateSchema();
Task DeleteSchema();
Task Index<TEntity>(IEnumerable<TEntity> entities)
where TEntity : class;
TResult Search<TQuery, TResult>(TQuery query)
where TQuery : Query
where TResult : QueryResult;
}
}
@@ -0,0 +1,13 @@
using System.Collections.Generic;
namespace Gos.Core.Search.Queries.Concordance
{
public class ConcordanceQuery : Query
{
public ConcordanceQueryMainWord MainWord { get; set; }
public bool ReturnRandomRows { get; set; }
public List<ConcordanceQueryWordInContext> WordsInContext { get; set; }
}
}
@@ -0,0 +1,6 @@
namespace Gos.Core.Search.Queries.Concordance
{
public class ConcordanceQueryMainWord : ConcordanceQueryWord
{
}
}
@@ -0,0 +1,9 @@
using System.Collections.Generic;
namespace Gos.Core.Search.Queries.Concordance
{
public class ConcordanceQueryResult : QueryResult
{
public List<ConcordanceQueryResultItem> Items { get; set; }
}
}
@@ -0,0 +1,11 @@
namespace Gos.Core.Search.Queries.Concordance
{
public class ConcordanceQueryResultItem
{
public int DiscourseId { get; set; }
public int StatementOrder { get; set; }
public int TokenOrder { get; set; }
}
}
@@ -0,0 +1,20 @@
using System.Collections.Generic;
using Gos.ServiceModel.Enums;
namespace Gos.Core.Search.Queries.Concordance
{
public class ConcordanceQueryWord
{
public string ConversationalForm { get; set; }
public List<string> Lemmas { get; set; }
public List<string> Msds { get; set; }
public ConditionType PartOfSpeechCondition { get; set; }
public int? PartOfSpeechId { get; set; }
public string StandardForm { get; set; }
}
}
@@ -0,0 +1,15 @@
using Gos.ServiceModel.Enums;
namespace Gos.Core.Search.Queries.Concordance
{
public class ConcordanceQueryWordInContext : ConcordanceQueryWord
{
public ConditionType Condition { get; set; }
public DistanceType DistanceType { get; set; }
public int LeftPosition { get; set; }
public int RightPosition { get; set; }
}
}
@@ -0,0 +1,26 @@
using System.Collections.Generic;
using Gos.ServiceModel.Enums;
namespace Gos.Core.Search.Queries.List
{
public class ListQuery : Query
{
public ConditionType Condition { get; set; }
public string ConversationalForm { get; set; }
public string Query { get; set; }
public bool GroupByMsd { get; set; }
public List<string> Lemmas { get; set; }
public List<string> Msds { get; set; }
public List<int> PartOfSpeechIds { get; set; }
public string StandardForm { get; set; }
public TranscriptionType TranscriptionType { get; set; }
}
}
@@ -0,0 +1,9 @@
using System.Collections.Generic;
namespace Gos.Core.Search.Queries.List
{
public class ListQueryResult : QueryResult
{
public List<ListQueryResultItem> Items { get; set; }
}
}
@@ -0,0 +1,13 @@
namespace Gos.Core.Search.Queries.List
{
public class ListQueryResultItem
{
public string ConversationalForm { get; set; }
public int Frequency { get; set; }
public string Msd { get; set; }
public string StandardForm { get; set; }
}
}
+38
View File
@@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using Gos.Core.Extensions;
namespace Gos.Core.Search.Queries
{
public abstract class Query : ICloneable
{
public List<int> DiscourseTypeIds { get; set; }
public List<int> DiscourseChannelIds { get; set; }
public List<int> DiscourseEventIds { get; set; }
public List<int> DiscourseRegionIds { get; set; }
public List<int> DiscourseYears { get; set; }
public int From { get; set; } = 0;
public int Size { get; set; } = 20;
public List<int> SpeakerAgeIds { get; set; }
public List<int> SpeakerEducationIds { get; set; }
public List<int> SpeakerLanguageIds { get; set; }
public List<int> SpeakerRegionIds { get; set; }
public List<int> SpeakerSexIds { get; set; }
public object Clone()
{
return this.Copy();
}
}
}
@@ -0,0 +1,7 @@
namespace Gos.Core.Search.Queries
{
public abstract class QueryResult
{
public long Total { get; set; }
}
}
@@ -0,0 +1,98 @@
using System.Reflection;
using Autofac;
using Gos.Core.Search;
using Gos.Core.Search.Aggregations;
using Gos.Infrastructure.Search;
using Gos.Infrastructure.Search.Aggregations;
using Gos.Infrastructure.Search.Converters;
using Gos.Infrastructure.Search.Indexes;
using Gos.Infrastructure.Search.QueryBuilders;
using Gos.Infrastructure.Search.QueryHandlers;
using Gos.ServiceModel.Enums;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Configuration;
using Nest;
using Module = Autofac.Module;
namespace Gos.Infrastructure.CompositionRoot
{
public class InfrastructureModule : Module
{
private Assembly InfrastructureAssembly => GetType().Assembly;
protected override void Load(ContainerBuilder builder)
{
base.Load(builder);
RegisterCaches(builder);
RegisterConfiguration(builder);
RegisterSearch(builder);
}
private static void RegisterCaches(ContainerBuilder builder)
{
var memoryCache = new MemoryCache(new MemoryCacheOptions());
builder.RegisterInstance(memoryCache).As<IMemoryCache>().SingleInstance();
}
private static void RegisterConfiguration(ContainerBuilder builder)
{
var configuration = new ConfigurationBuilder().AddEnvironmentVariables().Build();
builder.RegisterInstance(configuration).As<IConfiguration>().SingleInstance();
}
private void RegisterSearch(ContainerBuilder builder)
{
// Client
builder.RegisterType<ElasticClientFactory>().SingleInstance();
builder.Register(
c =>
{
var factory = c.Resolve<ElasticClientFactory>();
return factory.CreateClient();
})
.As<IElasticClient>()
.SingleInstance();
// Index providers
builder.RegisterType<IndexProviderFactory>().As<IIndexProviderFactory>().SingleInstance();
builder.RegisterAssemblyTypes(InfrastructureAssembly)
.Where(t => typeof(IIndexProvider).IsAssignableFrom(t))
.AsImplementedInterfaces()
.SingleInstance();
// Search engine
builder.RegisterType<ElasticSearchEngine>().As<ISearchEngine>().SingleInstance();
// Entity-DTO converters
builder.RegisterType<EsDtoConverterFactory>().As<IEsDtoConverterFactory>().SingleInstance();
builder.RegisterAssemblyTypes(InfrastructureAssembly)
.Where(t => typeof(IEsDtoConverter).IsAssignableFrom(t))
.AsImplementedInterfaces()
.SingleInstance();
// Query builders
builder.RegisterType<QueryBuilderFactory>().As<IQueryBuilderFactory>().SingleInstance();
builder.RegisterAssemblyTypes(InfrastructureAssembly).AsClosedTypesOf(typeof(IQueryBuilder<>)).AsImplementedInterfaces().SingleInstance();
// Query handlers
builder.RegisterType<QueryHandlerFactory>().As<IQueryHandlerFactory>().SingleInstance();
builder.RegisterAssemblyTypes(InfrastructureAssembly).AsClosedTypesOf(typeof(IQueryHandler<,>)).AsImplementedInterfaces().SingleInstance();
// Aggregators
builder.RegisterType<AggregatorFactory>().As<IAggregatorFactory>().SingleInstance();
builder.RegisterType<DiscourseChannelAggregator>().Keyed<IAggregator>(AggregationType.DiscourseChannel).SingleInstance();
builder.RegisterType<DiscourseEventAggregator>().Keyed<IAggregator>(AggregationType.DiscourseEvent).SingleInstance();
builder.RegisterType<DiscourseRegionAggregator>().Keyed<IAggregator>(AggregationType.DiscourseRegion).SingleInstance();
builder.RegisterType<DiscourseTypeAggregator>().Keyed<IAggregator>(AggregationType.DiscourseType).SingleInstance();
builder.RegisterType<DiscourseYearAggregator>().Keyed<IAggregator>(AggregationType.DiscourseYear).SingleInstance();
builder.RegisterType<SpeakerAgeAggregator>().Keyed<IAggregator>(AggregationType.SpeakerAge).SingleInstance();
builder.RegisterType<SpeakerEducationAggregator>().Keyed<IAggregator>(AggregationType.SpeakerEducation).SingleInstance();
builder.RegisterType<SpeakerLanguageAggregator>().Keyed<IAggregator>(AggregationType.SpeakerLanguage).SingleInstance();
builder.RegisterType<SpeakerRegionAggregator>().Keyed<IAggregator>(AggregationType.SpeakerRegion).SingleInstance();
builder.RegisterType<SpeakerSexAggregator>().Keyed<IAggregator>(AggregationType.SpeakerSex).SingleInstance();
builder.RegisterType<PartOfSpeechAggregator>().Keyed<IAggregator>(AggregationType.PartOfSpeech).SingleInstance();
builder.RegisterType<LemmaAggregator>().Keyed<IAggregator>(AggregationType.Lemma).SingleInstance();
}
}
}
@@ -0,0 +1,34 @@
using System.Collections.Generic;
using Nest;
namespace Gos.Infrastructure.Extensions
{
public static class ElasticQueriesExtensions
{
public static QueryContainer ToBooleanAndQuery(this List<QueryContainer> queries)
{
return queries.Count switch
{
0 => null,
1 => queries[0],
_ => new BoolQuery()
{
Must = queries,
},
};
}
public static QueryContainer ToBooleanOrQuery(this List<QueryContainer> queries)
{
return queries.Count switch
{
0 => null,
1 => queries[0],
_ => new BoolQuery()
{
Should = queries,
},
};
}
}
}
@@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Gos.Core\Gos.Core.csproj" />
<ProjectReference Include="..\Gos.Services\Gos.Services.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Autofac" Version="6.3.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
<PackageReference Include="NEST" Version="7.17.0" />
</ItemGroup>
</Project>
@@ -0,0 +1,18 @@
using Autofac.Features.Indexed;
using Gos.Core.Search.Aggregations;
using Gos.ServiceModel.Enums;
namespace Gos.Infrastructure.Search.Aggregations
{
public class AggregatorFactory : IAggregatorFactory
{
private readonly IIndex<AggregationType, IAggregator> aggregators;
public AggregatorFactory(IIndex<AggregationType, IAggregator> aggregators)
{
this.aggregators = aggregators;
}
public IAggregator GetAggregator(AggregationType aggregationType) => aggregators[aggregationType];
}
}
@@ -0,0 +1,71 @@
using System.Collections.Generic;
using System.Linq;
using Gos.Core.Search.Aggregations;
using Gos.Core.Search.Queries;
using Gos.Infrastructure.Search.Dtos;
using Gos.Infrastructure.Search.Indexes;
using Gos.Infrastructure.Search.QueryBuilders;
using Nest;
namespace Gos.Infrastructure.Search.Aggregations
{
public abstract class BaseAggregator : IAggregator
{
private readonly IElasticClient elasticClient;
private readonly IIndexProviderFactory indexProviderFactory;
private readonly IQueryBuilderFactory queryBuilderFactory;
protected BaseAggregator(IElasticClient elasticClient, IIndexProviderFactory indexProviderFactory, IQueryBuilderFactory queryBuilderFactory)
{
this.elasticClient = elasticClient;
this.indexProviderFactory = indexProviderFactory;
this.queryBuilderFactory = queryBuilderFactory;
}
protected abstract string FieldName { get; }
public IDictionary<string, int> Get<TQuery>(TQuery query)
where TQuery : Query
{
// Build query for elastic
var queryBuilder = queryBuilderFactory.GetBuilder<TQuery>();
var elasticQuery = queryBuilder.Build(query);
// Get and execute search request
var request = GetSearchRequest(elasticQuery);
var response = elasticClient.Search<EsConcordanceDto>(request);
// Read response
return ReadAggregation(response);
}
private SearchRequest GetSearchRequest(QueryContainer query)
{
var indexProvider = indexProviderFactory.GetProvider<EsConcordanceDto>();
var indexName = indexProvider.IndexName;
return new SearchRequest(indexName)
{
From = 0,
Size = 0,
Query = query,
Aggregations = new AggregationDictionary()
{
{
"gos_agg", new TermsAggregation("terms")
{
Field = FieldName,
Size = 100,
}
},
},
};
}
private static IDictionary<string, int> ReadAggregation(ISearchResponse<EsConcordanceDto> response)
{
var terms = response.Aggregations.Terms("gos_agg");
return terms?.Buckets?.ToDictionary(x => x.Key, x => x.DocCount.HasValue ? (int)x.DocCount.Value : 0);
}
}
}
@@ -0,0 +1,16 @@
using Gos.Infrastructure.Search.Indexes;
using Gos.Infrastructure.Search.QueryBuilders;
using Nest;
namespace Gos.Infrastructure.Search.Aggregations
{
public class DiscourseChannelAggregator : BaseAggregator
{
public DiscourseChannelAggregator(IElasticClient elasticClient, IIndexProviderFactory indexProviderFactory, IQueryBuilderFactory queryBuilderFactory)
: base(elasticClient, indexProviderFactory, queryBuilderFactory)
{
}
protected override string FieldName => "discourseChannelId";
}
}
@@ -0,0 +1,16 @@
using Gos.Infrastructure.Search.Indexes;
using Gos.Infrastructure.Search.QueryBuilders;
using Nest;
namespace Gos.Infrastructure.Search.Aggregations
{
public class DiscourseEventAggregator : BaseAggregator
{
public DiscourseEventAggregator(IElasticClient elasticClient, IIndexProviderFactory indexProviderFactory, IQueryBuilderFactory queryBuilderFactory)
: base(elasticClient, indexProviderFactory, queryBuilderFactory)
{
}
protected override string FieldName => "discourseEventId";
}
}
@@ -0,0 +1,17 @@
using Gos.Infrastructure.Search.Indexes;
using Gos.Infrastructure.Search.QueryBuilders;
using Nest;
namespace Gos.Infrastructure.Search.Aggregations
{
public class DiscourseRegionAggregator : BaseAggregator
{
public DiscourseRegionAggregator(IElasticClient elasticClient, IIndexProviderFactory indexProviderFactory, IQueryBuilderFactory queryBuilderFactory)
: base(elasticClient, indexProviderFactory, queryBuilderFactory)
{
}
protected override string FieldName => "discourseRegionId";
}
}
@@ -0,0 +1,16 @@
using Gos.Infrastructure.Search.Indexes;
using Gos.Infrastructure.Search.QueryBuilders;
using Nest;
namespace Gos.Infrastructure.Search.Aggregations
{
public class DiscourseTypeAggregator : BaseAggregator
{
public DiscourseTypeAggregator(IElasticClient elasticClient, IIndexProviderFactory indexProviderFactory, IQueryBuilderFactory queryBuilderFactory)
: base(elasticClient, indexProviderFactory, queryBuilderFactory)
{
}
protected override string FieldName => "discourseTypeId";
}
}
@@ -0,0 +1,16 @@
using Gos.Infrastructure.Search.Indexes;
using Gos.Infrastructure.Search.QueryBuilders;
using Nest;
namespace Gos.Infrastructure.Search.Aggregations
{
public class DiscourseYearAggregator : BaseAggregator
{
public DiscourseYearAggregator(IElasticClient elasticClient, IIndexProviderFactory indexProviderFactory, IQueryBuilderFactory queryBuilderFactory)
: base(elasticClient, indexProviderFactory, queryBuilderFactory)
{
}
protected override string FieldName => "discourseYear";
}
}
@@ -0,0 +1,16 @@
using Gos.Infrastructure.Search.Indexes;
using Gos.Infrastructure.Search.QueryBuilders;
using Nest;
namespace Gos.Infrastructure.Search.Aggregations
{
public class LemmaAggregator : BaseAggregator
{
public LemmaAggregator(IElasticClient elasticClient, IIndexProviderFactory indexProviderFactory, IQueryBuilderFactory queryBuilderFactory)
: base(elasticClient, indexProviderFactory, queryBuilderFactory)
{
}
protected override string FieldName => "token.lemma";
}
}
@@ -0,0 +1,16 @@
using Gos.Infrastructure.Search.Indexes;
using Gos.Infrastructure.Search.QueryBuilders;
using Nest;
namespace Gos.Infrastructure.Search.Aggregations
{
public class PartOfSpeechAggregator : BaseAggregator
{
public PartOfSpeechAggregator(IElasticClient elasticClient, IIndexProviderFactory indexProviderFactory, IQueryBuilderFactory queryBuilderFactory)
: base(elasticClient, indexProviderFactory, queryBuilderFactory)
{
}
protected override string FieldName => "token.partOfSpeechId";
}
}
@@ -0,0 +1,17 @@
using Gos.Infrastructure.Search.Indexes;
using Gos.Infrastructure.Search.QueryBuilders;
using Nest;
namespace Gos.Infrastructure.Search.Aggregations
{
public class SpeakerAgeAggregator : BaseAggregator
{
public SpeakerAgeAggregator(IElasticClient elasticClient, IIndexProviderFactory indexProviderFactory, IQueryBuilderFactory queryBuilderFactory)
: base(elasticClient, indexProviderFactory, queryBuilderFactory)
{
}
protected override string FieldName => "speakerAgeId";
}
}
@@ -0,0 +1,16 @@
using Gos.Infrastructure.Search.Indexes;
using Gos.Infrastructure.Search.QueryBuilders;
using Nest;
namespace Gos.Infrastructure.Search.Aggregations
{
public class SpeakerEducationAggregator : BaseAggregator
{
public SpeakerEducationAggregator(IElasticClient elasticClient, IIndexProviderFactory indexProviderFactory, IQueryBuilderFactory queryBuilderFactory)
: base(elasticClient, indexProviderFactory, queryBuilderFactory)
{
}
protected override string FieldName => "speakerEducationId";
}
}
@@ -0,0 +1,16 @@
using Gos.Infrastructure.Search.Indexes;
using Gos.Infrastructure.Search.QueryBuilders;
using Nest;
namespace Gos.Infrastructure.Search.Aggregations
{
public class SpeakerLanguageAggregator : BaseAggregator
{
public SpeakerLanguageAggregator(IElasticClient elasticClient, IIndexProviderFactory indexProviderFactory, IQueryBuilderFactory queryBuilderFactory)
: base(elasticClient, indexProviderFactory, queryBuilderFactory)
{
}
protected override string FieldName => "speakerLanguageId";
}
}
@@ -0,0 +1,17 @@
using Gos.Infrastructure.Search.Indexes;
using Gos.Infrastructure.Search.QueryBuilders;
using Nest;
namespace Gos.Infrastructure.Search.Aggregations
{
public class SpeakerRegionAggregator : BaseAggregator
{
public SpeakerRegionAggregator(IElasticClient elasticClient, IIndexProviderFactory indexProviderFactory, IQueryBuilderFactory queryBuilderFactory)
: base(elasticClient, indexProviderFactory, queryBuilderFactory)
{
}
protected override string FieldName => "speakerRegionId";
}
}
@@ -0,0 +1,16 @@
using Gos.Infrastructure.Search.Indexes;
using Gos.Infrastructure.Search.QueryBuilders;
using Nest;
namespace Gos.Infrastructure.Search.Aggregations
{
public class SpeakerSexAggregator : BaseAggregator
{
public SpeakerSexAggregator(IElasticClient elasticClient, IIndexProviderFactory indexProviderFactory, IQueryBuilderFactory queryBuilderFactory)
: base(elasticClient, indexProviderFactory, queryBuilderFactory)
{
}
protected override string FieldName => "speakerSexId";
}
}
@@ -0,0 +1,83 @@
using System.Linq;
using System.Threading.Tasks;
using Gos.Core.Entities;
using Gos.Core.Model;
using Gos.Infrastructure.Search.Dtos;
using Gos.Services.Services.PartOfSpeechService;
namespace Gos.Infrastructure.Search.Converters
{
public class EsConcordanceDtoConverter : IEsDtoConverter<Concordance, EsConcordanceDto>
{
private readonly IPartOfSpeechService partOfSpeechService;
public EsConcordanceDtoConverter(IPartOfSpeechService partOfSpeechService)
{
this.partOfSpeechService = partOfSpeechService;
}
public async Task<EsConcordanceDto> Convert(Concordance entity)
{
var discourse = entity.Statement.Discourse;
var speaker = entity.Statement.Speaker;
return new EsConcordanceDto
{
DiscourseId = discourse.Id,
DiscourseChannelId = discourse.Channel?.Id,
DiscourseEventId = discourse.Event?.Id,
DiscourseRegionId = discourse.Region?.Id,
DiscourseTypeId = discourse.Type?.Id,
DiscourseYear = discourse.Date.Year,
SpeakerAgeId = speaker?.Age?.Id,
SpeakerEducationId = speaker?.Education?.Id,
SpeakerLanguageId = speaker?.Language?.Id,
SpeakerRegionId = speaker?.Region1?.Id,
SpeakerSexId = speaker?.Sex?.Id,
StatementOrder = entity.Statement.Order,
Token = await ConvertToken(entity.Token),
TokenLeft1 = await ConvertToken(entity.TokenLeft1),
TokenLeft2 = await ConvertToken(entity.TokenLeft2),
TokenLeft3 = await ConvertToken(entity.TokenLeft3),
TokenLeft4 = await ConvertToken(entity.TokenLeft4),
TokenLeft5 = await ConvertToken(entity.TokenLeft5),
TokenLeft6 = await ConvertToken(entity.TokenLeft6),
TokenLeft7 = await ConvertToken(entity.TokenLeft7),
TokenLeft8 = await ConvertToken(entity.TokenLeft8),
TokenLeft9 = await ConvertToken(entity.TokenLeft9),
TokenLeft10 = await ConvertToken(entity.TokenLeft10),
TokenOrder = entity.Token.DiscourseOrder,
TokenRight1 = await ConvertToken(entity.TokenRight1),
TokenRight2 = await ConvertToken(entity.TokenRight2),
TokenRight3 = await ConvertToken(entity.TokenRight3),
TokenRight4 = await ConvertToken(entity.TokenRight4),
TokenRight5 = await ConvertToken(entity.TokenRight5),
TokenRight6 = await ConvertToken(entity.TokenRight6),
TokenRight7 = await ConvertToken(entity.TokenRight7),
TokenRight8 = await ConvertToken(entity.TokenRight8),
TokenRight9 = await ConvertToken(entity.TokenRight9),
TokenRight10 = await ConvertToken(entity.TokenRight10),
};
}
private async Task<EsTokenDto> ConvertToken(Token token)
{
if (token != null)
{
var partOfSpeech = await partOfSpeechService.GetPartOfSpeechByMsdCode(token.Msd);
return new EsTokenDto
{
Conversational = token.ConversationalForm,
ConversationalLower = token.ConversationalForm?.ToLower(),
Lemma = token.Lemma,
LemmaLower = token.Lemma?.ToLower(),
Msd = token.Msd,
PartOfSpeechId = partOfSpeech?.Id,
Standard = token.StandardForm,
StandardLower = token.StandardForm?.ToLower(),
};
}
return null;
}
}
}
@@ -0,0 +1,19 @@
using Autofac;
namespace Gos.Infrastructure.Search.Converters
{
public class EsDtoConverterFactory : IEsDtoConverterFactory
{
private readonly ILifetimeScope lifetimeScope;
public EsDtoConverterFactory(ILifetimeScope lifetimeScope)
{
this.lifetimeScope = lifetimeScope;
}
public IEsDtoConverter<TEntity, TDto> GetConverter<TEntity, TDto>()
{
return lifetimeScope.Resolve<IEsDtoConverter<TEntity, TDto>>();
}
}
}
@@ -0,0 +1,13 @@
using System.Threading.Tasks;
namespace Gos.Infrastructure.Search.Converters
{
public interface IEsDtoConverter<TEntity, TDto> : IEsDtoConverter
{
Task<TDto> Convert(TEntity entity);
}
public interface IEsDtoConverter
{
}
}
@@ -0,0 +1,7 @@
namespace Gos.Infrastructure.Search.Converters
{
public interface IEsDtoConverterFactory
{
IEsDtoConverter<TEntity, TDto> GetConverter<TEntity, TDto>();
}
}
@@ -0,0 +1,78 @@
using Nest;
namespace Gos.Infrastructure.Search.Dtos
{
public class EsConcordanceDto
{
public int? DiscourseChannelId { get; set; }
public int? DiscourseEventId { get; set; }
[Number(Store = true)]
public int DiscourseId { get; set; }
public int? DiscourseRegionId { get; set; }
public int? DiscourseTypeId { get; set; }
public int? DiscourseYear { get; set; }
public int? SpeakerAgeId { get; set; }
public int? SpeakerEducationId { get; set; }
public int? SpeakerLanguageId { get; set; }
public int? SpeakerRegionId { get; set; }
public int? SpeakerSexId { get; set; }
[Number(Store = true)]
public int StatementOrder { get; set; }
public EsTokenDto Token { get; set; }
public EsTokenDto TokenLeft1 { get; set; }
public EsTokenDto TokenLeft10 { get; set; }
public EsTokenDto TokenLeft2 { get; set; }
public EsTokenDto TokenLeft3 { get; set; }
public EsTokenDto TokenLeft4 { get; set; }
public EsTokenDto TokenLeft5 { get; set; }
public EsTokenDto TokenLeft6 { get; set; }
public EsTokenDto TokenLeft7 { get; set; }
public EsTokenDto TokenLeft8 { get; set; }
public EsTokenDto TokenLeft9 { get; set; }
[Number(Store = true)]
public int TokenOrder { get; set; }
public EsTokenDto TokenRight1 { get; set; }
public EsTokenDto TokenRight10 { get; set; }
public EsTokenDto TokenRight2 { get; set; }
public EsTokenDto TokenRight3 { get; set; }
public EsTokenDto TokenRight4 { get; set; }
public EsTokenDto TokenRight5 { get; set; }
public EsTokenDto TokenRight6 { get; set; }
public EsTokenDto TokenRight7 { get; set; }
public EsTokenDto TokenRight8 { get; set; }
public EsTokenDto TokenRight9 { get; set; }
}
}
@@ -0,0 +1,30 @@
using Nest;
namespace Gos.Infrastructure.Search.Dtos
{
public class EsTokenDto
{
[Keyword]
public string Conversational { get; set; }
[Keyword]
public string ConversationalLower { get; set; }
[Keyword]
public string Lemma { get; set; }
[Keyword]
public string LemmaLower { get; set; }
[Keyword]
public string Msd { get; set; }
public int? PartOfSpeechId { get; set; }
[Keyword]
public string Standard { get; set; }
[Keyword]
public string StandardLower { get; set; }
}
}
@@ -0,0 +1,29 @@
using System;
using Gos.Core;
using Microsoft.Extensions.Configuration;
using Nest;
namespace Gos.Infrastructure.Search
{
public class ElasticClientFactory
{
private readonly IConfiguration configuration;
public ElasticClientFactory(IConfiguration configuration)
{
this.configuration = configuration;
}
public IElasticClient CreateClient()
{
var connectionString = configuration[ConfigurationKey.Elastic.ConnectionString];
var connectionSettings = new ConnectionSettings(new Uri(connectionString)).SniffOnStartup(false).RequestTimeout(TimeSpan.FromMinutes(5));
#if DEBUG
connectionSettings.EnableDebugMode().IncludeServerStackTraceOnError(false);
#endif
return new ElasticClient(connectionSettings);
}
}
}

Some files were not shown because too many files have changed in this diff Show More