Compare commits

..
Author SHA1 Message Date
Madhukar Mishra 7db70f2491 fixup 2024-01-15 21:13:40 +05:30
Madhukar Mishra 6efc7eb859 fixup 2024-01-15 21:13:40 +05:30
Madhukar Mishra 8b1993a225 fixup 2024-01-15 21:13:40 +05:30
Madhukar Mishra 4748a068d7 add a metric to try otel 2024-01-15 21:13:40 +05:30
Madhukar Mishra b12c972c4c update .gitignore 2024-01-15 21:13:40 +05:30
Madhukar Mishra 00c9ae2543 add otel crate 2024-01-15 21:13:39 +05:30
Brandon Thomas 89cd104551 codegen 2024-01-13 22:58:39 -05:00
Brandon Thomas 5933387f5c tts_models migration: weights db column, list tts models 2024-01-13 22:49:14 -05:00
Brandon Thomas b5009d5985 bvh extension 2024-01-13 03:42:06 -05:00
Brandon Thomas de4548795c handle BVH file uploads 2024-01-13 03:38:17 -05:00
Brandon Thomas 6122f11cf3 Add MediaFileOriginDetails to list media files for user 2024-01-13 01:40:34 -05:00
Brandon Thomas 929105bb85 add color index to cover images 2024-01-13 01:22:31 -05:00
Brandon Thomas a76272aeb3 doc 2024-01-13 01:13:21 -05:00
Brandon Thomas 4c9cb5d986 add MediaFileOriginDetails to list featured media files 2024-01-13 01:12:04 -05:00
Brandon Thomas 108806cb52 list media files - MediaFileOriginDetails + title 2024-01-13 01:00:55 -05:00
Brandon Thomas ce852eda8a netlify feature branch cors 2024-01-12 15:51:50 -05:00
Brandon Thomas 5949d1d4e7 fix names of search fields 2024-01-12 00:18:44 -05:00
Brandon Thomas c01ffe33a5 cover image details on all informational weight endpoints 2024-01-11 23:32:52 -05:00
Brandon Thomas f251e8b88a document types 2024-01-11 21:39:29 -05:00
Brandon Thomas 65ea06767a cover image details on list weights 2024-01-11 21:28:32 -05:00
Brandon Thomas 5643ecae89 CoverImageDetails 2024-01-11 21:16:10 -05:00
Brandon Thomas c1b152cc35 default cover images (part 1) 2024-01-11 20:56:37 -05:00
Brandon Thomas 65bdea264d move mod user_avatars 2024-01-11 20:34:13 -05:00
Brandon Thomas 0bca56a9db query bug - referenced old columns 2024-01-11 20:19:34 -05:00
Brandon Thomas 990f51bef0 fix failing tests and lints 2024-01-11 19:38:27 -05:00
Brandon Thomas c8be79c1dc change enum serialization 2024-01-11 19:15:55 -05:00
Brandon Thomas dca8ff7014 deprecated lint; clarify serde casing 2024-01-11 19:09:38 -05:00
Brandon Thomas d11c236257 analyze download jobs 2024-01-11 16:25:38 -05:00
Brandon Thomas 3a0246822f change token name for frontend 2024-01-11 15:57:17 -05:00
Brandon Thomas 690afa66d7 ugh, it was feature flagged 2024-01-11 05:48:03 -05:00
Brandon Thomas 0657880a9b this was 404ing, not sure why (too tired) 2024-01-11 05:21:16 -05:00
Brandon Thomas 792c109bb6 query exact indices in elasticsearch 2024-01-11 04:57:08 -05:00
Brandon Thomas 95987860f4 codegen 2024-01-11 02:30:17 -05:00
Brandon Thomas 6104782041 api docs for elasticsearch 2024-01-11 02:29:40 -05:00
Brandon Thomas b75dea434f model_weights elasticsearch endpoint 2024-01-11 02:23:42 -05:00
Brandon Thomas 3372447a0b cli elasticsearch search 2024-01-11 02:03:57 -05:00
Brandon Thomas 33323baf22 elasticsearch schema 2024-01-10 23:33:10 -05:00
Brandon Thomas 6e681b0ff6 Merge pull request #275 from storytold/brandon-es-wip
elasticsearch wip
2024-01-10 22:54:19 -05:00
Brandon Thomas aa1a007c5e elasticsearch wip 2024-01-10 22:53:36 -05:00
Brandon Thomas 590ef4701e codegen 2024-01-10 04:24:06 -05:00
Brandon Thomas 38d14ad361 stats on list weights (explore) 2024-01-10 04:22:33 -05:00
Brandon Thomas 8b63c7e5bc stats for get weight handler 2024-01-10 04:04:17 -05:00
Brandon Thomas ae80d5c02d clear out bookmark token if soft deleted (recommended by victor) 2024-01-10 03:38:47 -05:00
Brandon Thomas d3de1c9a4b add stats to list weights by user (remove old fields) 2024-01-10 03:32:56 -05:00
Brandon Thomas 70691437f3 add stats to featured weights handler 2024-01-10 03:05:22 -05:00
Brandon Thomas e63f4e08bf stats on list media for user handler 2024-01-10 02:39:52 -05:00
Brandon Thomas 0fae1229b6 stats on get media file endpoint 2024-01-10 02:34:43 -05:00
Brandon Thomas aae75c4050 fix batch bookmark bug 2024-01-10 02:21:37 -05:00
ArEnSc 19670459e8 Merge pull request #273 from storytold/feature/mocap-net
Add mocapnet
2024-01-10 00:34:18 -05:00
saltacc 240bf5f488 size arg & todo comment 2024-01-09 21:11:14 -08:00
Brandon Thomas b8c26fa9ce remove fields 2024-01-09 23:18:37 -05:00
Brandon Thomas 52d7e0585e Merge pull request #274 from storytold/brandon-more-stats-2
add stats on all endpoints
2024-01-09 23:12:22 -05:00
Brandon Thomas 9f54bfe0ab add stats on all endpoints 2024-01-09 23:11:24 -05:00
saltacc 7714f0c056 add command line arguments 2024-01-09 19:26:46 -08:00
saltacc dbdc5b3c9d fix directories, mime, and inference categories 2024-01-09 18:58:01 -08:00
saltacc c25cc3b126 add mocapnet 2024-01-09 16:21:32 -08:00
Brandon Thomas c07e71b8c3 add bookmark tokwn to batch get bookmarks 2024-01-09 00:35:29 -05:00
Brandon Thomas 0aaacdddaa reusable type 2024-01-08 23:30:16 -05:00
Brandon Thomas 52af33a94d stats on list bookmarks for user endpoint 2024-01-08 23:25:49 -05:00
Brandon Thomas 7900d732c7 codegen queries 2024-01-08 00:31:34 -05:00
Brandon Thomas af24c8d469 Merge pull request #270 from storytold/brandon-ratings-counts
collect rating stats
2024-01-08 00:30:41 -05:00
Brandon Thomas de768158ab collect rating stats 2024-01-08 00:29:52 -05:00
Brandon Thomas 1237aa8a10 rename create -> upsert 2024-01-07 23:14:47 -05:00
Brandon Thomas f601c4a385 codegen DB, comment 2024-01-06 09:57:30 -05:00
Brandon Thomas d03c53ed2e fix logic on delete, too 2024-01-05 23:59:06 -05:00
Brandon Thomas cd0c35de4a fix increment logic 2024-01-05 23:54:13 -05:00
Brandon Thomas 39a5440b81 Merge pull request #269 from storytold/brandon-record-stats
record stats
2024-01-05 23:37:16 -05:00
194 changed files with 4913 additions and 477 deletions
+1
View File
@@ -17,6 +17,7 @@ production_database_voice_clone_report_download.sh
secrets.toml
secrets.yaml
twitch_secrets.toml
.DS_Store
# Old env secrets
.*-secrets
@@ -1,6 +1,6 @@
{
"db_name": "MySQL",
"query": "\n SELECT\n wt.token as `token: tokens::tokens::model_weights::ModelWeightToken`,\n wt.title,\n wt.weights_type as `weights_type: enums::by_table::model_weights::weights_types::WeightsType`,\n wt.weights_category as `weights_category: enums::by_table::model_weights::weights_category::WeightsCategory`,\n wt.maybe_description_markdown,\n wt.maybe_description_rendered_html,\n wt.creator_ip_address,\n wt.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n\n wt.creator_user_token as `creator_user_token: tokens::tokens::users::UserToken`,\n users.username as creator_username,\n users.display_name as creator_display_name,\n users.email_gravatar_hash AS creator_gravatar_hash,\n\n wt.maybe_last_update_user_token as `maybe_last_update_user_token: tokens::tokens::users::UserToken`,\n wt.original_download_url,\n wt.original_filename,\n wt.file_size_bytes,\n wt.file_checksum_sha2,\n wt.public_bucket_hash,\n wt.maybe_public_bucket_prefix,\n wt.maybe_public_bucket_extension,\n\n cover_image.public_bucket_directory_hash as maybe_cover_image_public_bucket_hash,\n cover_image.maybe_public_bucket_prefix as maybe_cover_image_public_bucket_prefix,\n cover_image.maybe_public_bucket_extension as maybe_cover_image_public_bucket_extension,\n\n wt.cached_user_ratings_negative_count,\n wt.cached_user_ratings_positive_count,\n wt.cached_user_ratings_total_count,\n wt.maybe_cached_user_ratings_ratio,\n wt.cached_user_ratings_last_updated_at,\n wt.version,\n wt.created_at,\n wt.updated_at,\n wt.user_deleted_at,\n wt.mod_deleted_at\n FROM model_weights as wt\n JOIN users\n ON users.token = wt.creator_user_token\n LEFT OUTER JOIN media_files as cover_image\n ON cover_image.token = wt.maybe_cover_image_media_file_token\n WHERE\n wt.token = ?\n AND wt.user_deleted_at IS NULL\n AND wt.mod_deleted_at IS NULL\n ",
"query": "\n SELECT\n wt.token as `token: tokens::tokens::model_weights::ModelWeightToken`,\n wt.title,\n wt.weights_type as `weights_type: enums::by_table::model_weights::weights_types::WeightsType`,\n wt.weights_category as `weights_category: enums::by_table::model_weights::weights_category::WeightsCategory`,\n wt.maybe_description_markdown,\n wt.maybe_description_rendered_html,\n wt.creator_ip_address,\n wt.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n\n wt.creator_user_token as `creator_user_token: tokens::tokens::users::UserToken`,\n users.username as creator_username,\n users.display_name as creator_display_name,\n users.email_gravatar_hash AS creator_gravatar_hash,\n\n wt.maybe_last_update_user_token as `maybe_last_update_user_token: tokens::tokens::users::UserToken`,\n wt.original_download_url,\n wt.original_filename,\n wt.file_size_bytes,\n wt.file_checksum_sha2,\n wt.public_bucket_hash,\n wt.maybe_public_bucket_prefix,\n wt.maybe_public_bucket_extension,\n\n cover_image.public_bucket_directory_hash as maybe_cover_image_public_bucket_hash,\n cover_image.maybe_public_bucket_prefix as maybe_cover_image_public_bucket_prefix,\n cover_image.maybe_public_bucket_extension as maybe_cover_image_public_bucket_extension,\n\n entity_stats.ratings_positive_count as maybe_ratings_positive_count,\n entity_stats.ratings_negative_count as maybe_ratings_negative_count,\n entity_stats.bookmark_count as maybe_bookmark_count,\n\n wt.version,\n wt.created_at,\n wt.updated_at,\n wt.user_deleted_at,\n wt.mod_deleted_at\n FROM model_weights as wt\n JOIN users\n ON users.token = wt.creator_user_token\n LEFT OUTER JOIN media_files as cover_image\n ON cover_image.token = wt.maybe_cover_image_media_file_token\n LEFT OUTER JOIN entity_stats\n ON entity_stats.entity_type = \"model_weight\"\n AND entity_stats.entity_token = wt.token\n WHERE\n wt.token = ?\n AND wt.user_deleted_at IS NULL\n AND wt.mod_deleted_at IS NULL\n ",
"describe": {
"columns": [
{
@@ -235,56 +235,36 @@
},
{
"ordinal": 23,
"name": "cached_user_ratings_negative_count",
"name": "maybe_ratings_positive_count",
"type_info": {
"type": "Long",
"flags": "NOT_NULL | UNSIGNED",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 24,
"name": "cached_user_ratings_positive_count",
"name": "maybe_ratings_negative_count",
"type_info": {
"type": "Long",
"flags": "NOT_NULL | UNSIGNED",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 25,
"name": "cached_user_ratings_total_count",
"name": "maybe_bookmark_count",
"type_info": {
"type": "Long",
"flags": "NOT_NULL | UNSIGNED",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 26,
"name": "maybe_cached_user_ratings_ratio",
"type_info": {
"type": "Float",
"flags": "",
"char_set": 63,
"max_size": 12
}
},
{
"ordinal": 27,
"name": "cached_user_ratings_last_updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 28,
"name": "version",
"type_info": {
"type": "Long",
@@ -294,7 +274,7 @@
}
},
{
"ordinal": 29,
"ordinal": 27,
"name": "created_at",
"type_info": {
"type": "Timestamp",
@@ -304,7 +284,7 @@
}
},
{
"ordinal": 30,
"ordinal": 28,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
@@ -314,7 +294,7 @@
}
},
{
"ordinal": 31,
"ordinal": 29,
"name": "user_deleted_at",
"type_info": {
"type": "Timestamp",
@@ -324,7 +304,7 @@
}
},
{
"ordinal": 32,
"ordinal": 30,
"name": "mod_deleted_at",
"type_info": {
"type": "Timestamp",
@@ -361,11 +341,9 @@
true,
true,
true,
false,
false,
false,
true,
false,
true,
true,
false,
false,
false,
@@ -373,5 +351,5 @@
true
]
},
"hash": "bb2c5a81ab6f38ecef7ee177a4ea36e75c5d2180a897094f940f097bbbd66060"
"hash": "0220f288c06686874df87ec163533be64cc000634920d58e7fa7a7d156cbfcae"
}
@@ -1,6 +1,6 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n m.token as `token: tokens::tokens::media_files::MediaFileToken`,\n\n m.media_type as `media_type: enums::by_table::media_files::media_file_type::MediaFileType`,\n\n users.token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n users.username as maybe_creator_username,\n users.display_name as maybe_creator_display_name,\n users.email_gravatar_hash as maybe_creator_gravatar_hash,\n\n m.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n\n model_weights.token as `maybe_model_weights_token: tokens::tokens::model_weights::ModelWeightToken`,\n model_weights.title as maybe_model_weights_title,\n model_weights.weights_type as `maybe_model_weights_type: enums::by_table::model_weights::weights_types::WeightsType`,\n model_weights.weights_category as `maybe_model_weights_category: enums::by_table::model_weights::weights_category::WeightsCategory`,\n\n cover_image.public_bucket_directory_hash as maybe_model_cover_image_public_bucket_hash,\n cover_image.maybe_public_bucket_prefix as maybe_model_cover_image_public_bucket_prefix,\n cover_image.maybe_public_bucket_extension as maybe_model_cover_image_public_bucket_extension,\n\n model_weight_creator.token as `maybe_model_weight_creator_user_token: tokens::tokens::users::UserToken`,\n model_weight_creator.username as maybe_model_weight_creator_username,\n model_weight_creator.display_name as maybe_model_weight_creator_display_name,\n model_weight_creator.email_gravatar_hash as maybe_model_weight_creator_gravatar_hash,\n\n m.public_bucket_directory_hash,\n m.maybe_public_bucket_prefix,\n m.maybe_public_bucket_extension,\n\n m.created_at,\n m.updated_at\n\nFROM media_files AS m\nLEFT OUTER JOIN users\n ON m.maybe_creator_user_token = users.token\nLEFT OUTER JOIN model_weights\n ON m.maybe_origin_model_token = model_weights.token\nLEFT OUTER JOIN media_files as cover_image\n ON cover_image.token = model_weights.maybe_cover_image_media_file_token\nLEFT OUTER JOIN users as model_weight_creator\n ON model_weight_creator.token = model_weights.creator_user_token\nWHERE\n m.token = ?\n AND m.user_deleted_at IS NULL\n AND m.mod_deleted_at IS NULL\n ",
"query": "\nSELECT\n m.token as `token: tokens::tokens::media_files::MediaFileToken`,\n\n m.media_type as `media_type: enums::by_table::media_files::media_file_type::MediaFileType`,\n\n users.token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n users.username as maybe_creator_username,\n users.display_name as maybe_creator_display_name,\n users.email_gravatar_hash as maybe_creator_gravatar_hash,\n\n m.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n\n model_weights.token as `maybe_model_weights_token: tokens::tokens::model_weights::ModelWeightToken`,\n model_weights.title as maybe_model_weights_title,\n model_weights.weights_type as `maybe_model_weights_type: enums::by_table::model_weights::weights_types::WeightsType`,\n model_weights.weights_category as `maybe_model_weights_category: enums::by_table::model_weights::weights_category::WeightsCategory`,\n\n cover_image.public_bucket_directory_hash as maybe_model_cover_image_public_bucket_hash,\n cover_image.maybe_public_bucket_prefix as maybe_model_cover_image_public_bucket_prefix,\n cover_image.maybe_public_bucket_extension as maybe_model_cover_image_public_bucket_extension,\n\n model_weight_creator.token as `maybe_model_weight_creator_user_token: tokens::tokens::users::UserToken`,\n model_weight_creator.username as maybe_model_weight_creator_username,\n model_weight_creator.display_name as maybe_model_weight_creator_display_name,\n model_weight_creator.email_gravatar_hash as maybe_model_weight_creator_gravatar_hash,\n\n m.public_bucket_directory_hash,\n m.maybe_public_bucket_prefix,\n m.maybe_public_bucket_extension,\n\n entity_stats.ratings_positive_count as maybe_ratings_positive_count,\n entity_stats.ratings_negative_count as maybe_ratings_negative_count,\n entity_stats.bookmark_count as maybe_bookmark_count,\n\n m.created_at,\n m.updated_at\n\nFROM media_files AS m\nLEFT OUTER JOIN users\n ON m.maybe_creator_user_token = users.token\nLEFT OUTER JOIN model_weights\n ON m.maybe_origin_model_token = model_weights.token\nLEFT OUTER JOIN media_files as cover_image\n ON cover_image.token = model_weights.maybe_cover_image_media_file_token\nLEFT OUTER JOIN users as model_weight_creator\n ON model_weight_creator.token = model_weights.creator_user_token\nLEFT OUTER JOIN entity_stats\n ON entity_stats.entity_type = \"media_file\"\n AND entity_stats.entity_token = m.token\nWHERE\n m.token = ?\n AND m.user_deleted_at IS NULL\n AND m.mod_deleted_at IS NULL\n ",
"describe": {
"columns": [
{
@@ -215,6 +215,36 @@
},
{
"ordinal": 21,
"name": "maybe_ratings_positive_count",
"type_info": {
"type": "Long",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 22,
"name": "maybe_ratings_negative_count",
"type_info": {
"type": "Long",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 23,
"name": "maybe_bookmark_count",
"type_info": {
"type": "Long",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 24,
"name": "created_at",
"type_info": {
"type": "Timestamp",
@@ -224,7 +254,7 @@
}
},
{
"ordinal": 22,
"ordinal": 25,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
@@ -259,9 +289,12 @@
false,
true,
true,
true,
true,
true,
false,
false
]
},
"hash": "58648783cb376fc7ad093ff50a8a7bcb3c55fe57b2ad7d3ebbbdbc63573069ba"
"hash": "06e0c5e80803d072551bc4df40e7d273ba0772608d52b46b840249415c341945"
}
@@ -1,12 +0,0 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO model_weights\nSET\n token = ?,\n weights_type = ?,\n weights_category = ?,\n title = ?,\n maybe_cover_image_media_file_token = NULL,\n maybe_description_markdown = ?,\n maybe_description_rendered_html = ?,\n creator_user_token = ?,\n creator_ip_address = ?,\n\n creator_set_visibility = ?,\n maybe_last_update_user_token = NULL,\n original_download_url = ?,\n original_filename = ?,\n file_size_bytes = ?,\n file_checksum_sha2 = ?,\n\n public_bucket_hash = ?,\n maybe_public_bucket_prefix = ?,\n maybe_public_bucket_extension = ?,\n cached_user_ratings_total_count = 0,\n cached_user_ratings_positive_count = 0,\n cached_user_ratings_negative_count = 0,\n maybe_cached_user_ratings_ratio = 0.0,\n cached_user_ratings_last_updated_at = NOW(),\n\n maybe_migration_old_model_token = ?,\n version = ?,\n created_at = ?,\n updated_at = ?,\n user_deleted_at = ?,\n mod_deleted_at = ?\n\nON DUPLICATE KEY UPDATE\n weights_type = ?,\n weights_category = ?,\n title = ?,\n maybe_cover_image_media_file_token = NULL,\n maybe_description_markdown = ?,\n maybe_description_rendered_html = ?,\n creator_user_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n maybe_last_update_user_token = NULL,\n original_download_url = ?,\n original_filename = ?,\n file_size_bytes = ?,\n file_checksum_sha2 = ?,\n public_bucket_hash = ?,\n maybe_public_bucket_prefix = ?,\n maybe_public_bucket_extension = ?,\n cached_user_ratings_total_count = 0,\n cached_user_ratings_positive_count = 0,\n cached_user_ratings_negative_count = 0,\n maybe_cached_user_ratings_ratio = 0.0,\n cached_user_ratings_last_updated_at = NOW(),\n maybe_migration_old_model_token = ?,\n version = ?,\n created_at = ?,\n updated_at = ?,\n user_deleted_at = ?,\n mod_deleted_at = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 43
},
"nullable": []
},
"hash": "0a392b6adb884a4bb4c08fbc2123d40c27e9fbb5c2b688b182f849b0c1cc5735"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\n INSERT INTO entity_stats SET\n entity_type = ?,\n entity_token = ?,\n ratings_positive_count = 0,\n ratings_negative_count = 1\n ON DUPLICATE KEY UPDATE\n ratings_positive_count = ABS(CAST(ratings_positive_count AS SIGNED) - 1),\n ratings_negative_count = ratings_negative_count + 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "1d6c0e4b9c19d0726270e52cfd128f2a9068aa58465e86716c7476c8635f9762"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\n INSERT INTO entity_stats SET\n entity_type = ?,\n entity_token = ?,\n bookmark_count = 1\n ON DUPLICATE KEY UPDATE\n bookmark_count = bookmark_count + 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "3cfd6ff9a99be15f4a90a710d147291e5f62487c88a5c5bbbbd1fb2c1780a4d5"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\n INSERT INTO entity_stats SET\n entity_type = ?,\n entity_token = ?,\n ratings_negative_count = 1\n ON DUPLICATE KEY UPDATE\n ratings_negative_count = ratings_negative_count + 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "40cb263656c235549e5d69c2e66fa28b9feb966a8092583b8ffc26ae59cef1f6"
}
@@ -0,0 +1,146 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n w.token as `token: tokens::tokens::model_weights::ModelWeightToken`,\n w.weights_type as `weight_type: enums::by_table::model_weights::weights_types::WeightsType`,\n w.title,\n w.creator_user_token as `creator_user_token: tokens::tokens::users::UserToken`,\n users.username as creator_username,\n users.display_name as creator_display_name,\n users.email_gravatar_hash as creator_gravatar_hash,\n w_extension.ietf_language_tag,\n w_extension.ietf_primary_language_subtag,\n w.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n w.created_at,\n w.updated_at\nFROM model_weights as w\nLEFT OUTER JOIN model_weights_extension_tts_details as w_extension\n ON w_extension.model_weights_token = w.token\nJOIN users\n ON users.token = w.creator_user_token\nWHERE\n w.weights_type IN (\"tt2\")\n AND w.user_deleted_at IS NULL\n AND w.mod_deleted_at IS NULL\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "token: tokens::tokens::model_weights::ModelWeightToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "weight_type: enums::by_table::model_weights::weights_types::WeightsType",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 2,
"name": "title",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 3,
"name": "creator_user_token: tokens::tokens::users::UserToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 4,
"name": "creator_username",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 5,
"name": "creator_display_name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 6,
"name": "creator_gravatar_hash",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 7,
"name": "ietf_language_tag",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 256
}
},
{
"ordinal": 8,
"name": "ietf_primary_language_subtag",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 48
}
},
{
"ordinal": 9,
"name": "creator_set_visibility: enums::common::visibility::Visibility",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 10,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 11,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 0
},
"nullable": [
false,
false,
false,
false,
false,
false,
false,
true,
true,
false,
false,
false
]
},
"hash": "4d45f5ce213627465e991eaec9b509100e22c614367b67ab026b5edd70927ea5"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\n INSERT INTO entity_stats SET\n entity_type = ?,\n entity_token = ?,\n ratings_positive_count = 1,\n ratings_negative_count = 0\n ON DUPLICATE KEY UPDATE\n ratings_positive_count = ratings_positive_count + 1,\n ratings_negative_count = ABS(CAST(ratings_negative_count AS SIGNED) - 1)\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "5a7186c39fff3fee762918b33eb0081cec0a58f62b24f0b717bb9ff1f848d9b2"
}
@@ -0,0 +1,289 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n w.id,\n w.token as `token: tokens::tokens::model_weights::ModelWeightToken`,\n\n w.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n\n w.weights_type as `weights_type: enums::by_table::model_weights::weights_types::WeightsType`,\n w.weights_category as `weights_category: enums::by_table::model_weights::weights_category::WeightsCategory`,\n\n w.title,\n\n cover_image.token as `maybe_cover_image_media_file_token: tokens::tokens::media_files::MediaFileToken`,\n cover_image.public_bucket_directory_hash as maybe_cover_image_public_bucket_hash,\n cover_image.maybe_public_bucket_prefix as maybe_cover_image_public_bucket_prefix,\n cover_image.maybe_public_bucket_extension as maybe_cover_image_public_bucket_extension,\n\n w.creator_user_token as `creator_user_token: tokens::tokens::users::UserToken`,\n users.username as creator_username,\n users.display_name as creator_display_name,\n users.email_gravatar_hash as creator_gravatar_hash,\n\n entity_stats.ratings_positive_count as maybe_ratings_positive_count,\n entity_stats.ratings_negative_count as maybe_ratings_negative_count,\n entity_stats.bookmark_count as maybe_bookmark_count,\n\n extension_tts.ietf_language_tag as maybe_tts_ietf_language_tag,\n extension_tts.ietf_primary_language_subtag as maybe_tts_ietf_primary_language_subtag,\n\n extension_vc.ietf_language_tag as maybe_vc_ietf_language_tag,\n extension_vc.ietf_primary_language_subtag as maybe_vc_ietf_primary_language_subtag,\n\n w.created_at,\n w.updated_at,\n w.user_deleted_at,\n w.mod_deleted_at\n\nFROM model_weights as w\n\nJOIN users\n ON users.token = w.creator_user_token\n\nLEFT OUTER JOIN model_weights_extension_tts_details as extension_tts\n ON extension_tts.model_weights_token = w.token\nLEFT OUTER JOIN model_weights_extension_voice_conversion_details as extension_vc\n ON extension_vc.model_weights_token = w.token\nLEFT OUTER JOIN entity_stats\n ON entity_stats.entity_type = \"model_weights\"\n AND entity_stats.entity_token = w.token\nLEFT OUTER JOIN media_files as cover_image\n ON cover_image.token = w.maybe_cover_image_media_file_token\n\nWHERE\n w.id > ?\nORDER BY id ASC\nLIMIT ?\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "id",
"type_info": {
"type": "LongLong",
"flags": "NOT_NULL | PRIMARY_KEY | AUTO_INCREMENT",
"char_set": 63,
"max_size": 20
}
},
{
"ordinal": 1,
"name": "token: tokens::tokens::model_weights::ModelWeightToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 2,
"name": "creator_set_visibility: enums::common::visibility::Visibility",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 3,
"name": "weights_type: enums::by_table::model_weights::weights_types::WeightsType",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 4,
"name": "weights_category: enums::by_table::model_weights::weights_category::WeightsCategory",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 5,
"name": "title",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 6,
"name": "maybe_cover_image_media_file_token: tokens::tokens::media_files::MediaFileToken",
"type_info": {
"type": "VarString",
"flags": "UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 7,
"name": "maybe_cover_image_public_bucket_hash",
"type_info": {
"type": "VarString",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 8,
"name": "maybe_cover_image_public_bucket_prefix",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 64
}
},
{
"ordinal": 9,
"name": "maybe_cover_image_public_bucket_extension",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 64
}
},
{
"ordinal": 10,
"name": "creator_user_token: tokens::tokens::users::UserToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 11,
"name": "creator_username",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 12,
"name": "creator_display_name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 13,
"name": "creator_gravatar_hash",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 14,
"name": "maybe_ratings_positive_count",
"type_info": {
"type": "Long",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 15,
"name": "maybe_ratings_negative_count",
"type_info": {
"type": "Long",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 16,
"name": "maybe_bookmark_count",
"type_info": {
"type": "Long",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 17,
"name": "maybe_tts_ietf_language_tag",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 256
}
},
{
"ordinal": 18,
"name": "maybe_tts_ietf_primary_language_subtag",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 48
}
},
{
"ordinal": 19,
"name": "maybe_vc_ietf_language_tag",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 256
}
},
{
"ordinal": 20,
"name": "maybe_vc_ietf_primary_language_subtag",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 48
}
},
{
"ordinal": 21,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 22,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 23,
"name": "user_deleted_at",
"type_info": {
"type": "Timestamp",
"flags": "BINARY",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 24,
"name": "mod_deleted_at",
"type_info": {
"type": "Timestamp",
"flags": "BINARY",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 2
},
"nullable": [
false,
false,
false,
false,
false,
false,
true,
true,
true,
true,
false,
false,
false,
false,
true,
true,
true,
true,
true,
true,
true,
false,
false,
true,
true
]
},
"hash": "6040227c139f6e2972734515b0a904d2a7b04bbf1a419677fc19287a0757ae21"
}
@@ -1,6 +1,6 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO model_weights\nSET\n token = ?,\n weights_type = ?,\n weights_category = ?,\n title = ?,\n\n maybe_cover_image_media_file_token = NULL,\n maybe_description_markdown = NULL,\n maybe_description_rendered_html = NULL,\n\n maybe_last_update_user_token = NULL,\n original_download_url = ?,\n original_filename = ?,\n file_size_bytes = ?,\n file_checksum_sha2 = ?,\n\n creator_user_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n\n public_bucket_hash = ?,\n maybe_public_bucket_prefix = ?,\n maybe_public_bucket_extension = ?,\n\n cached_user_ratings_total_count = 0,\n cached_user_ratings_positive_count = 0,\n cached_user_ratings_negative_count = 0,\n maybe_cached_user_ratings_ratio = 0.0,\n cached_user_ratings_last_updated_at = NOW(),\n\n maybe_migration_old_model_token = ?\n ",
"query": "\nINSERT INTO model_weights\nSET\n token = ?,\n weights_type = ?,\n weights_category = ?,\n title = ?,\n\n maybe_cover_image_media_file_token = NULL,\n maybe_description_markdown = NULL,\n maybe_description_rendered_html = NULL,\n\n maybe_last_update_user_token = NULL,\n original_download_url = ?,\n original_filename = ?,\n file_size_bytes = ?,\n file_checksum_sha2 = ?,\n\n creator_user_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n\n public_bucket_hash = ?,\n maybe_public_bucket_prefix = ?,\n maybe_public_bucket_extension = ?,\n\n maybe_migration_old_model_token = ?\n ",
"describe": {
"columns": [],
"parameters": {
@@ -8,5 +8,5 @@
},
"nullable": []
},
"hash": "6512f05410514927b52b8cc42f4eda0ad7a256254fd7fcf3b8a1cc429b06ad38"
"hash": "632305ab500cf892b98971e5b23af854112a66897766c890631dd5d0105cb065"
}
@@ -0,0 +1,102 @@
{
"db_name": "MySQL",
"query": "\n SELECT\n b2.token as `token: tokens::tokens::user_bookmarks::UserBookmarkToken`,\n\n b2.entity_type as `entity_type: enums::by_table::user_bookmarks::user_bookmark_entity_type::UserBookmarkEntityType`,\n b2.entity_token,\n\n b2.user_token as `user_token: tokens::tokens::users::UserToken`,\n\n es.bookmark_count as unused_bookmark_count,\n\n b2.created_at,\n b2.updated_at,\n b2.deleted_at\n\n FROM\n user_bookmarks AS b1\n\n JOIN user_bookmarks as b2\n ON b1.entity_type = b2.entity_type\n AND b1.entity_token = b2.entity_token\n\n LEFT OUTER JOIN entity_stats AS es\n ON b1.entity_type = es.entity_type\n AND b1.entity_token = es.entity_token\n\n WHERE\n b1.token = ?\n\n FOR UPDATE\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "token: tokens::tokens::user_bookmarks::UserBookmarkToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "entity_type: enums::by_table::user_bookmarks::user_bookmark_entity_type::UserBookmarkEntityType",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 2,
"name": "entity_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 3,
"name": "user_token: tokens::tokens::users::UserToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 4,
"name": "unused_bookmark_count",
"type_info": {
"type": "Long",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 5,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 6,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 7,
"name": "deleted_at",
"type_info": {
"type": "Timestamp",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
false,
false,
true,
false,
false,
true
]
},
"hash": "706f0fd898ec367a7e2851e51c4d00dc63c89521238e55281737758ac87cfb01"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\n INSERT INTO entity_stats SET\n entity_type = ?,\n entity_token = ?,\n ratings_positive_count = 1\n ON DUPLICATE KEY UPDATE\n ratings_positive_count = ratings_positive_count + 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "773047b78b08dd089d37a7f0d14cf5cce2ae580c4d6c673491f81144f9868ce3"
}
@@ -0,0 +1,102 @@
{
"db_name": "MySQL",
"query": "\n SELECT\n b.token as `token: tokens::tokens::user_bookmarks::UserBookmarkToken`,\n\n b.entity_type as `entity_type: enums::by_table::user_bookmarks::user_bookmark_entity_type::UserBookmarkEntityType`,\n b.entity_token,\n\n b.user_token as `user_token: tokens::tokens::users::UserToken`,\n\n es.bookmark_count as unused_bookmark_count,\n\n b.created_at,\n b.updated_at,\n b.deleted_at\n\n FROM\n user_bookmarks AS b\n\n LEFT OUTER JOIN entity_stats AS es\n ON b.entity_type = es.entity_type\n AND b.entity_token = es.entity_token\n WHERE\n b.entity_type = ?\n AND b.entity_token = ?\n FOR UPDATE\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "token: tokens::tokens::user_bookmarks::UserBookmarkToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "entity_type: enums::by_table::user_bookmarks::user_bookmark_entity_type::UserBookmarkEntityType",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 2,
"name": "entity_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 3,
"name": "user_token: tokens::tokens::users::UserToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 4,
"name": "unused_bookmark_count",
"type_info": {
"type": "Long",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 5,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 6,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 7,
"name": "deleted_at",
"type_info": {
"type": "Timestamp",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 2
},
"nullable": [
false,
false,
false,
false,
true,
false,
false,
true
]
},
"hash": "799a88505077c6c286906087ee79141dd4aaa1d68df764c9a43b315e561d7291"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\n INSERT INTO entity_stats SET\n entity_type = ?,\n entity_token = ?,\n ratings_positive_count = 0\n ON DUPLICATE KEY UPDATE\n ratings_positive_count = ABS(CAST(ratings_positive_count AS SIGNED) - 1)\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "9011676905b2a516fff4b43eb3692b973dede9b34a4876fda252510993720860"
}
@@ -0,0 +1,25 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n COUNT(*) as total_count\nFROM\n user_bookmarks\nWHERE\n entity_type = ?\n AND entity_token = ?\n AND deleted_at IS NULL\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "total_count",
"type_info": {
"type": "LongLong",
"flags": "NOT_NULL | BINARY",
"char_set": 63,
"max_size": 21
}
}
],
"parameters": {
"Right": 2
},
"nullable": [
false
]
},
"hash": "abcda1fc0b5a28166f3e15f2b3df96c5b6556d0ea3009d3f2bc9995bae95147e"
}
@@ -1,6 +1,6 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n m.token as `token: tokens::tokens::media_files::MediaFileToken`,\n\n m.media_type as `media_type: enums::by_table::media_files::media_file_type::MediaFileType`,\n\n users.token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n users.username as maybe_creator_username,\n users.display_name as maybe_creator_display_name,\n users.email_gravatar_hash as maybe_creator_gravatar_hash,\n\n m.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n\n model_weights.token as `maybe_model_weights_token: tokens::tokens::model_weights::ModelWeightToken`,\n model_weights.title as maybe_model_weights_title,\n model_weights.weights_type as `maybe_model_weights_type: enums::by_table::model_weights::weights_types::WeightsType`,\n model_weights.weights_category as `maybe_model_weights_category: enums::by_table::model_weights::weights_category::WeightsCategory`,\n\n cover_image.public_bucket_directory_hash as maybe_model_cover_image_public_bucket_hash,\n cover_image.maybe_public_bucket_prefix as maybe_model_cover_image_public_bucket_prefix,\n cover_image.maybe_public_bucket_extension as maybe_model_cover_image_public_bucket_extension,\n\n model_weight_creator.token as `maybe_model_weight_creator_user_token: tokens::tokens::users::UserToken`,\n model_weight_creator.username as maybe_model_weight_creator_username,\n model_weight_creator.display_name as maybe_model_weight_creator_display_name,\n model_weight_creator.email_gravatar_hash as maybe_model_weight_creator_gravatar_hash,\n\n m.public_bucket_directory_hash,\n m.maybe_public_bucket_prefix,\n m.maybe_public_bucket_extension,\n\n m.created_at,\n m.updated_at\n\nFROM media_files AS m\nLEFT OUTER JOIN users\n ON m.maybe_creator_user_token = users.token\nLEFT OUTER JOIN model_weights\n ON m.maybe_origin_model_token = model_weights.token\nLEFT OUTER JOIN media_files as cover_image\n ON cover_image.token = model_weights.maybe_cover_image_media_file_token\nLEFT OUTER JOIN users as model_weight_creator\n ON model_weight_creator.token = model_weights.creator_user_token\nWHERE\n m.token = ?\n ",
"query": "\nSELECT\n m.token as `token: tokens::tokens::media_files::MediaFileToken`,\n\n m.media_type as `media_type: enums::by_table::media_files::media_file_type::MediaFileType`,\n\n users.token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n users.username as maybe_creator_username,\n users.display_name as maybe_creator_display_name,\n users.email_gravatar_hash as maybe_creator_gravatar_hash,\n\n m.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n\n model_weights.token as `maybe_model_weights_token: tokens::tokens::model_weights::ModelWeightToken`,\n model_weights.title as maybe_model_weights_title,\n model_weights.weights_type as `maybe_model_weights_type: enums::by_table::model_weights::weights_types::WeightsType`,\n model_weights.weights_category as `maybe_model_weights_category: enums::by_table::model_weights::weights_category::WeightsCategory`,\n\n cover_image.public_bucket_directory_hash as maybe_model_cover_image_public_bucket_hash,\n cover_image.maybe_public_bucket_prefix as maybe_model_cover_image_public_bucket_prefix,\n cover_image.maybe_public_bucket_extension as maybe_model_cover_image_public_bucket_extension,\n\n model_weight_creator.token as `maybe_model_weight_creator_user_token: tokens::tokens::users::UserToken`,\n model_weight_creator.username as maybe_model_weight_creator_username,\n model_weight_creator.display_name as maybe_model_weight_creator_display_name,\n model_weight_creator.email_gravatar_hash as maybe_model_weight_creator_gravatar_hash,\n\n m.public_bucket_directory_hash,\n m.maybe_public_bucket_prefix,\n m.maybe_public_bucket_extension,\n\n entity_stats.ratings_positive_count as maybe_ratings_positive_count,\n entity_stats.ratings_negative_count as maybe_ratings_negative_count,\n entity_stats.bookmark_count as maybe_bookmark_count,\n\n m.created_at,\n m.updated_at\n\nFROM media_files AS m\nLEFT OUTER JOIN users\n ON m.maybe_creator_user_token = users.token\nLEFT OUTER JOIN model_weights\n ON m.maybe_origin_model_token = model_weights.token\nLEFT OUTER JOIN media_files as cover_image\n ON cover_image.token = model_weights.maybe_cover_image_media_file_token\nLEFT OUTER JOIN users as model_weight_creator\n ON model_weight_creator.token = model_weights.creator_user_token\nLEFT OUTER JOIN entity_stats\n ON entity_stats.entity_type = \"media_file\"\n AND entity_stats.entity_token = m.token\nWHERE\n m.token = ?\n ",
"describe": {
"columns": [
{
@@ -215,6 +215,36 @@
},
{
"ordinal": 21,
"name": "maybe_ratings_positive_count",
"type_info": {
"type": "Long",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 22,
"name": "maybe_ratings_negative_count",
"type_info": {
"type": "Long",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 23,
"name": "maybe_bookmark_count",
"type_info": {
"type": "Long",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 24,
"name": "created_at",
"type_info": {
"type": "Timestamp",
@@ -224,7 +254,7 @@
}
},
{
"ordinal": 22,
"ordinal": 25,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
@@ -259,9 +289,12 @@
false,
true,
true,
true,
true,
true,
false,
false
]
},
"hash": "5126434fe542604233d8c8a4f553998d8e71b4957989a9a856ebaf7fb52bab42"
"hash": "c2de3b6de37dbbb5b6afd91af08aae2739cda97ef8ebb8f9b4ee967969ce43be"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO model_weights\nSET\n token = ?,\n weights_type = ?,\n weights_category = ?,\n title = ?,\n maybe_cover_image_media_file_token = NULL,\n maybe_description_markdown = ?,\n maybe_description_rendered_html = ?,\n creator_user_token = ?,\n creator_ip_address = ?,\n\n creator_set_visibility = ?,\n maybe_last_update_user_token = NULL,\n original_download_url = ?,\n original_filename = ?,\n file_size_bytes = ?,\n file_checksum_sha2 = ?,\n\n public_bucket_hash = ?,\n maybe_public_bucket_prefix = ?,\n maybe_public_bucket_extension = ?,\n\n maybe_migration_old_model_token = ?,\n version = ?,\n created_at = ?,\n updated_at = ?,\n user_deleted_at = ?,\n mod_deleted_at = ?\n\nON DUPLICATE KEY UPDATE\n weights_type = ?,\n weights_category = ?,\n title = ?,\n maybe_cover_image_media_file_token = NULL,\n maybe_description_markdown = ?,\n maybe_description_rendered_html = ?,\n creator_user_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n maybe_last_update_user_token = NULL,\n original_download_url = ?,\n original_filename = ?,\n file_size_bytes = ?,\n file_checksum_sha2 = ?,\n public_bucket_hash = ?,\n maybe_public_bucket_prefix = ?,\n maybe_public_bucket_extension = ?,\n maybe_migration_old_model_token = ?,\n version = ?,\n created_at = ?,\n updated_at = ?,\n user_deleted_at = ?,\n mod_deleted_at = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 43
},
"nullable": []
},
"hash": "d8b255de4b16f95454c34e793c7a52726de90c2af490b17c415d7e92c00d9123"
}
@@ -1,12 +1,12 @@
{
"db_name": "MySQL",
"query": "\n INSERT INTO model_weights\n SET\n token = ?,\n weights_type = ?,\n weights_category = ?,\n title = ?,\n maybe_description_markdown = ?,\n maybe_description_rendered_html = ?,\n creator_user_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n maybe_last_update_user_token = ?,\n original_download_url = ?,\n original_filename = ?,\n file_size_bytes = ?,\n file_checksum_sha2 = ?,\n public_bucket_hash = ?,\n maybe_public_bucket_prefix = ?,\n maybe_public_bucket_extension = ?,\n cached_user_ratings_total_count = ?,\n cached_user_ratings_positive_count = ?,\n cached_user_ratings_negative_count = ?,\n maybe_cached_user_ratings_ratio = ?,\n version = ?\n ",
"query": "\n INSERT INTO model_weights\n SET\n token = ?,\n weights_type = ?,\n weights_category = ?,\n title = ?,\n maybe_description_markdown = ?,\n maybe_description_rendered_html = ?,\n creator_user_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n maybe_last_update_user_token = ?,\n original_download_url = ?,\n original_filename = ?,\n file_size_bytes = ?,\n file_checksum_sha2 = ?,\n public_bucket_hash = ?,\n maybe_public_bucket_prefix = ?,\n maybe_public_bucket_extension = ?,\n version = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 22
"Right": 18
},
"nullable": []
},
"hash": "a18c5b1418d71fa9aefd3ae5c440be2afc1f9467808aa66d3b850a4d54c81e4d"
"hash": "db59a239bac6f5ceaad4396dfe6c2c933a7189dbf8da5f555b94148db1b0667f"
}
@@ -1,6 +1,6 @@
{
"db_name": "MySQL",
"query": "\n SELECT\n wt.token as `token: tokens::tokens::model_weights::ModelWeightToken`,\n wt.title,\n wt.weights_type as `weights_type: enums::by_table::model_weights::weights_types::WeightsType`,\n wt.weights_category as `weights_category: enums::by_table::model_weights::weights_category::WeightsCategory`,\n wt.maybe_description_markdown,\n wt.maybe_description_rendered_html,\n\n wt.creator_user_token as `creator_user_token: tokens::tokens::users::UserToken`,\n users.username as creator_username,\n users.display_name as creator_display_name,\n users.email_gravatar_hash AS creator_gravatar_hash,\n\n wt.creator_ip_address,\n wt.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n wt.maybe_last_update_user_token as `maybe_last_update_user_token: tokens::tokens::users::UserToken`,\n wt.original_download_url,\n wt.original_filename,\n wt.file_size_bytes,\n wt.file_checksum_sha2,\n\n wt.public_bucket_hash,\n wt.maybe_public_bucket_prefix,\n wt.maybe_public_bucket_extension,\n\n cover_image.public_bucket_directory_hash as maybe_cover_image_public_bucket_hash,\n cover_image.maybe_public_bucket_prefix as maybe_cover_image_public_bucket_prefix,\n cover_image.maybe_public_bucket_extension as maybe_cover_image_public_bucket_extension,\n\n wt.cached_user_ratings_negative_count,\n wt.cached_user_ratings_positive_count,\n wt.cached_user_ratings_total_count,\n wt.maybe_cached_user_ratings_ratio,\n wt.cached_user_ratings_last_updated_at,\n wt.version,\n wt.created_at,\n wt.updated_at,\n wt.user_deleted_at,\n wt.mod_deleted_at\n FROM model_weights as wt\n JOIN users\n ON users.token = wt.creator_user_token\n LEFT OUTER JOIN media_files as cover_image\n ON cover_image.token = wt.maybe_cover_image_media_file_token\n WHERE\n wt.token = ?\n ",
"query": "\n SELECT\n wt.token as `token: tokens::tokens::model_weights::ModelWeightToken`,\n wt.title,\n wt.weights_type as `weights_type: enums::by_table::model_weights::weights_types::WeightsType`,\n wt.weights_category as `weights_category: enums::by_table::model_weights::weights_category::WeightsCategory`,\n wt.maybe_description_markdown,\n wt.maybe_description_rendered_html,\n\n wt.creator_user_token as `creator_user_token: tokens::tokens::users::UserToken`,\n users.username as creator_username,\n users.display_name as creator_display_name,\n users.email_gravatar_hash AS creator_gravatar_hash,\n\n wt.creator_ip_address,\n wt.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n wt.maybe_last_update_user_token as `maybe_last_update_user_token: tokens::tokens::users::UserToken`,\n wt.original_download_url,\n wt.original_filename,\n wt.file_size_bytes,\n wt.file_checksum_sha2,\n\n wt.public_bucket_hash,\n wt.maybe_public_bucket_prefix,\n wt.maybe_public_bucket_extension,\n\n cover_image.public_bucket_directory_hash as maybe_cover_image_public_bucket_hash,\n cover_image.maybe_public_bucket_prefix as maybe_cover_image_public_bucket_prefix,\n cover_image.maybe_public_bucket_extension as maybe_cover_image_public_bucket_extension,\n\n entity_stats.ratings_positive_count as maybe_ratings_positive_count,\n entity_stats.ratings_negative_count as maybe_ratings_negative_count,\n entity_stats.bookmark_count as maybe_bookmark_count,\n\n wt.version,\n wt.created_at,\n wt.updated_at,\n wt.user_deleted_at,\n wt.mod_deleted_at\n FROM model_weights as wt\n JOIN users\n ON users.token = wt.creator_user_token\n LEFT OUTER JOIN media_files as cover_image\n ON cover_image.token = wt.maybe_cover_image_media_file_token\n LEFT OUTER JOIN entity_stats\n ON entity_stats.entity_type = \"model_weight\"\n AND entity_stats.entity_token = wt.token\n WHERE\n wt.token = ?\n ",
"describe": {
"columns": [
{
@@ -235,56 +235,36 @@
},
{
"ordinal": 23,
"name": "cached_user_ratings_negative_count",
"name": "maybe_ratings_positive_count",
"type_info": {
"type": "Long",
"flags": "NOT_NULL | UNSIGNED",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 24,
"name": "cached_user_ratings_positive_count",
"name": "maybe_ratings_negative_count",
"type_info": {
"type": "Long",
"flags": "NOT_NULL | UNSIGNED",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 25,
"name": "cached_user_ratings_total_count",
"name": "maybe_bookmark_count",
"type_info": {
"type": "Long",
"flags": "NOT_NULL | UNSIGNED",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 26,
"name": "maybe_cached_user_ratings_ratio",
"type_info": {
"type": "Float",
"flags": "",
"char_set": 63,
"max_size": 12
}
},
{
"ordinal": 27,
"name": "cached_user_ratings_last_updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 28,
"name": "version",
"type_info": {
"type": "Long",
@@ -294,7 +274,7 @@
}
},
{
"ordinal": 29,
"ordinal": 27,
"name": "created_at",
"type_info": {
"type": "Timestamp",
@@ -304,7 +284,7 @@
}
},
{
"ordinal": 30,
"ordinal": 28,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
@@ -314,7 +294,7 @@
}
},
{
"ordinal": 31,
"ordinal": 29,
"name": "user_deleted_at",
"type_info": {
"type": "Timestamp",
@@ -324,7 +304,7 @@
}
},
{
"ordinal": 32,
"ordinal": 30,
"name": "mod_deleted_at",
"type_info": {
"type": "Timestamp",
@@ -361,11 +341,9 @@
true,
true,
true,
false,
false,
false,
true,
false,
true,
true,
false,
false,
false,
@@ -373,5 +351,5 @@
true
]
},
"hash": "7d3806f46b5cc96c0e3df22454190834c0294ad34db2d8271f2e2863a3cca3a1"
"hash": "e32645b06d20a0037c3ca3d514b56af2dba8396f11a4c2a93ee4fab9b4579fc3"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\n INSERT INTO entity_stats SET\n entity_type = ?,\n entity_token = ?,\n bookmark_count = 0\n ON DUPLICATE KEY UPDATE\n bookmark_count = ABS(CAST(bookmark_count AS SIGNED) - 1)\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "e3bbd9cb8a0b8fdb74fcb809ea63709740a04ab936e47f5641af0eaf3e0fd339"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\n INSERT INTO entity_stats SET\n entity_type = ?,\n entity_token = ?,\n ratings_negative_count = 0\n ON DUPLICATE KEY UPDATE\n ratings_negative_count = ABS(CAST(ratings_negative_count AS SIGNED) - 1)\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "e67894beb8e747e0f8c301e806d9fa62e685f23e2c581a07235568dd1a63f519"
}
@@ -0,0 +1,25 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n COUNT(*) as positive_count\nFROM\n user_ratings\nWHERE\n entity_type = ?\n AND entity_token = ?\n AND rating_value = 'positive'\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "positive_count",
"type_info": {
"type": "LongLong",
"flags": "NOT_NULL | BINARY",
"char_set": 63,
"max_size": 21
}
}
],
"parameters": {
"Right": 2
},
"nullable": [
false
]
},
"hash": "f9f52bf39daf43a8e6e9617282bf9bc83a62d53b69ab36a8429576c03d5c18d7"
}
@@ -0,0 +1,58 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n r.rating_value as `rating_value: enums::by_table::user_ratings::rating_value::UserRatingValue`,\n r.created_at,\n r.updated_at,\n\n es.ratings_positive_count as unused_ratings_positive_count\n\nFROM user_ratings AS r\n\nLEFT OUTER JOIN entity_stats AS es\n ON r.entity_type = es.entity_type\n AND r.entity_token = es.entity_token\n\nWHERE r.user_token = ?\n AND r.entity_type = ?\n AND r.entity_token = ?\n\nLIMIT 1\n\nFOR UPDATE\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "rating_value: enums::by_table::user_ratings::rating_value::UserRatingValue",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 32
}
},
{
"ordinal": 1,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 2,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 3,
"name": "unused_ratings_positive_count",
"type_info": {
"type": "Long",
"flags": "UNSIGNED",
"char_set": 63,
"max_size": 10
}
}
],
"parameters": {
"Right": 3
},
"nullable": [
false,
false,
false,
true
]
},
"hash": "fa724ca3644d7cba26e503c1a2c900bea00e10250c703019363fe9cf855a5a69"
}
Generated
+17
View File
@@ -3074,6 +3074,7 @@ dependencies = [
"my-workspace-hack",
"mysql_queries",
"once_cell",
"opentelemetry",
"r2d2_redis",
"rand 0.8.5",
"redis_common",
@@ -4161,6 +4162,22 @@ dependencies = [
"vcpkg",
]
[[package]]
name = "opentelemetry"
version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a"
dependencies = [
"futures-core",
"futures-sink",
"indexmap",
"js-sys",
"once_cell",
"pin-project-lite",
"thiserror",
"urlencoding",
]
[[package]]
name = "ordered-multimap"
version = "0.4.3"
+3 -1
View File
@@ -40,10 +40,12 @@ deny = [
"clippy::redundant_static_lifetimes", # Lint: feels more modern to elide static lifetimes
# Rust
"unused_parens", # Unused parens are ugly
"unused_imports", # These are easy to automatically cull
"unused_parens", # Unused parens are ugly
"unused_variables", # Don't leave cruft
#"unused_mut", # Be strict about mutability (TODO)
# Possible:
# "clippy::ptr_arg",
# "clippy::too_many_lines" (note: this is configurable)
@@ -0,0 +1,40 @@
{
"settings" : {
"index.number_of_shards" : 3,
"index.number_of_replicas" : 2
},
"mappings" : {
"properties" : {
"token" : { "type" : "keyword" },
"creator_set_visibility" : { "type" : "keyword" },
"weights_type" : { "type" : "keyword" },
"weights_category" : { "type" : "keyword" },
"title" : { "type" : "search_as_you_type" },
"maybe_cover_image_media_file_token" : { "type" : "keyword" },
"maybe_cover_image_public_bucket_hash" : { "type" : "keyword" },
"maybe_cover_image_public_bucket_prefix" : { "type" : "keyword" },
"maybe_cover_image_public_bucket_extension" : { "type" : "keyword" },
"creator_user_token" : { "type" : "keyword" },
"creator_username" : { "type" : "keyword" },
"creator_display_name" : { "type" : "text" },
"creator_gravatar_hash" : { "type" : "text" },
"ratings_positive_count" : { "type" : "unsigned_long" },
"ratings_negative_count" : { "type" : "unsigned_long" },
"bookmark_count" : { "type" : "unsigned_long" },
"maybe_ietf_language_tag" : { "type" : "keyword" },
"maybe_ietf_primary_language_subtag" : { "type" : "keyword" },
"created_at" : { "type" : "date" },
"updated_at" : { "type" : "date" },
"user_deleted_at" : { "type" : "date" },
"mod_deleted_at" : { "type" : "date" }
}
}
}
+1 -1
View File
@@ -32,7 +32,7 @@ where token IN (
from generic_download_jobs
where status IN ('started', 'attempt_failed', 'complete_failure', 'dead')
and download_type NOT IN ('vits', 'hifigan')
and created_at > NOW() - INTERVAL 30 DAY
and created_at > NOW() - INTERVAL 120 DAY
) as x
);
@@ -0,0 +1,24 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Summary stats on downloads
select
distinct download_type,
count(*) as created
from generic_download_jobs
where created_at > (CURDATE() - INTERVAL 60 DAY)
group by download_type;
-- Find recent failed RVC downloads
select
token,
title,
download_url,
status,
assigned_worker
from generic_download_jobs
where download_type = 'rvc_v2'
and status IN ('started', 'attempt_failed', 'dead')
and created_at > (CURDATE() - INTERVAL 12 HOUR)
order by updated_at desc;
@@ -1,10 +0,0 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
select
distinct download_type,
count(*) as created
from generic_download_jobs
where created_at > (CURDATE() - INTERVAL 60 DAY)
group by download_type;
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE model_weights_extension_tts_details DROP COLUMN text_pipeline_type;
@@ -0,0 +1,7 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE model_weights_extension_tts_details
ADD COLUMN text_pipeline_type VARCHAR(64) DEFAULT NULL
AFTER ietf_primary_language_subtag;
+7 -2
View File
@@ -26,7 +26,7 @@ CREATE TABLE media_files (
-- * 'device_api' for direct user uploads recorded using Browser/Device APIs.
origin_category VARCHAR(16) NOT NULL,
-- TODO: Remove default value once records backfilled and queries updated.
-- TODO(bt,2024-01-12): Rename to origin_product.
-- Product area where the media file originated.
-- This is not the *model* that created the thing, this is the *product*.
-- (The underlying models can change over time.)
@@ -37,8 +37,13 @@ CREATE TABLE media_files (
-- "Voice Designer" dataset samples in a video generation flow.)
--
-- Possible values:
-- * 'unknown' for legacy records without an associated product
-- * 'face_animator' for uploads and outputs
-- * 'unknown' for legacy records without an associated product (TODO: This should be temporary)
-- * 'tts' for text to speech outputs
-- * 'voice_conversion' for uploads or outputs (RVC or SVC)
-- * 'zs_voice' for uploads or outputs for zero shot voice products
-- * 'video_filter' filters on videos
-- * 'mocap' for files uploaded or processed by motion capture
origin_product_category VARCHAR(16) NOT NULL DEFAULT "unknown",
-- For inference that can be tied back to a model, the type of model.
@@ -28,7 +28,7 @@ CREATE TABLE model_weights_extension_tts_details (
-- live in the `storyteller-ml` repository.
-- Older models and brand new models will have this field set to null, and we'll infer which value to
-- lazily backfill based on the creation date and language setting.
-- tts_text_pipeline_type VARCHAR(64) DEFAULT NULL,
text_pipeline_type VARCHAR(64) DEFAULT NULL,
-- If true, multiply the mel outputs before being vocoded by a globally default constant.
use_default_mel_multiply_factor BOOLEAN NOT NULL DEFAULT FALSE,
+2 -1
View File
@@ -5,7 +5,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
@@ -28,6 +28,9 @@ pub enum InferenceCategory {
#[serde(rename = "video_filter")]
VideoFilter,
#[serde(rename = "mocap")]
Mocap,
}
// TODO(bt, 2022-12-21): This desperately needs MySQL integration tests!
@@ -42,6 +45,7 @@ impl InferenceCategory {
Self::TextToSpeech => "text_to_speech",
Self::VoiceConversion => "voice_conversion",
Self::VideoFilter => "video_filter",
Self::Mocap => "mocap",
}
}
@@ -51,6 +55,7 @@ impl InferenceCategory {
"text_to_speech" => Ok(Self::TextToSpeech),
"voice_conversion" => Ok(Self::VoiceConversion),
"video_filter" => Ok(Self::VideoFilter),
"mocap" => Ok(Self::Mocap),
_ => Err(format!("invalid value: {:?}", value)),
}
}
@@ -63,6 +68,7 @@ impl InferenceCategory {
Self::TextToSpeech,
Self::VoiceConversion,
Self::VideoFilter,
Self::Mocap,
])
}
}
@@ -78,6 +84,7 @@ mod tests {
assert_serialization(InferenceCategory::TextToSpeech, "text_to_speech");
assert_serialization(InferenceCategory::VoiceConversion, "voice_conversion");
assert_serialization(InferenceCategory::VideoFilter, "video_filter");
assert_serialization(InferenceCategory::Mocap, "mocap")
}
#[test]
@@ -86,6 +93,7 @@ mod tests {
assert_eq!(InferenceCategory::TextToSpeech.to_str(), "text_to_speech");
assert_eq!(InferenceCategory::VoiceConversion.to_str(), "voice_conversion");
assert_eq!(InferenceCategory::VideoFilter.to_str(), "video_filter");
assert_eq!(InferenceCategory::Mocap.to_str(), "mocap");
}
#[test]
@@ -94,17 +102,19 @@ mod tests {
assert_eq!(InferenceCategory::from_str("text_to_speech").unwrap(), InferenceCategory::TextToSpeech);
assert_eq!(InferenceCategory::from_str("voice_conversion").unwrap(), InferenceCategory::VoiceConversion);
assert_eq!(InferenceCategory::from_str("video_filter").unwrap(), InferenceCategory::VideoFilter);
assert_eq!(InferenceCategory::from_str("mocap").unwrap(), InferenceCategory::Mocap);
}
#[test]
fn all_variants() {
// Static check
let mut variants = InferenceCategory::all_variants();
assert_eq!(variants.len(), 4);
assert_eq!(variants.len(), 5);
assert_eq!(variants.pop_first(), Some(InferenceCategory::LipsyncAnimation));
assert_eq!(variants.pop_first(), Some(InferenceCategory::TextToSpeech));
assert_eq!(variants.pop_first(), Some(InferenceCategory::VoiceConversion));
assert_eq!(variants.pop_first(), Some(InferenceCategory::VideoFilter));
assert_eq!(variants.pop_first(), Some(InferenceCategory::Mocap));
assert_eq!(variants.pop_first(), None);
// Generated check
@@ -33,6 +33,8 @@ pub enum InferenceModelType {
VallEX,
#[serde(rename = "rerender_a_video")]
RerenderAVideo,
#[serde(rename = "mocap_net")]
MocapNet,
}
// TODO(bt, 2022-12-21): This desperately needs MySQL integration tests!
@@ -50,6 +52,7 @@ impl InferenceModelType {
Self::Vits => "vits",
Self::VallEX => "vall_e_x",
Self::RerenderAVideo => "rerender_a_video",
Self::MocapNet => "mocap_net",
}
}
@@ -62,6 +65,7 @@ impl InferenceModelType {
"vits" => Ok(Self::Vits),
"vall_e_x" => Ok(Self::VallEX),
"rerender_a_video" => Ok(Self::RerenderAVideo),
"mocap_net" => Ok(Self::MocapNet),
_ => Err(format!("invalid value: {:?}", value)),
}
}
@@ -76,7 +80,8 @@ impl InferenceModelType {
InferenceModelType::Tacotron2,
InferenceModelType::Vits,
InferenceModelType::VallEX,
InferenceModelType::RerenderAVideo
InferenceModelType::RerenderAVideo,
InferenceModelType::MocapNet,
])
}
}
@@ -95,6 +100,7 @@ mod tests {
assert_serialization(InferenceModelType::Vits, "vits");
assert_serialization(InferenceModelType::VallEX, "vall_e_x");
assert_serialization(InferenceModelType::RerenderAVideo, "rerender_a_video");
assert_serialization(InferenceModelType::MocapNet, "mocap_net");
}
#[test]
@@ -106,6 +112,7 @@ mod tests {
assert_eq!(InferenceModelType::Vits.to_str(), "vits");
assert_eq!(InferenceModelType::VallEX.to_str(), "vall_e_x");
assert_eq!(InferenceModelType::RerenderAVideo.to_str(), "rerender_a_video");
assert_eq!(InferenceModelType::MocapNet.to_str(), "mocap_net");
}
#[test]
@@ -117,13 +124,14 @@ mod tests {
assert_eq!(InferenceModelType::from_str("vits").unwrap(), InferenceModelType::Vits);
assert_eq!(InferenceModelType::from_str("vall_e_x").unwrap(), InferenceModelType::VallEX);
assert_eq!(InferenceModelType::from_str("rerender_a_video").unwrap(), InferenceModelType::RerenderAVideo);
assert_eq!(InferenceModelType::from_str("mocap_net").unwrap(), InferenceModelType::MocapNet);
}
#[test]
fn all_variants() {
// Static check
let mut variants = InferenceModelType::all_variants();
assert_eq!(variants.len(), 7);
assert_eq!(variants.len(), 8);
assert_eq!(variants.pop_first(), Some(InferenceModelType::RvcV2));
assert_eq!(variants.pop_first(), Some(InferenceModelType::SadTalker));
assert_eq!(variants.pop_first(), Some(InferenceModelType::SoVitsSvc));
@@ -131,6 +139,7 @@ mod tests {
assert_eq!(variants.pop_first(), Some(InferenceModelType::Vits));
assert_eq!(variants.pop_first(), Some(InferenceModelType::VallEX));
assert_eq!(variants.pop_first(), Some(InferenceModelType::RerenderAVideo));
assert_eq!(variants.pop_first(), Some(InferenceModelType::MocapNet));
assert_eq!(variants.pop_first(), None);
// Generated check
@@ -25,6 +25,10 @@ pub enum IdCategory {
#[serde(rename = "video_filter")]
VideoFilterResult,
// Results from mocap
#[serde(rename = "mocap")]
MocapResult,
/// Results from tacotron2
/// Applies for RVC and SVC
#[serde(rename = "tts_result")]
@@ -73,6 +77,7 @@ impl IdCategory {
Self::VideoFilterResult => "video_filter",
Self::ModelWeights => "model_weights",
Self::FileUpload => "file_upload",
Self::MocapResult => "mocap",
}
}
@@ -88,6 +93,7 @@ impl IdCategory {
"video_filter" => Ok(Self::VideoFilterResult),
"model_weights" => Ok(Self::ModelWeights),
"file_upload" => Ok(Self::FileUpload),
"mocap" => Ok(Self::MocapResult),
_ => Err(format!("invalid value: {:?}", value)),
}
}
@@ -106,6 +112,7 @@ impl IdCategory {
Self::ZeroShotVoiceEmbedding,
Self::ModelWeights,
Self::FileUpload,
Self::MocapResult,
])
}
}
@@ -130,6 +137,7 @@ mod tests {
assert_serialization(IdCategory::ZeroShotTtsResult, "zs_tts_result");
assert_serialization(IdCategory::ModelWeights, "model_weights");
assert_serialization(IdCategory::FileUpload, "file_upload");
assert_serialization(IdCategory::MocapResult, "mocap");
}
#[test]
@@ -144,6 +152,7 @@ mod tests {
assert_eq!(IdCategory::ZeroShotTtsResult.to_str(), "zs_tts_result");
assert_eq!(IdCategory::ModelWeights.to_str(), "model_weights");
assert_eq!(IdCategory::FileUpload.to_str(), "file_upload");
assert_eq!(IdCategory::MocapResult.to_str(), "mocap");
}
#[test]
@@ -158,16 +167,18 @@ mod tests {
assert_eq!(IdCategory::from_str("zs_tts_result").unwrap(), IdCategory::ZeroShotTtsResult);
assert_eq!(IdCategory::from_str("model_weights").unwrap(), IdCategory::ModelWeights);
assert_eq!(IdCategory::from_str("file_upload").unwrap(), IdCategory::FileUpload);
assert_eq!(IdCategory::from_str("mocap").unwrap(), IdCategory::MocapResult);
}
#[test]
fn all_variants() {
// Static check
let mut variants = IdCategory::all_variants();
assert_eq!(variants.len(), 10);
assert_eq!(variants.len(), 11);
assert_eq!(variants.pop_first(), Some(IdCategory::MediaFile));
assert_eq!(variants.pop_first(), Some(IdCategory::LipsyncAnimationResult));
assert_eq!(variants.pop_first(), Some(IdCategory::VideoFilterResult));
assert_eq!(variants.pop_first(), Some(IdCategory::MocapResult));
assert_eq!(variants.pop_first(), Some(IdCategory::TtsResult));
assert_eq!(variants.pop_first(), Some(IdCategory::VoiceConversionResult));
assert_eq!(variants.pop_first(), Some(IdCategory::ZeroShotTtsResult));
@@ -20,6 +20,7 @@ pub enum MediaFileOriginModelType {
RvcV2,
/// SadTalker -- v1, we may add another enum value for future versions
#[serde(rename = "sad_talker")]
SadTalker,
/// so-vits-svc voice conversion models
@@ -34,6 +35,9 @@ pub enum MediaFileOriginModelType {
#[serde(rename = "rerender")]
Rerender,
#[serde(rename = "mocap_net")]
MocapNet,
}
// TODO(bt, 2022-12-21): This desperately needs MySQL integration tests!
@@ -51,6 +55,7 @@ impl MediaFileOriginModelType {
Self::Tacotron2 => "tacotron2",
Self::VallEX => "vall_e_x",
Self::Rerender => "rerender",
Self::MocapNet => "mocap_net",
}
}
@@ -62,6 +67,7 @@ impl MediaFileOriginModelType {
"tacotron2" => Ok(Self::Tacotron2),
"vall_e_x" => Ok(Self::VallEX),
"rerender" => Ok(Self::Rerender),
"mocap_net" => Ok(Self::MocapNet),
_ => Err(format!("invalid value: {:?}", value)),
}
}
@@ -76,6 +82,7 @@ impl MediaFileOriginModelType {
Self::Tacotron2,
Self::VallEX,
Self::Rerender,
Self::MocapNet,
])
}
}
@@ -101,6 +108,7 @@ mod tests {
assert_eq!(MediaFileOriginModelType::Tacotron2.to_str(), "tacotron2");
assert_eq!(MediaFileOriginModelType::VallEX.to_str(), "vall_e_x");
assert_eq!(MediaFileOriginModelType::Rerender.to_str(), "rerender");
assert_eq!(MediaFileOriginModelType::MocapNet.to_str(), "mocap_net");
}
#[test]
@@ -111,19 +119,21 @@ mod tests {
assert_eq!(MediaFileOriginModelType::from_str("tacotron2").unwrap(), MediaFileOriginModelType::Tacotron2);
assert_eq!(MediaFileOriginModelType::from_str("vall_e_x").unwrap(), MediaFileOriginModelType::VallEX);
assert_eq!(MediaFileOriginModelType::from_str("rerender").unwrap(), MediaFileOriginModelType::Rerender);
assert_eq!(MediaFileOriginModelType::from_str("mocap_net").unwrap(), MediaFileOriginModelType::MocapNet);
assert!(MediaFileOriginModelType::from_str("foo").is_err());
}
#[test]
fn all_variants() {
let mut variants = MediaFileOriginModelType::all_variants();
assert_eq!(variants.len(), 6);
assert_eq!(variants.len(), 7);
assert_eq!(variants.pop_first(), Some(MediaFileOriginModelType::RvcV2));
assert_eq!(variants.pop_first(), Some(MediaFileOriginModelType::SadTalker));
assert_eq!(variants.pop_first(), Some(MediaFileOriginModelType::SoVitsSvc));
assert_eq!(variants.pop_first(), Some(MediaFileOriginModelType::Tacotron2));
assert_eq!(variants.pop_first(), Some(MediaFileOriginModelType::VallEX));
assert_eq!(variants.pop_first(), Some(MediaFileOriginModelType::Rerender));
assert_eq!(variants.pop_first(), Some(MediaFileOriginModelType::MocapNet));
assert_eq!(variants.pop_first(), None);
}
}
@@ -17,6 +17,11 @@ use utoipa::ToSchema;
#[cfg_attr(test, derive(EnumIter, EnumCount))]
#[derive(Clone, Copy, Eq, PartialEq, Hash, Ord, PartialOrd, Deserialize, Serialize, ToSchema)]
pub enum MediaFileOriginProductCategory {
/// Unknown which product is attached to the file (generated the file, the file was
/// uploaded on behalf of, etc.)
#[serde(rename = "unknown")]
Unknown,
/// Media files created by (or uploaded for) the Face Animator product.
/// The underlying model could be SadTalker, Wav2Lip, or some future model
#[serde(rename = "face_animator")]
@@ -26,12 +31,6 @@ pub enum MediaFileOriginProductCategory {
#[serde(rename = "tts")]
TextToSpeech,
// TODO: This should be a temporary category until we migrate the DB to remove this default value
/// Unknown which product is attached to the file (generated the file, the file was
/// uploaded on behalf of, etc.)
#[serde(rename = "unknown")]
Unknown,
/// Voice conversion (either RVC or SVC)
#[serde(rename = "voice_conversion")]
VoiceConversion,
@@ -43,6 +42,10 @@ pub enum MediaFileOriginProductCategory {
// Media files for video filters
#[serde(rename = "video_filter")]
VideoFilter,
// Mocap
#[serde(rename = "mocap")]
Mocap,
}
// TODO(bt, 2022-12-21): This desperately needs MySQL integration tests!
@@ -54,23 +57,25 @@ impl_mysql_from_row!(MediaFileOriginProductCategory);
impl MediaFileOriginProductCategory {
pub fn to_str(&self) -> &'static str {
match self {
Self::Unknown => "unknown",
Self::FaceAnimator => "face_animator",
Self::TextToSpeech => "tts",
Self::Unknown => "unknown",
Self::VoiceConversion => "voice_conversion",
Self::ZeroShotVoice => "zs_voice",
Self::VideoFilter => "video_filter",
Self::Mocap => "mocap",
}
}
pub fn from_str(value: &str) -> Result<Self, String> {
match value {
"unknown" => Ok(Self::Unknown),
"face_animator" => Ok(Self::FaceAnimator),
"tts" => Ok(Self::TextToSpeech),
"unknown" => Ok(Self::Unknown),
"voice_conversion" => Ok(Self::VoiceConversion),
"zs_voice" => Ok(Self::ZeroShotVoice),
"video_filter" => Ok(Self::VideoFilter),
"mocap" => Ok(Self::Mocap),
_ => Err(format!("invalid value: {:?}", value)),
}
}
@@ -79,12 +84,13 @@ impl MediaFileOriginProductCategory {
// NB: BTreeSet is sorted
// NB: BTreeSet::from() isn't const, but not worth using LazyStatic, etc.
BTreeSet::from([
Self::Unknown,
Self::FaceAnimator,
Self::TextToSpeech,
Self::VideoFilter,
Self::Unknown,
Self::VoiceConversion,
Self::ZeroShotVoice,
Self::Mocap,
])
}
}
@@ -99,44 +105,48 @@ mod tests {
#[test]
fn test_serialization() {
assert_serialization(MediaFileOriginProductCategory::Unknown, "unknown");
assert_serialization(MediaFileOriginProductCategory::FaceAnimator, "face_animator");
assert_serialization(MediaFileOriginProductCategory::TextToSpeech, "tts");
assert_serialization(MediaFileOriginProductCategory::Unknown, "unknown");
assert_serialization(MediaFileOriginProductCategory::VoiceConversion, "voice_conversion");
assert_serialization(MediaFileOriginProductCategory::ZeroShotVoice, "zs_voice");
assert_serialization(MediaFileOriginProductCategory::VideoFilter, "video_filter")
assert_serialization(MediaFileOriginProductCategory::VideoFilter, "video_filter");
assert_serialization(MediaFileOriginProductCategory::Mocap, "mocap")
}
#[test]
fn to_str() {
assert_eq!(MediaFileOriginProductCategory::Unknown.to_str(), "unknown");
assert_eq!(MediaFileOriginProductCategory::FaceAnimator.to_str(), "face_animator");
assert_eq!(MediaFileOriginProductCategory::TextToSpeech.to_str(), "tts");
assert_eq!(MediaFileOriginProductCategory::Unknown.to_str(), "unknown");
assert_eq!(MediaFileOriginProductCategory::VoiceConversion.to_str(), "voice_conversion");
assert_eq!(MediaFileOriginProductCategory::ZeroShotVoice.to_str(), "zs_voice");
assert_eq!(MediaFileOriginProductCategory::VideoFilter.to_str(), "video_filter");
assert_eq!(MediaFileOriginProductCategory::Mocap.to_str(), "mocap");
}
#[test]
fn from_str() {
assert_eq!(MediaFileOriginProductCategory::from_str("unknown").unwrap(), MediaFileOriginProductCategory::Unknown);
assert_eq!(MediaFileOriginProductCategory::from_str("face_animator").unwrap(), MediaFileOriginProductCategory::FaceAnimator);
assert_eq!(MediaFileOriginProductCategory::from_str("tts").unwrap(), MediaFileOriginProductCategory::TextToSpeech);
assert_eq!(MediaFileOriginProductCategory::from_str("unknown").unwrap(), MediaFileOriginProductCategory::Unknown);
assert_eq!(MediaFileOriginProductCategory::from_str("voice_conversion").unwrap(), MediaFileOriginProductCategory::VoiceConversion);
assert_eq!(MediaFileOriginProductCategory::from_str("zs_voice").unwrap(), MediaFileOriginProductCategory::ZeroShotVoice);
assert_eq!(MediaFileOriginProductCategory::from_str("video_filter").unwrap(), MediaFileOriginProductCategory::VideoFilter);
assert_eq!(MediaFileOriginProductCategory::from_str("mocap").unwrap(), MediaFileOriginProductCategory::Mocap);
}
#[test]
fn all_variants() {
let mut variants = MediaFileOriginProductCategory::all_variants();
assert_eq!(variants.len(), 6);
assert_eq!(variants.len(), 7);
assert_eq!(variants.pop_first(), Some(MediaFileOriginProductCategory::Unknown));
assert_eq!(variants.pop_first(), Some(MediaFileOriginProductCategory::FaceAnimator));
assert_eq!(variants.pop_first(), Some(MediaFileOriginProductCategory::TextToSpeech));
assert_eq!(variants.pop_first(), Some(MediaFileOriginProductCategory::Unknown));
assert_eq!(variants.pop_first(), Some(MediaFileOriginProductCategory::VoiceConversion));
assert_eq!(variants.pop_first(), Some(MediaFileOriginProductCategory::ZeroShotVoice));
assert_eq!(variants.pop_first(), Some(MediaFileOriginProductCategory::VideoFilter));
assert_eq!(variants.pop_first(), Some(MediaFileOriginProductCategory::Mocap));
assert_eq!(variants.pop_first(), None);
}
}
@@ -21,6 +21,9 @@ pub enum MediaFileType {
/// Video files: mp4, etc.
Video,
/// Mocap files: BVH, etc.
Mocap,
}
// TODO(bt, 2022-12-21): This desperately needs MySQL integration tests!
@@ -35,6 +38,7 @@ impl MediaFileType {
Self::Audio => "audio",
Self::Image => "image",
Self::Video => "video",
Self::Mocap => "mocap",
}
}
@@ -43,6 +47,7 @@ impl MediaFileType {
"audio" => Ok(Self::Audio),
"image" => Ok(Self::Image),
"video" => Ok(Self::Video),
"mocap" => Ok(Self::Mocap),
_ => Err(format!("invalid value: {:?}", value)),
}
}
@@ -54,6 +59,7 @@ impl MediaFileType {
Self::Audio,
Self::Image,
Self::Video,
Self::Mocap,
])
}
}
@@ -71,6 +77,7 @@ mod tests {
assert_serialization(MediaFileType::Audio, "audio");
assert_serialization(MediaFileType::Image, "image");
assert_serialization(MediaFileType::Video, "video");
assert_serialization(MediaFileType::Mocap, "mocap");
}
}
@@ -82,6 +89,7 @@ mod tests {
assert_eq!(MediaFileType::Audio.to_str(), "audio");
assert_eq!(MediaFileType::Image.to_str(), "image");
assert_eq!(MediaFileType::Video.to_str(), "video");
assert_eq!(MediaFileType::Mocap.to_str(), "mocap");
}
#[test]
@@ -89,6 +97,7 @@ mod tests {
assert_eq!(MediaFileType::from_str("audio").unwrap(), MediaFileType::Audio);
assert_eq!(MediaFileType::from_str("image").unwrap(), MediaFileType::Image);
assert_eq!(MediaFileType::from_str("video").unwrap(), MediaFileType::Video);
assert_eq!(MediaFileType::from_str("mocap").unwrap(), MediaFileType::Mocap);
assert!(MediaFileType::from_str("foo").is_err());
}
}
@@ -99,10 +108,11 @@ mod tests {
#[test]
fn all_variants() {
let mut variants = MediaFileType::all_variants();
assert_eq!(variants.len(), 3);
assert_eq!(variants.len(), 4);
assert_eq!(variants.pop_first(), Some(MediaFileType::Audio));
assert_eq!(variants.pop_first(), Some(MediaFileType::Image));
assert_eq!(variants.pop_first(), Some(MediaFileType::Video));
assert_eq!(variants.pop_first(), Some(MediaFileType::Mocap));
assert_eq!(variants.pop_first(), None);
}
}
+2 -1
View File
@@ -10,7 +10,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
+2 -1
View File
@@ -1,5 +1,6 @@
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
+2 -1
View File
@@ -18,7 +18,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
+1 -3
View File
@@ -55,11 +55,9 @@ pub async fn main() -> AnyhowResult<()> {
seed_user_accounts(&pool).await?;
seed_media_files(&pool, maybe_bucket_clients.as_ref()).await?;
seed_zero_shot_tts(&pool, maybe_bucket_clients.as_ref()).await?;
//seed_zero_shot_tts(&pool, maybe_bucket_clients.as_ref()).await?;
seed_voice_conversion(&pool).await?;
seed_weights(&pool).await?;
seed_tts_tacotron2(&pool, maybe_bucket_clients.as_ref()).await?;
// should seed the weights with a few files for hanashi
@@ -83,7 +83,7 @@ pub async fn seed_weights_files(
let user_token = UserToken::new_from_str(user_token);
// prepare the inputs for a model
let mut rng = rand::thread_rng();
let n: u32 = rng.gen();
let _n: u32 = rng.gen();
let model_weight_token = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
@@ -23,6 +23,10 @@ pub enum Environment {
pub enum Action {
ReindexTts,
SearchTts,
/// Reindex model_weights into ElasticSearch
ReindexModelWeights,
/// Search the model weights
SearchModelWeights,
}
#[derive(Parser, Debug)]
+14 -1
View File
@@ -12,10 +12,12 @@ use sqlx::{MySql, Pool};
use sqlx::mysql::MySqlPoolOptions;
use config::shared_constants::DEFAULT_RUST_LOG;
use elasticsearch_schema::searches::search_model_weights::search_model_weights;
use elasticsearch_schema::searches::search_tts_models::search_tts_models;
use errors::AnyhowResult;
use crate::cli_args::{Action, Environment, parse_cli_args};
use crate::plans::create_all_model_weight_documents::create_all_model_weight_documents;
use crate::plans::create_all_tts_documents::create_all_tts_documents;
pub mod cli_args;
@@ -45,7 +47,18 @@ pub async fn main() -> AnyhowResult<()> {
}
Action::SearchTts => {
info!("Searching TTS...");
search_tts_models(&elasticsearch, "zel", Some("en")).await;
let _results = search_tts_models(&elasticsearch, "zel", Some("en")).await?;
}
Action::ReindexModelWeights => {
info!("Reindexing model weights...");
create_all_model_weight_documents(&mysql, &elasticsearch).await?;
}
Action::SearchModelWeights => {
info!("Searching model weights...");
let results = search_model_weights(&elasticsearch, "zel", Some("en")).await?;
for result in results {
println!("Result: {:?}", result);
}
}
}
@@ -0,0 +1,146 @@
use std::fs::read_to_string;
use elasticsearch::{BulkOperation, BulkParts, Elasticsearch};
use log::{error, info, warn};
use serde_json::Value;
use sqlx::{MySql, Pool};
use elasticsearch_schema::documents::model_weight_document::{MODEL_WEIGHT_INDEX, ModelWeightDocument};
use elasticsearch_schema::traits::document::Document;
use elasticsearch_schema::utils::create_index_if_not_exists::{create_index_if_not_exists, CreateIndexArgs};
use enums::by_table::model_weights::weights_category::WeightsCategory;
use errors::AnyhowResult;
use mysql_queries::queries::model_weights::list::list_model_weights_for_elastic_search_backfill_using_cursor::{list_model_weights_for_elastic_search_backfill_using_cursor, ModelWeightForElasticsearchRecord};
use storyteller_root::get_storyteller_rust_root;
pub async fn create_all_model_weight_documents(mysql: &Pool<MySql>, elasticsearch: &Elasticsearch) -> AnyhowResult<()> {
info!("Create all model weight documents.");
// TODO(bt, 2024-01-10): expose this as a CLI flag
const DELETE_EXISTING_INDEX : bool = true;
const PAGE_SIZE : u64 = 1000;
create_model_weight_model_index(&elasticsearch, DELETE_EXISTING_INDEX).await?;
let mut cursor = 0;
loop {
let results = list_model_weights_for_elastic_search_backfill_using_cursor(mysql, PAGE_SIZE, cursor).await?;
if results.is_empty() {
info!("No more results at cursor {cursor}");
break;
}
let maybe_last_id = results.last().map(|result| result.id);
match maybe_last_id {
Some(last_id) => cursor = last_id as u64,
None => {
warn!("No final ID at cursor {cursor}");
break;
}
}
for result in results {
create_document_from_record(elasticsearch, result).await?;
}
}
Ok(())
}
async fn create_document_from_record(elasticsearch: &Elasticsearch, record: ModelWeightForElasticsearchRecord) -> AnyhowResult<()> {
info!("Create record for {:?} - {:?}", record.token, record.title);
let document = ModelWeightDocument {
token: record.token,
creator_set_visibility: record.creator_set_visibility,
weights_type: record.weights_type,
weights_category: record.weights_category,
title: record.title,
maybe_cover_image_media_file_token: record.maybe_cover_image_media_file_token,
maybe_cover_image_public_bucket_hash: record.maybe_cover_image_public_bucket_hash,
maybe_cover_image_public_bucket_prefix: record.maybe_cover_image_public_bucket_prefix,
maybe_cover_image_public_bucket_extension: record.maybe_cover_image_public_bucket_extension,
creator_user_token: record.creator_user_token,
creator_username: record.creator_username,
creator_display_name: record.creator_display_name,
creator_gravatar_hash: record.creator_gravatar_hash,
ratings_positive_count: record.maybe_ratings_positive_count.unwrap_or(0),
ratings_negative_count: record.maybe_ratings_negative_count.unwrap_or(0),
bookmark_count: record.maybe_bookmark_count.unwrap_or(0),
maybe_ietf_language_tag: match record.weights_category {
WeightsCategory::TextToSpeech => record.maybe_tts_ietf_language_tag,
WeightsCategory::VoiceConversion => record.maybe_voice_conversion_ietf_language_tag,
_ => None,
},
maybe_ietf_primary_language_subtag: match record.weights_category {
WeightsCategory::TextToSpeech => record.maybe_tts_ietf_primary_language_subtag,
WeightsCategory::VoiceConversion => record.maybe_voice_conversion_ietf_primary_language_subtag,
_ => None,
},
created_at: record.created_at,
updated_at: record.updated_at,
user_deleted_at: record.user_deleted_at,
mod_deleted_at: record.mod_deleted_at,
};
let op : BulkOperation<_> = BulkOperation::index(&document)
.id(document.get_document_id())
.into();
let response = elasticsearch
.bulk(BulkParts::Index(MODEL_WEIGHT_INDEX))
.body(vec![op])
.send()
.await?;
let json: Value = response.json().await?;
let had_errors = json["errors"].as_bool().unwrap_or(false);
if had_errors {
let failed: Vec<&Value> = json["items"]
.as_array()
.unwrap()
.iter()
.filter(|v| !v["error"].is_null())
.collect();
// TODO: retry failures
error!("Errors during indexing. Failures: {}", failed.len());
}
Ok(())
}
// NB: Adapted from elasticsearch crate examples source
async fn create_model_weight_model_index(client: &Elasticsearch, delete_existing: bool) -> AnyhowResult<()> {
info!("Creating model weight model index...");
let index_path = get_storyteller_rust_root()
.join("_elasticsearch/index_definitions/model_weights_v1.json");
info!("Reading index file: {:?}", index_path);
let index_definition = read_to_string(index_path)?;
create_index_if_not_exists(CreateIndexArgs {
client,
index_name: MODEL_WEIGHT_INDEX,
index_definition: &index_definition,
delete_existing,
}).await?;
Ok(())
}
@@ -1 +1,2 @@
pub mod create_all_model_weight_documents;
pub mod create_all_tts_documents;
+2 -1
View File
@@ -5,7 +5,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
@@ -1,17 +1,18 @@
use anyhow::anyhow;
use errors::AnyhowResult;
use filesys::file_read_bytes::file_read_bytes;
use filesys::file_size::file_size;
use hashing::sha256::sha256_hash_file::sha256_hash_file;
use mimetypes::mimetype_for_bytes::get_mimetype_for_bytes;
use crate::remote_file_manager::bucket_orchestration::BucketOrchestrationCore;
use crate::remote_file_manager::bucket_orchestration::{BucketOrchestration, BucketOrchestrationCore};
use crate::remote_file_manager::file_directory::FileBucketDirectory;
use crate::remote_file_manager::remote_cloud_bucket_details::RemoteCloudBucketDetails;
use super::file_descriptor::FileDescriptor;
use super::file_meta_data::FileMetaData;
struct RemoteCloudFileClient {
pub struct RemoteCloudFileClient {
bucket_orchestration_client: Box<dyn BucketOrchestrationCore>
}
@@ -22,6 +23,19 @@ impl RemoteCloudFileClient {
}
}
pub async fn get_remote_cloud_file_client() -> AnyhowResult<Self> {
let bucket_orchestration = match BucketOrchestration::new_bucket_client_from_existing_env() {
Ok(client) => client,
Err(e) => {
return Err(anyhow!("Error creating bucket orchestration client: {:?}", e));
}
};
Ok(Self {
bucket_orchestration_client: Box::new(bucket_orchestration)
})
}
pub async fn download_file(&self, remote_cloud_bucket_details:RemoteCloudBucketDetails, to_system_file_path:String) -> AnyhowResult<()> {
let file_descriptor = remote_cloud_bucket_details.file_descriptor_from_bucket_details();
let file_bucket_directory = FileBucketDirectory::from_existing_bucket_details(remote_cloud_bucket_details);
@@ -4,7 +4,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
//// Okay to toggle
+2 -1
View File
@@ -4,7 +4,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
+2 -1
View File
@@ -1,5 +1,6 @@
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
+2 -1
View File
@@ -4,7 +4,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
+2 -1
View File
@@ -5,7 +5,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
+2 -1
View File
@@ -8,7 +8,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
//// Okay to toggle
+2 -1
View File
@@ -4,7 +4,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
+2 -1
View File
@@ -4,7 +4,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
+2 -1
View File
@@ -7,7 +7,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
@@ -59,6 +59,8 @@ pub fn add_fakeyou(cors: Cors, is_production: bool) -> Cors {
// FakeYou (Staging)
.allowed_origin("http://staging.fakeyou.com")
.allowed_origin("https://staging.fakeyou.com")
// FakeYou (Netlify Staging / Production)
.allowed_origin("https://feature-mvp--fakeyou.netlify.app")
} else {
cors
// FakeYou (Development)
@@ -1,2 +1,2 @@
pub mod tts_model_document;
mod model_weight_document;
pub mod model_weight_document;
pub mod tts_model_document;
@@ -2,9 +2,9 @@ use std::path::PathBuf;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use enums::by_table::model_weights::weights_category::WeightsCategory;
use enums::by_table::model_weights::weights_types::WeightsType;
use enums::common::visibility::Visibility;
use tokens::tokens::media_files::MediaFileToken;
use tokens::tokens::model_weights::ModelWeightToken;
@@ -18,6 +18,9 @@ pub const MODEL_WEIGHT_INDEX: &str = "model_weights_v1";
#[derive(Serialize, Deserialize, Debug)]
pub struct ModelWeightDocument {
// *** NB: Never put the bucket path to the model in Elasticsearch ! ***
pub token: ModelWeightToken,
pub creator_set_visibility: Visibility,
@@ -27,30 +30,34 @@ pub struct ModelWeightDocument {
pub title: String,
// *** NB: Never put the bucket path to the model in Elasticsearch ! ***
pub maybe_cover_image_media_file_token: Option<MediaFileToken>,
pub maybe_cover_image_media_bucket_path: Option<String>,
pub maybe_cover_image_public_bucket_hash: Option<String>,
pub maybe_cover_image_public_bucket_prefix: Option<String>,
pub maybe_cover_image_public_bucket_extension: Option<String>,
//pub description_markdown: String,
//pub description_markdown_html: String,
// TODO(bt,2023-12-22): Populate these fields
//pub cached_user_ratings_total_count: u32,
//pub cached_user_ratings_positive_count: u32,
//pub cached_user_ratings_negative_count: u32,
//pub cached_user_ratings_ratio: f32,
//pub cached_user_ratings_last_updated_at: DateTime<Utc>,
pub creator_user_token: UserToken,
pub creator_username: String,
pub creator_display_name: String,
pub creator_gravatar_hash: String,
// Statistics
pub ratings_positive_count: u32,
pub ratings_negative_count: u32,
pub bookmark_count: u32,
// Fields only used for TTS models and voice conversion models.
pub maybe_ietf_language_tag: Option<String>,
pub maybe_ietf_primary_language_subtag: Option<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub user_deleted_at: Option<DateTime<Utc>>,
pub mod_deleted_at: Option<DateTime<Utc>>,
}
impl Document for ModelWeightDocument {
+2 -1
View File
@@ -5,7 +5,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
@@ -1 +1,2 @@
pub mod search_model_weights;
pub mod search_tts_models;
@@ -0,0 +1,155 @@
use elasticsearch::{Elasticsearch, SearchParts};
use log::error;
use serde_json::{json, Value};
use errors::AnyhowResult;
use crate::documents::model_weight_document::{MODEL_WEIGHT_INDEX, ModelWeightDocument};
pub async fn search_model_weights(
client: &Elasticsearch,
search_term: &str,
maybe_language_subtag: Option<&str>,
) -> AnyhowResult<Vec<ModelWeightDocument>> {
let search_json = match maybe_language_subtag {
None => query_model_weights(search_term),
Some(language) => query_model_weights_with_required_language(search_term, language)
};
let search_response = client
.search(SearchParts::Index(&[MODEL_WEIGHT_INDEX]))
.body(search_json)
.allow_no_indices(true)
.send()
.await?;
let _status_code = search_response.status_code();
let mut response_json = search_response.json::<Value>().await?;
let hits = response_json.get_mut("hits")
.map(|hits| hits.take());
let hits = hits.map(|mut hits| {
hits.get_mut("hits")
.map(|hits| hits.take())
}).flatten();
let mut documents = Vec::new();
match hits {
Some(Value::Array(inner_hits)) => {
for mut hit in inner_hits {
let maybe_object = hit.get_mut("_source")
.map(|source| source.take());
if let Some(value) = maybe_object {
let document = serde_json::from_value::<ModelWeightDocument>(value)
.map_err(|err| {
error!("Error: {:?}", &err);
err
})?;
documents.push(document);
}
}
}
_ => {},
}
Ok(documents)
}
fn query_model_weights(search_term: &str) -> Value {
json!({
"query": {
"bool": {
"must": [
{
"bool": {
"should": [
{
"fuzzy": {
"title": {
"value": search_term,
"fuzziness": 2
}
}
},
{
"match": {
"title": {
"query": search_term,
"boost": 1
}
}
},
{
"multi_match": {
"query": search_term,
"type": "bool_prefix",
"fields": [
"title",
"title._2gram",
"title._3gram"
],
"boost": 50
}
}
]
}
}
]
}
}
})
}
fn query_model_weights_with_required_language(search_term: &str, language_tag: &str) -> Value {
json!({
"query": {
"bool": {
"must": [
{
"match": {
"maybe_ietf_primary_language_subtag": language_tag
}
},
{
"bool": {
"should": [
{
"fuzzy": {
"title": {
"value": search_term,
"fuzziness": 2
}
}
},
{
"match": {
"title": {
"query": search_term,
"boost": 1
}
}
},
{
"multi_match": {
"query": search_term,
"type": "bool_prefix",
"fields": [
"title",
"title._2gram",
"title._3gram"
],
"boost": 50
}
}
]
}
}
]
}
}
})
}
@@ -3,7 +3,7 @@ use serde_json::{json, Value};
use errors::AnyhowResult;
use crate::documents::tts_model_document::TtsModelDocument;
use crate::documents::tts_model_document::{TTS_MODEL_INDEX, TtsModelDocument};
pub async fn search_tts_models(
client: &Elasticsearch,
@@ -17,7 +17,7 @@ pub async fn search_tts_models(
};
let search_response = client
.search(SearchParts::None)
.search(SearchParts::Index(&[TTS_MODEL_INDEX]))
.body(search_json)
.allow_no_indices(true)
.send()
+2 -1
View File
@@ -5,7 +5,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
+2 -1
View File
@@ -5,7 +5,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
+2 -1
View File
@@ -5,7 +5,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
+2 -1
View File
@@ -5,7 +5,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
+2 -1
View File
@@ -6,7 +6,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
+2 -1
View File
@@ -5,7 +5,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
+2 -1
View File
@@ -5,7 +5,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
+2 -1
View File
@@ -5,7 +5,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
+2 -1
View File
@@ -5,7 +5,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
+3 -1
View File
@@ -4,7 +4,8 @@
//!
// Never allow these
#![forbid(private_in_public)]
#![forbid(private_bounds)]
#![forbid(private_interfaces)]
#![forbid(unused_must_use)] // NB: It's unsafe to not close/check some things
// Okay to toggle
@@ -17,4 +18,5 @@
#![allow(dead_code)]
#![allow(non_snake_case)]
pub mod text_to_speech;
pub mod voice_conversion;
@@ -0,0 +1,155 @@
use chrono::{DateTime, Utc};
use sqlx::MySql;
use sqlx::pool::PoolConnection;
use enums::common::visibility::Visibility;
use errors::AnyhowResult;
use mysql_queries::queries::model_weights::list::list_model_weights_for_text_to_speech::{list_model_weights_for_text_to_speech, ModelWeightForTts};
use mysql_queries::queries::tts::tts_models::list_tts_models::{list_tts_models_with_connection, TtsModelRecordForList};
/// List TTS models
/// This is for the tts model list page.
/// Since we're listing, we have to use a flag to determine which query to perform.
pub async fn list_tts_models_for_migration(
mysql_connection: &mut PoolConnection<MySql>,
use_weights_table: bool,
) -> AnyhowResult<Vec<TtsModelForList>> {
// NB: This is temporary migration code as we switch from the `tts_models` table to the `model_weights` table.
if use_weights_table {
let models = list_model_weights_for_text_to_speech(
mysql_connection).await?;
Ok(models.into_iter()
.map(|model| TtsModelForList::ModelWeight(model))
.collect())
} else {
let models = list_tts_models_with_connection(
mysql_connection, None, false).await?;
Ok(models.into_iter()
.map(|model| TtsModelForList::LegacyTts(model))
.collect())
}
}
/// Union over the legacy table and the new table to support an easier migration.
/// This enum can hold a record of either type and present a unified accessor interface.
#[derive(Clone)]
pub enum TtsModelForList {
/// Old type from the `tts_models` table, on the way out
LegacyTts(TtsModelRecordForList),
/// New type, replacing the `tts_models` table.
ModelWeight(ModelWeightForTts),
}
impl TtsModelForList {
pub fn token(&self) -> &str {
match self {
TtsModelForList::LegacyTts(ref model) => model.model_token.as_str(),
TtsModelForList::ModelWeight(ref model) => model.token.as_str(),
}
}
pub fn title(&self) -> &str {
match self {
TtsModelForList::LegacyTts(ref model) => &model.title,
TtsModelForList::ModelWeight(ref model) => &model.title,
}
}
pub fn ietf_language_tag(&self) -> &str {
match self {
TtsModelForList::LegacyTts(ref model) => &model.ietf_language_tag,
TtsModelForList::ModelWeight(ref model) => &model.ietf_language_tag,
}
}
pub fn ietf_primary_language_subtag(&self) -> &str {
match self {
TtsModelForList::LegacyTts(ref model) => &model.ietf_primary_language_subtag,
TtsModelForList::ModelWeight(ref model) => &model.ietf_primary_language_subtag,
}
}
pub fn creator_user_token(&self) -> &str {
match self {
TtsModelForList::LegacyTts(ref model) => &model.creator_user_token,
TtsModelForList::ModelWeight(ref model) => model.creator_user_token.as_str(),
}
}
pub fn creator_username(&self) -> &str {
match self {
TtsModelForList::LegacyTts(ref model) => &model.creator_username,
TtsModelForList::ModelWeight(ref model) => &model.creator_username,
}
}
pub fn creator_display_name(&self) -> &str {
match self {
TtsModelForList::LegacyTts(ref model) => &model.creator_display_name,
TtsModelForList::ModelWeight(ref model) => &model.creator_display_name,
}
}
pub fn creator_gravatar_hash(&self) -> &str {
match self {
TtsModelForList::LegacyTts(ref model) => &model.creator_gravatar_hash,
TtsModelForList::ModelWeight(ref model) => &model.creator_gravatar_hash,
}
}
pub fn creator_set_visibility(&self) -> Visibility{
match self {
TtsModelForList::LegacyTts(ref model) => model.creator_set_visibility,
TtsModelForList::ModelWeight(ref model) => model.creator_set_visibility,
}
}
pub fn created_at(&self) -> &DateTime<Utc> {
match self {
TtsModelForList::LegacyTts(ref model) => &model.created_at,
TtsModelForList::ModelWeight(ref model) => &model.created_at,
}
}
pub fn updated_at(&self) -> &DateTime<Utc> {
match self {
TtsModelForList::LegacyTts(ref model) => &model.updated_at,
TtsModelForList::ModelWeight(ref model) => &model.updated_at,
}
}
// Not supported in the new table
pub fn is_front_page_featured(&self) -> bool {
match self {
TtsModelForList::LegacyTts(ref model) => model.is_front_page_featured,
TtsModelForList::ModelWeight(ref _model) => false,
}
}
// Not supported in the new table
pub fn user_ratings_positive_count(&self) -> u32 {
match self {
TtsModelForList::LegacyTts(ref model) => model.user_ratings_positive_count,
TtsModelForList::ModelWeight(ref _model) => 0,
}
}
// Not supported in the new table
pub fn user_ratings_negative_count(&self) -> u32 {
match self {
TtsModelForList::LegacyTts(ref model) => model.user_ratings_negative_count,
TtsModelForList::ModelWeight(ref _model) => 0,
}
}
// Not supported in the new table
pub fn user_ratings_total_count(&self) -> u32 {
match self {
TtsModelForList::LegacyTts(ref model) => model.user_ratings_total_count,
TtsModelForList::ModelWeight(ref _model) => 0,
}
}
}
@@ -0,0 +1 @@
pub mod list_tts_models_for_migration;
@@ -2,6 +2,7 @@ use enums::by_table::generic_inference_jobs::inference_category::InferenceCatego
use errors::AnyhowResult;
use crate::payloads::generic_inference_args::lipsync_payload::LipsyncArgs;
use crate::payloads::generic_inference_args::mocap_payload::MocapArgs;
use crate::payloads::generic_inference_args::tts_payload::TTSArgs;
use crate::payloads::generic_inference_args::videofilter_payload::{RerenderArgs};
@@ -40,6 +41,10 @@ pub enum InferenceCategoryAbbreviated {
#[serde(rename = "vf")] // NB: DO NOT CHANGE. It could break live jobs. Renamed to be fewer bytes.
#[serde(alias = "video_filter")]
VideoFilter,
#[serde(rename = "mc")] // NB: DO NOT CHANGE. It could break live jobs. Renamed to be fewer bytes.
#[serde(alias = "mocap")]
Mocap,
}
#[derive(Serialize, Deserialize, Clone, Copy, Debug)]
@@ -91,7 +96,10 @@ pub enum PolymorphicInferenceArgs {
},
/// Rerender a video. (Short name to save space when serializing.)
Rr(RerenderArgs)
Rr(RerenderArgs),
// Mocap (Short name to save space when serializing.)
Mc(MocapArgs)
}
@@ -113,6 +121,7 @@ impl InferenceCategoryAbbreviated {
InferenceCategory::TextToSpeech => Self::TextToSpeech,
InferenceCategory::VoiceConversion => Self::VoiceConversion,
InferenceCategory::VideoFilter => Self::VideoFilter,
InferenceCategory::Mocap => Self::Mocap,
}
}
@@ -122,6 +131,7 @@ impl InferenceCategoryAbbreviated {
Self::TextToSpeech => InferenceCategory::TextToSpeech,
Self::VoiceConversion => InferenceCategory::VoiceConversion,
Self::VideoFilter => InferenceCategory::VideoFilter,
Self::Mocap => InferenceCategory::Mocap,
}
}
}
@@ -0,0 +1,60 @@
/// Video sources can be one of several:
/// - F: media_files (todo)
/// - U: media_uploads (legacy)
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub enum MocapVideoSource {
// NB: DO NOT CHANGE. It could break live jobs. Renamed to be fewer bytes.
/// Media File Token (media_files table)
/// Serde cannot yet rename enum variants.
F(String),
// NB: DO NOT CHANGE. It could break live jobs. Renamed to be fewer bytes.
/// Media Upload Token (media_uploads table)
/// Serde cannot yet rename enum variants.
U(String),
}
impl MocapVideoSource {
pub fn media_file_token(token: &str) -> Self {
MocapVideoSource::F(token.to_string())
}
pub fn media_upload_token(token: &str) -> Self {
MocapVideoSource::U(token.to_string())
}
}
#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)]
pub struct MocapArgs {
#[serde(rename = "vs")]
#[serde(skip_serializing_if = "Option::is_none")]
pub maybe_video_source: Option<MocapVideoSource>,
#[serde(rename = "ik1")]
#[serde(skip_serializing_if = "Option::is_none")]
pub maybe_ik1: Option<f32>,
#[serde(rename = "ik2")]
#[serde(skip_serializing_if = "Option::is_none")]
pub maybe_ik2: Option<i32>,
#[serde(rename = "ik3")]
#[serde(skip_serializing_if = "Option::is_none")]
pub maybe_ik3: Option<i32>,
#[serde(rename = "sm1")]
#[serde(skip_serializing_if = "Option::is_none")]
pub maybe_smoothing1: Option<f32>,
#[serde(rename = "sm2")]
#[serde(skip_serializing_if = "Option::is_none")]
pub maybe_smoothing2: Option<f32>,
#[serde(rename = "si1")]
#[serde(skip_serializing_if = "Option::is_none")]
pub maybe_size1: Option<i32>,
#[serde(rename = "si2")]
#[serde(skip_serializing_if = "Option::is_none")]
pub maybe_size2: Option<i32>,
}
@@ -1,4 +1,5 @@
pub mod generic_inference_args;
pub mod lipsync_payload;
pub mod tts_payload;
pub mod videofilter_payload;
pub mod videofilter_payload;
pub mod mocap_payload;
@@ -1,2 +1,3 @@
pub mod stats_entity_token;
pub mod upsert_entity_stats_on_bookmark_event;
pub mod upsert_entity_stats_on_bookmark_event;
pub mod upsert_entity_stats_on_ratings_event;
@@ -1,5 +1,6 @@
use enums::by_table::entity_stats::stats_entity_type::StatsEntityType;
use enums::by_table::user_bookmarks::user_bookmark_entity_type::UserBookmarkEntityType;
use enums::by_table::user_ratings::entity_type::UserRatingEntityType;
use tokens::tokens::comments::CommentToken;
use tokens::tokens::media_files::MediaFileToken;
use tokens::tokens::model_weights::ModelWeightToken;
@@ -21,6 +22,15 @@ impl StatsEntityToken {
}
}
/// Rating entity types aren't 1:1, and they're not a superset (yet) either.
pub fn from_rating_entity_type_and_token(entity_type: UserRatingEntityType, token: &str) -> Option<Self> {
match entity_type {
UserRatingEntityType::MediaFile => Some(Self::MediaFile(MediaFileToken::new_from_str(token))),
UserRatingEntityType::ModelWeight => Some(Self::ModelWeight(ModelWeightToken::new_from_str(token))),
_ => None,
}
}
pub fn from_entity_type_and_token(entity_type: StatsEntityType, token: &str) -> Self {
match entity_type {
StatsEntityType::Comment => Self::Comment(CommentToken::new_from_str(token)),
@@ -0,0 +1,152 @@
use std::marker::PhantomData;
use anyhow::anyhow;
use sqlx::{Executor, MySql};
use errors::AnyhowResult;
use crate::queries::entity_stats::stats_entity_token::StatsEntityToken;
/// NB: "Neutral" means one of two things here:
/// 1. The user has not voted on the entity, ie. no previous vote exists (null).
/// 2. The user has voted on the entity, but the vote is "neutral".
#[derive(Copy, Clone)]
pub enum RatingsAction {
/// Add one to positive
NeutralToPositive,
/// Add one to negative
NeutralToNegative,
/// Remove one from positive
PositiveToNeutral,
/// Remove one from negative
NegativeToNeutral,
/// Remove one from negative, add one to positive
NegativeToPositive,
/// Remove one from positive, add one to negative
PositiveToNegative,
}
pub struct UpsertEntityStatsArgs<'e, 'c, E>
where E: 'e + Executor<'c, Database = MySql>
{
pub stats_entity_token: &'e StatsEntityToken,
pub action: RatingsAction,
pub mysql_executor: E,
// TODO: Not sure if this works to tell the compiler we need the lifetime annotation.
// See: https://doc.rust-lang.org/std/marker/struct.PhantomData.html#unused-lifetime-parameters
pub phantom: PhantomData<&'c E>,
}
pub async fn upsert_entity_stats_on_ratings_event<'e, 'c : 'e, E>(
args: UpsertEntityStatsArgs<'e, 'c, E>,
) -> AnyhowResult<()>
where E: 'e + Executor<'c, Database = MySql>
{
let (entity_type, entity_token) = args.stats_entity_token.get_composite_keys();
let query = match args.action {
RatingsAction::NeutralToPositive => {
sqlx::query!(
r#"
INSERT INTO entity_stats SET
entity_type = ?,
entity_token = ?,
ratings_positive_count = 1
ON DUPLICATE KEY UPDATE
ratings_positive_count = ratings_positive_count + 1
"#,
entity_type,
entity_token,
)
}
RatingsAction::NeutralToNegative => {
sqlx::query!(
r#"
INSERT INTO entity_stats SET
entity_type = ?,
entity_token = ?,
ratings_negative_count = 1
ON DUPLICATE KEY UPDATE
ratings_negative_count = ratings_negative_count + 1
"#,
entity_type,
entity_token,
)
}
RatingsAction::PositiveToNeutral => {
sqlx::query!(
r#"
INSERT INTO entity_stats SET
entity_type = ?,
entity_token = ?,
ratings_positive_count = 0
ON DUPLICATE KEY UPDATE
ratings_positive_count = ABS(CAST(ratings_positive_count AS SIGNED) - 1)
"#,
entity_type,
entity_token,
)
}
RatingsAction::NegativeToNeutral => {
sqlx::query!(
r#"
INSERT INTO entity_stats SET
entity_type = ?,
entity_token = ?,
ratings_negative_count = 0
ON DUPLICATE KEY UPDATE
ratings_negative_count = ABS(CAST(ratings_negative_count AS SIGNED) - 1)
"#,
entity_type,
entity_token,
)
}
RatingsAction::PositiveToNegative => {
sqlx::query!(
r#"
INSERT INTO entity_stats SET
entity_type = ?,
entity_token = ?,
ratings_positive_count = 0,
ratings_negative_count = 1
ON DUPLICATE KEY UPDATE
ratings_positive_count = ABS(CAST(ratings_positive_count AS SIGNED) - 1),
ratings_negative_count = ratings_negative_count + 1
"#,
entity_type,
entity_token,
)
}
RatingsAction::NegativeToPositive => {
sqlx::query!(
r#"
INSERT INTO entity_stats SET
entity_type = ?,
entity_token = ?,
ratings_positive_count = 1,
ratings_negative_count = 0
ON DUPLICATE KEY UPDATE
ratings_positive_count = ratings_positive_count + 1,
ratings_negative_count = ABS(CAST(ratings_negative_count AS SIGNED) - 1)
"#,
entity_type,
entity_token,
)
}
};
let query_result = query.execute(args.mysql_executor).await;
let _record_id = match query_result {
Ok(res) => res.last_insert_id(),
Err(err) => return Err(anyhow!("Mysql error: {:?}", err)),
};
Ok(())
}
@@ -179,6 +179,7 @@ fn raw_record_to_public_result(record: RawGenericInferenceJobStatus) -> GenericI
InferenceCategory::TextToSpeech => record.maybe_tts_model_title.as_deref(),
InferenceCategory::VoiceConversion => record.maybe_voice_conversion_model_title.as_deref(),
InferenceCategory::VideoFilter => Some("Video Filter"),
InferenceCategory::Mocap => Some("Mocap"),
};
// NB: A bit of a hack. We store TTS results with a full path.
@@ -188,6 +189,7 @@ fn raw_record_to_public_result(record: RawGenericInferenceJobStatus) -> GenericI
InferenceCategory::TextToSpeech => (false, record.maybe_tts_public_bucket_path.as_deref()),
InferenceCategory::VoiceConversion => (true, record.maybe_voice_conversion_public_bucket_hash.as_deref()),
InferenceCategory::VideoFilter => (true, record.maybe_media_file_public_bucket_directory_hash.as_deref()),
InferenceCategory::Mocap => (true, record.maybe_media_file_public_bucket_directory_hash.as_deref()),
};
// NB: We've moved voice conversion out of their own table and into media_files
@@ -0,0 +1,155 @@
use anyhow::anyhow;
use sqlx;
use sqlx::MySqlPool;
use enums::by_table::generic_synthetic_ids::id_category::IdCategory;
use enums::by_table::media_files::media_file_origin_category::MediaFileOriginCategory;
use enums::by_table::media_files::media_file_origin_model_type::MediaFileOriginModelType;
use enums::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory;
use enums::by_table::media_files::media_file_type::MediaFileType;
use errors::AnyhowResult;
use tokens::tokens::media_files::MediaFileToken;
use tokens::tokens::users::UserToken;
use crate::queries::generic_inference::job::list_available_generic_inference_jobs::AvailableInferenceJob;
use crate::queries::generic_synthetic_ids::transactional_increment_generic_synthetic_id::transactional_increment_generic_synthetic_id;
pub struct InsertArgs<'a> {
pub pool: &'a MySqlPool,
pub job: &'a AvailableInferenceJob,
pub maybe_mime_type: Option<&'a str>,
pub file_size_bytes: u64,
pub sha256_checksum: &'a str,
// TODO: Media duration.
//pub duration_millis: u64,
pub public_bucket_directory_hash: &'a str,
pub maybe_public_bucket_prefix: Option<&'a str>,
pub maybe_public_bucket_extension: Option<&'a str>,
pub is_on_prem: bool,
pub worker_hostname: &'a str,
pub worker_cluster: &'a str,
}
pub async fn insert_media_file_from_mocapnet(
args: InsertArgs<'_>
) -> AnyhowResult<(MediaFileToken, u64)>
{
let result_token = MediaFileToken::generate();
let mut maybe_creator_file_synthetic_id : Option<u64> = None;
let mut maybe_creator_category_synthetic_id : Option<u64> = None;
let mut transaction = args.pool.begin().await?;
if let Some(creator_user_token) = args.job.maybe_creator_user_token.as_deref() {
let user_token = UserToken::new_from_str(creator_user_token);
let next_media_file_id = transactional_increment_generic_synthetic_id(
&user_token,
IdCategory::MediaFile,
&mut transaction
).await?;
let next_mocapnet_id = transactional_increment_generic_synthetic_id(
&user_token,
IdCategory::MocapResult,
&mut transaction
).await?;
maybe_creator_file_synthetic_id = Some(next_media_file_id);
maybe_creator_category_synthetic_id = Some(next_mocapnet_id);
}
const ORIGIN_CATEGORY : MediaFileOriginCategory = MediaFileOriginCategory::Inference;
const ORIGIN_PRODUCT_CATEGORY : MediaFileOriginProductCategory = MediaFileOriginProductCategory::Mocap;
const ORIGIN_MODEL_TYPE : MediaFileOriginModelType = MediaFileOriginModelType::MocapNet;
const MEDIA_TYPE : MediaFileType = MediaFileType::Mocap;
let record_id = {
let query_result = sqlx::query!(
r#"
INSERT INTO media_files
SET
token = ?,
origin_category = ?,
origin_product_category = ?,
maybe_origin_model_type = ?,
media_type = ?,
maybe_mime_type = ?,
file_size_bytes = ?,
checksum_sha2 = ?,
public_bucket_directory_hash = ?,
maybe_public_bucket_prefix = ?,
maybe_public_bucket_extension = ?,
maybe_creator_user_token = ?,
maybe_creator_anonymous_visitor_token = ?,
creator_ip_address = ?,
creator_set_visibility = ?,
maybe_creator_file_synthetic_id = ?,
maybe_creator_category_synthetic_id = ?,
is_generated_on_prem = ?,
generated_by_worker = ?,
generated_by_cluster = ?
"#,
result_token.as_str(),
ORIGIN_CATEGORY.to_str(),
ORIGIN_PRODUCT_CATEGORY.to_str(),
ORIGIN_MODEL_TYPE.to_str(),
MEDIA_TYPE.to_str(),
args.maybe_mime_type,
args.file_size_bytes,
args.sha256_checksum,
args.public_bucket_directory_hash,
args.maybe_public_bucket_prefix,
args.maybe_public_bucket_extension,
args.job.maybe_creator_user_token,
args.job.maybe_creator_anonymous_visitor_token,
args.job.creator_ip_address,
args.job.creator_set_visibility.to_str(),
maybe_creator_file_synthetic_id,
maybe_creator_category_synthetic_id,
args.is_on_prem,
args.worker_hostname,
args.worker_cluster
)
.execute(&mut *transaction)
.await;
let record_id = match query_result {
Ok(res) => {
res.last_insert_id()
},
Err(err) => {
// TODO: handle better
//transaction.rollback().await?;
return Err(anyhow!("Mysql error: {:?}", err));
}
};
record_id
};
transaction.commit().await?;
Ok((result_token, record_id))
}
@@ -5,3 +5,4 @@ pub mod insert_media_file_from_rerender;
pub mod insert_media_file_from_tacotron2;
pub mod insert_media_file_from_voice_conversion;
pub mod insert_media_file_from_zero_shot_tts;
pub mod insert_media_file_from_mocapnet;
@@ -52,6 +52,10 @@ pub struct MediaFile {
pub maybe_public_bucket_prefix: Option<String>,
pub maybe_public_bucket_extension: Option<String>,
pub maybe_ratings_positive_count: Option<u32>,
pub maybe_ratings_negative_count: Option<u32>,
pub maybe_bookmark_count: Option<u32>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
@@ -106,6 +110,10 @@ pub struct MediaFileRaw {
//pub model_is_mod_approved: bool, // converted
//pub maybe_mod_user_token: Option<String>,
pub maybe_ratings_positive_count: Option<u32>,
pub maybe_ratings_negative_count: Option<u32>,
pub maybe_bookmark_count: Option<u32>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
@@ -154,6 +162,9 @@ pub async fn get_media_file(
public_bucket_directory_hash: record.public_bucket_directory_hash,
maybe_public_bucket_prefix: record.maybe_public_bucket_prefix,
maybe_public_bucket_extension: record.maybe_public_bucket_extension,
maybe_ratings_positive_count: record.maybe_ratings_positive_count,
maybe_ratings_negative_count: record.maybe_ratings_negative_count,
maybe_bookmark_count: record.maybe_bookmark_count,
created_at: record.created_at,
updated_at: record.updated_at,
}))
@@ -196,6 +207,10 @@ SELECT
m.maybe_public_bucket_prefix,
m.maybe_public_bucket_extension,
entity_stats.ratings_positive_count as maybe_ratings_positive_count,
entity_stats.ratings_negative_count as maybe_ratings_negative_count,
entity_stats.bookmark_count as maybe_bookmark_count,
m.created_at,
m.updated_at
@@ -208,6 +223,9 @@ LEFT OUTER JOIN media_files as cover_image
ON cover_image.token = model_weights.maybe_cover_image_media_file_token
LEFT OUTER JOIN users as model_weight_creator
ON model_weight_creator.token = model_weights.creator_user_token
LEFT OUTER JOIN entity_stats
ON entity_stats.entity_type = "media_file"
AND entity_stats.entity_token = m.token
WHERE
m.token = ?
"#,
@@ -254,6 +272,10 @@ SELECT
m.maybe_public_bucket_prefix,
m.maybe_public_bucket_extension,
entity_stats.ratings_positive_count as maybe_ratings_positive_count,
entity_stats.ratings_negative_count as maybe_ratings_negative_count,
entity_stats.bookmark_count as maybe_bookmark_count,
m.created_at,
m.updated_at
@@ -266,6 +288,9 @@ LEFT OUTER JOIN media_files as cover_image
ON cover_image.token = model_weights.maybe_cover_image_media_file_token
LEFT OUTER JOIN users as model_weight_creator
ON model_weight_creator.token = model_weights.creator_user_token
LEFT OUTER JOIN entity_stats
ON entity_stats.entity_type = "media_file"
AND entity_stats.entity_token = m.token
WHERE
m.token = ?
AND m.user_deleted_at IS NULL
@@ -30,9 +30,13 @@ pub struct MediaFileListItem {
pub origin_category: MediaFileOriginCategory,
pub origin_product_category: MediaFileOriginProductCategory,
pub maybe_origin_model_type: Option<MediaFileOriginModelType>,
pub maybe_origin_model_token: Option<String>,
// NB: The title won't be populated for `tts_models` records or non-`model_weights` records.
pub maybe_origin_model_title: Option<String>,
pub media_type: MediaFileType,
pub public_bucket_directory_hash: String,
pub maybe_public_bucket_prefix: Option<String>,
@@ -45,9 +49,16 @@ pub struct MediaFileListItem {
pub creator_set_visibility: Visibility,
#[deprecated(note = "more expensive to query")]
pub comment_count: u64,
#[deprecated(note = "more expensive to query")]
pub favorite_count: u64,
pub maybe_ratings_positive_count: Option<u32>,
pub maybe_ratings_negative_count: Option<u32>,
pub maybe_bookmark_count: Option<u32>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
@@ -91,6 +102,7 @@ pub async fn list_media_files(args: ListMediaFilesArgs<'_>) -> AnyhowResult<Medi
origin_product_category: record.origin_product_category,
maybe_origin_model_type: record.maybe_origin_model_type,
maybe_origin_model_token: record.maybe_origin_model_token,
maybe_origin_model_title: record.maybe_origin_model_title,
media_type: record.media_type,
public_bucket_directory_hash: record.public_bucket_directory_hash,
maybe_public_bucket_prefix: record.maybe_public_bucket_prefix,
@@ -102,6 +114,9 @@ pub async fn list_media_files(args: ListMediaFilesArgs<'_>) -> AnyhowResult<Medi
creator_set_visibility: record.creator_set_visibility,
comment_count: record.comment_count as u64,
favorite_count: record.favorite_count as u64,
maybe_ratings_positive_count: record.maybe_ratings_positive_count,
maybe_ratings_negative_count: record.maybe_ratings_negative_count,
maybe_bookmark_count: record.maybe_bookmark_count,
created_at: record.created_at,
updated_at: record.updated_at,
}
@@ -133,13 +148,15 @@ SELECT
m.id,
m.token,
m.media_type,
m.origin_category,
m.origin_product_category,
m.maybe_origin_model_type,
m.maybe_origin_model_token,
m.media_type,
w.title as maybe_origin_model_title,
m.public_bucket_directory_hash,
m.maybe_public_bucket_prefix,
@@ -150,6 +167,11 @@ SELECT
u.display_name as maybe_creator_display_name,
u.email_gravatar_hash as maybe_creator_gravatar_hash,
entity_stats.ratings_positive_count as maybe_ratings_positive_count,
entity_stats.ratings_negative_count as maybe_ratings_negative_count,
entity_stats.bookmark_count as maybe_bookmark_count,
m.creator_set_visibility,
m.created_at,
m.updated_at,
@@ -161,10 +183,15 @@ FROM media_files AS m
LEFT OUTER JOIN users AS u
ON m.maybe_creator_user_token = u.token
LEFT OUTER JOIN model_weights as w
ON m.maybe_origin_model_token = w.token
LEFT OUTER JOIN favorites as f
ON f.entity_type = 'media_file' AND f.entity_token = m.token
LEFT OUTER JOIN comments as c
ON c.entity_type = 'media_file' AND c.entity_token = c.token
LEFT OUTER JOIN entity_stats
ON entity_stats.entity_type = "media_file"
AND entity_stats.entity_token = m.token
"#
);
@@ -251,6 +278,7 @@ struct MediaFileListItemInternal {
origin_product_category: MediaFileOriginProductCategory,
maybe_origin_model_type: Option<MediaFileOriginModelType>,
maybe_origin_model_token: Option<String>,
maybe_origin_model_title: Option<String>,
media_type: MediaFileType,
public_bucket_directory_hash: String,
@@ -267,6 +295,10 @@ struct MediaFileListItemInternal {
comment_count: i64,
favorite_count: i64,
maybe_ratings_positive_count: Option<u32>,
maybe_ratings_negative_count: Option<u32>,
maybe_bookmark_count: Option<u32>,
created_at: DateTime<Utc>,
updated_at: DateTime<Utc>,
}
@@ -295,6 +327,7 @@ impl FromRow<'_, MySqlRow> for MediaFileListItemInternal {
origin_product_category: MediaFileOriginProductCategory::try_from_mysql_row(row, "origin_product_category")?,
maybe_origin_model_type: MediaFileOriginModelType::try_from_mysql_row_nullable(row, "maybe_origin_model_type")?,
maybe_origin_model_token: row.try_get("maybe_origin_model_token")?,
maybe_origin_model_title: row.try_get("maybe_origin_model_title")?,
media_type: MediaFileType::try_from_mysql_row(row, "media_type")?,
public_bucket_directory_hash: row.try_get("public_bucket_directory_hash")?,
maybe_public_bucket_prefix: row.try_get("maybe_public_bucket_prefix")?,
@@ -308,6 +341,9 @@ impl FromRow<'_, MySqlRow> for MediaFileListItemInternal {
updated_at: row.try_get("updated_at")?,
comment_count: row.try_get("comment_count")?,
favorite_count: row.try_get("favorite_count")?,
maybe_ratings_positive_count: row.try_get("maybe_ratings_positive_count")?,
maybe_ratings_negative_count: row.try_get("maybe_ratings_negative_count")?,
maybe_bookmark_count: row.try_get("maybe_bookmark_count")?,
})
}
}
@@ -19,9 +19,13 @@ pub struct MediaFilesByTokensRecord {
pub origin_category: MediaFileOriginCategory,
pub origin_product_category: MediaFileOriginProductCategory,
pub maybe_origin_model_type: Option<MediaFileOriginModelType>,
pub maybe_origin_model_token: Option<String>,
// NB: The title won't be populated for `tts_models` records or non-`model_weights` records.
pub maybe_origin_model_title: Option<String>,
pub public_bucket_directory_hash: String,
pub maybe_public_bucket_prefix: Option<String>,
pub maybe_public_bucket_extension: Option<String>,
@@ -31,6 +35,10 @@ pub struct MediaFilesByTokensRecord {
pub maybe_creator_display_name: Option<String>,
pub maybe_creator_email_gravatar_hash: Option<String>,
pub maybe_ratings_positive_count: Option<u32>,
pub maybe_ratings_negative_count: Option<u32>,
pub maybe_bookmark_count: Option<u32>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
@@ -64,9 +72,12 @@ async fn get_raw_media_files_by_tokens(
m.origin_category,
m.origin_product_category,
m.maybe_origin_model_type,
m.maybe_origin_model_token,
w.title as maybe_origin_model_title,
users.token as maybe_creator_user_token,
users.username as maybe_creator_username,
users.display_name as maybe_creator_display_name,
@@ -76,12 +87,21 @@ async fn get_raw_media_files_by_tokens(
m.maybe_public_bucket_prefix,
m.maybe_public_bucket_extension,
entity_stats.ratings_positive_count as maybe_ratings_positive_count,
entity_stats.ratings_negative_count as maybe_ratings_negative_count,
entity_stats.bookmark_count as maybe_bookmark_count,
m.created_at,
m.updated_at
FROM media_files as m
LEFT OUTER JOIN users
ON users.token = m.maybe_creator_user_token
LEFT OUTER JOIN model_weights as w
ON m.maybe_origin_model_token = w.token
LEFT OUTER JOIN entity_stats
ON entity_stats.entity_type = "media_file"
AND entity_stats.entity_token = m.token
WHERE
m.creator_set_visibility = "public"
AND m.token IN (
@@ -96,9 +116,12 @@ async fn get_raw_media_files_by_tokens(
m.origin_category,
m.origin_product_category,
m.maybe_origin_model_type,
m.maybe_origin_model_token,
w.title as maybe_origin_model_title,
users.token as maybe_creator_user_token,
users.username as maybe_creator_username,
users.display_name as maybe_creator_display_name,
@@ -108,12 +131,21 @@ async fn get_raw_media_files_by_tokens(
m.maybe_public_bucket_prefix,
m.maybe_public_bucket_extension,
entity_stats.ratings_positive_count as maybe_ratings_positive_count,
entity_stats.ratings_negative_count as maybe_ratings_negative_count,
entity_stats.bookmark_count as maybe_bookmark_count,
m.created_at,
m.updated_at
FROM media_files as m
LEFT OUTER JOIN users
ON users.token = m.maybe_creator_user_token
LEFT OUTER JOIN model_weights as w
ON m.maybe_origin_model_token = w.token
LEFT OUTER JOIN entity_stats
ON entity_stats.entity_type = "media_file"
AND entity_stats.entity_token = m.token
WHERE
m.creator_set_visibility = "public"
AND m.user_deleted_at IS NULL
@@ -155,13 +187,19 @@ fn map_to_media_files(dataset:Vec<RawMediaFileJoinUser>) -> Vec<MediaFilesByToke
origin_product_category: media_file.origin_product_category,
maybe_origin_model_type: media_file.maybe_origin_model_type,
maybe_origin_model_token: media_file.maybe_origin_model_token,
maybe_origin_model_title: media_file.maybe_origin_model_title,
maybe_creator_user_token: media_file.maybe_creator_user_token,
maybe_creator_username: media_file.maybe_creator_username,
maybe_creator_display_name: media_file.maybe_creator_display_name,
maybe_creator_email_gravatar_hash: media_file.maybe_creator_email_gravatar_hash,
maybe_ratings_positive_count: media_file.maybe_ratings_positive_count,
maybe_ratings_negative_count: media_file.maybe_ratings_negative_count,
maybe_bookmark_count: media_file.maybe_bookmark_count,
media_type: media_file.media_type,
public_bucket_directory_hash: media_file.public_bucket_directory_hash,
maybe_public_bucket_prefix: media_file.maybe_public_bucket_prefix,
maybe_public_bucket_extension: media_file.maybe_public_bucket_extension,
@@ -182,9 +220,12 @@ fn map_to_media_files(dataset:Vec<RawMediaFileJoinUser>) -> Vec<MediaFilesByToke
pub origin_category: MediaFileOriginCategory,
pub origin_product_category: MediaFileOriginProductCategory,
pub maybe_origin_model_type: Option<MediaFileOriginModelType>,
pub maybe_origin_model_token: Option<String>,
pub maybe_origin_model_title: Option<String>,
pub maybe_creator_user_token: Option<UserToken>,
pub maybe_creator_username: Option<String>,
pub maybe_creator_display_name: Option<String>,
@@ -194,6 +235,10 @@ fn map_to_media_files(dataset:Vec<RawMediaFileJoinUser>) -> Vec<MediaFilesByToke
pub maybe_public_bucket_prefix: Option<String>,
pub maybe_public_bucket_extension: Option<String>,
pub maybe_ratings_positive_count: Option<u32>,
pub maybe_ratings_negative_count: Option<u32>,
pub maybe_bookmark_count: Option<u32>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
@@ -219,6 +264,7 @@ impl FromRow<'_, MySqlRow> for RawMediaFileJoinUser {
origin_product_category: MediaFileOriginProductCategory::try_from_mysql_row(row, "origin_product_category")?,
maybe_origin_model_type: MediaFileOriginModelType::try_from_mysql_row_nullable(row, "maybe_origin_model_type")?,
maybe_origin_model_token: row.try_get("maybe_origin_model_token")?,
maybe_origin_model_title: row.try_get("maybe_origin_model_title")?,
maybe_creator_user_token: row.try_get::<Option<String>, _>("maybe_creator_user_token")?
.and_then(|token| Some(UserToken::new_from_str(&token))),
maybe_creator_username: row.try_get("maybe_creator_username")?,
@@ -227,6 +273,9 @@ impl FromRow<'_, MySqlRow> for RawMediaFileJoinUser {
public_bucket_directory_hash: row.try_get("public_bucket_directory_hash")?,
maybe_public_bucket_prefix: row.try_get("maybe_public_bucket_prefix")?,
maybe_public_bucket_extension: row.try_get("maybe_public_bucket_extension")?,
maybe_ratings_positive_count: row.try_get("maybe_ratings_positive_count")?,
maybe_ratings_negative_count: row.try_get("maybe_ratings_negative_count")?,
maybe_bookmark_count: row.try_get("maybe_bookmark_count")?,
created_at: row.try_get("created_at")?,
updated_at: row.try_get("updated_at")?,
})
@@ -26,8 +26,12 @@ pub struct MediaFileListItem {
pub origin_category: MediaFileOriginCategory,
pub origin_product_category: MediaFileOriginProductCategory,
pub maybe_origin_model_type: Option<MediaFileOriginModelType>,
pub maybe_origin_model_token: Option<String>,
// NB: The title won't be populated for `tts_models` records or non-`model_weights` records.
pub maybe_origin_model_title: Option<String>,
pub media_type: MediaFileType,
pub public_bucket_directory_hash: String,
@@ -36,6 +40,10 @@ pub struct MediaFileListItem {
pub creator_set_visibility: Visibility,
pub maybe_ratings_positive_count: Option<u32>,
pub maybe_ratings_negative_count: Option<u32>,
pub maybe_bookmark_count: Option<u32>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
@@ -93,11 +101,15 @@ pub async fn list_media_files_for_user(args: ListMediaFileForUserArgs<'_>) -> An
origin_product_category: record.origin_product_category,
maybe_origin_model_type: record.maybe_origin_model_type,
maybe_origin_model_token: record.maybe_origin_model_token,
maybe_origin_model_title: record.maybe_origin_model_title,
media_type: record.media_type,
public_bucket_directory_hash: record.public_bucket_directory_hash,
maybe_public_bucket_prefix: record.maybe_public_bucket_prefix,
maybe_public_bucket_extension: record.maybe_public_bucket_extension,
creator_set_visibility: record.creator_set_visibility,
maybe_ratings_positive_count: record.maybe_ratings_positive_count,
maybe_ratings_negative_count: record.maybe_ratings_negative_count,
maybe_bookmark_count: record.maybe_bookmark_count,
created_at: record.created_at,
updated_at: record.updated_at,
}
@@ -118,19 +130,26 @@ fn select_result_fields() -> String {
m.id,
m.token,
m.media_type,
m.origin_category,
m.origin_product_category,
m.maybe_origin_model_type,
m.maybe_origin_model_token,
m.media_type,
w.title as maybe_origin_model_title,
m.public_bucket_directory_hash,
m.maybe_public_bucket_prefix,
m.maybe_public_bucket_extension,
m.creator_set_visibility,
entity_stats.ratings_positive_count as maybe_ratings_positive_count,
entity_stats.ratings_negative_count as maybe_ratings_negative_count,
entity_stats.bookmark_count as maybe_bookmark_count,
m.created_at,
m.updated_at
"#
@@ -163,6 +182,11 @@ SELECT
FROM media_files AS m
LEFT OUTER JOIN users AS u
ON m.maybe_creator_user_token = u.token
LEFT OUTER JOIN model_weights as w
ON m.maybe_origin_model_token = w.token
LEFT OUTER JOIN entity_stats
ON entity_stats.entity_type = "media_file"
AND entity_stats.entity_token = m.token
"#
));
@@ -212,8 +236,12 @@ struct MediaFileListItemInternal {
origin_category: MediaFileOriginCategory,
origin_product_category: MediaFileOriginProductCategory,
maybe_origin_model_type: Option<MediaFileOriginModelType>,
maybe_origin_model_token: Option<String>,
// NB: The title won't be populated for `tts_models` records or non-`model_weights` records.
maybe_origin_model_title: Option<String>,
media_type: MediaFileType,
public_bucket_directory_hash: String,
@@ -222,6 +250,10 @@ struct MediaFileListItemInternal {
creator_set_visibility: Visibility,
maybe_ratings_positive_count: Option<u32>,
maybe_ratings_negative_count: Option<u32>,
maybe_bookmark_count: Option<u32>,
created_at: DateTime<Utc>,
updated_at: DateTime<Utc>,
}
@@ -247,11 +279,15 @@ impl FromRow<'_, MySqlRow> for MediaFileListItemInternal {
origin_product_category: MediaFileOriginProductCategory::try_from_mysql_row(row, "origin_product_category")?,
maybe_origin_model_type: MediaFileOriginModelType::try_from_mysql_row_nullable(row, "maybe_origin_model_type")?,
maybe_origin_model_token: row.try_get("maybe_origin_model_token")?,
maybe_origin_model_title: row.try_get("maybe_origin_model_title")?,
media_type: MediaFileType::try_from_mysql_row(row, "media_type")?,
public_bucket_directory_hash: row.try_get("public_bucket_directory_hash")?,
maybe_public_bucket_prefix: row.try_get("maybe_public_bucket_prefix")?,
maybe_public_bucket_extension: row.try_get("maybe_public_bucket_extension")?,
creator_set_visibility: Visibility::try_from_mysql_row(row, "creator_set_visibility")?,
maybe_ratings_positive_count: row.try_get("maybe_ratings_positive_count")?,
maybe_ratings_negative_count: row.try_get("maybe_ratings_negative_count")?,
maybe_bookmark_count: row.try_get("maybe_bookmark_count")?,
created_at: row.try_get("created_at")?,
updated_at: row.try_get("updated_at")?,
})
@@ -43,11 +43,9 @@ pub struct RetrievedModelWeight {
pub maybe_cover_image_public_bucket_prefix: Option<String>,
pub maybe_cover_image_public_bucket_extension: Option<String>,
//pub cached_user_ratings_negative_count: u32,
//pub cached_user_ratings_positive_count: u32,
//pub cached_user_ratings_total_count: u32,
//pub maybe_cached_user_ratings_ratio: Option<f32>,
//pub cached_user_ratings_last_updated_at: DateTime<Utc>,
pub maybe_ratings_positive_count: Option<u32>,
pub maybe_ratings_negative_count: Option<u32>,
pub maybe_bookmark_count: Option<u32>,
pub version: i32,
pub created_at: DateTime<Utc>,
@@ -114,11 +112,9 @@ pub async fn get_weights_by_token_with_connection(
maybe_cover_image_public_bucket_hash: record.maybe_cover_image_public_bucket_hash,
maybe_cover_image_public_bucket_prefix: record.maybe_cover_image_public_bucket_prefix,
maybe_cover_image_public_bucket_extension: record.maybe_cover_image_public_bucket_extension,
//cached_user_ratings_negative_count: record.cached_user_ratings_negative_count,
//cached_user_ratings_positive_count: record.cached_user_ratings_positive_count,
//cached_user_ratings_total_count: record.cached_user_ratings_total_count,
//maybe_cached_user_ratings_ratio: record.maybe_cached_user_ratings_ratio,
//cached_user_ratings_last_updated_at: record.cached_user_ratings_last_updated_at,
maybe_ratings_positive_count: record.maybe_ratings_positive_count,
maybe_ratings_negative_count: record.maybe_ratings_negative_count,
maybe_bookmark_count: record.maybe_bookmark_count,
version: record.version,
created_at: record.created_at,
updated_at: record.updated_at,
@@ -165,6 +161,10 @@ async fn select_include_deleted(
cover_image.maybe_public_bucket_prefix as maybe_cover_image_public_bucket_prefix,
cover_image.maybe_public_bucket_extension as maybe_cover_image_public_bucket_extension,
entity_stats.ratings_positive_count as maybe_ratings_positive_count,
entity_stats.ratings_negative_count as maybe_ratings_negative_count,
entity_stats.bookmark_count as maybe_bookmark_count,
wt.version,
wt.created_at,
wt.updated_at,
@@ -175,6 +175,9 @@ async fn select_include_deleted(
ON users.token = wt.creator_user_token
LEFT OUTER JOIN media_files as cover_image
ON cover_image.token = wt.maybe_cover_image_media_file_token
LEFT OUTER JOIN entity_stats
ON entity_stats.entity_type = "model_weight"
AND entity_stats.entity_token = wt.token
WHERE
wt.token = ?
"#,
@@ -221,6 +224,10 @@ async fn select_without_deleted(
cover_image.maybe_public_bucket_prefix as maybe_cover_image_public_bucket_prefix,
cover_image.maybe_public_bucket_extension as maybe_cover_image_public_bucket_extension,
entity_stats.ratings_positive_count as maybe_ratings_positive_count,
entity_stats.ratings_negative_count as maybe_ratings_negative_count,
entity_stats.bookmark_count as maybe_bookmark_count,
wt.version,
wt.created_at,
wt.updated_at,
@@ -231,6 +238,9 @@ async fn select_without_deleted(
ON users.token = wt.creator_user_token
LEFT OUTER JOIN media_files as cover_image
ON cover_image.token = wt.maybe_cover_image_media_file_token
LEFT OUTER JOIN entity_stats
ON entity_stats.entity_type = "model_weight"
AND entity_stats.entity_token = wt.token
WHERE
wt.token = ?
AND wt.user_deleted_at IS NULL
@@ -271,11 +281,9 @@ pub struct RawWeight {
pub maybe_cover_image_public_bucket_prefix: Option<String>,
pub maybe_cover_image_public_bucket_extension: Option<String>,
//pub cached_user_ratings_negative_count: u32,
//pub cached_user_ratings_positive_count: u32,
//pub cached_user_ratings_total_count: u32,
//pub maybe_cached_user_ratings_ratio: Option<f32>,
//pub cached_user_ratings_last_updated_at: DateTime<Utc>,
pub maybe_ratings_positive_count: Option<u32>,
pub maybe_ratings_negative_count: Option<u32>,
pub maybe_bookmark_count: Option<u32>,
pub version: i32,
pub created_at: DateTime<Utc>,
@@ -0,0 +1,225 @@
use anyhow::anyhow;
use chrono::{DateTime, Utc};
use log::warn;
use sqlx::{MySql, MySqlPool};
use sqlx::pool::PoolConnection;
use enums::by_table::model_weights::weights_category::WeightsCategory;
use enums::by_table::model_weights::weights_types::WeightsType;
use enums::common::visibility::Visibility;
use errors::AnyhowResult;
use tokens::tokens::media_files::MediaFileToken;
use tokens::tokens::model_weights::ModelWeightToken;
use tokens::tokens::users::UserToken;
/// This is meant to be the entire table
#[derive(Debug)]
pub struct ModelWeightForElasticsearchRecord {
pub id: i64,
pub token: ModelWeightToken,
pub creator_set_visibility: Visibility,
pub weights_type: WeightsType,
pub weights_category: WeightsCategory,
pub title: String,
// Cover images
pub maybe_cover_image_media_file_token: Option<MediaFileToken>,
pub maybe_cover_image_public_bucket_hash: Option<String>,
pub maybe_cover_image_public_bucket_prefix: Option<String>,
pub maybe_cover_image_public_bucket_extension: Option<String>,
// Creator
pub creator_user_token: UserToken,
pub creator_username: String,
pub creator_display_name: String,
pub creator_gravatar_hash: String,
// Statistics
pub maybe_ratings_positive_count: Option<u32>,
pub maybe_ratings_negative_count: Option<u32>,
pub maybe_bookmark_count: Option<u32>,
// TTS extensions
pub maybe_tts_ietf_language_tag: Option<String>,
pub maybe_tts_ietf_primary_language_subtag: Option<String>,
// VC extensions
pub maybe_voice_conversion_ietf_language_tag: Option<String>,
pub maybe_voice_conversion_ietf_primary_language_subtag: Option<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub user_deleted_at: Option<DateTime<Utc>>,
pub mod_deleted_at: Option<DateTime<Utc>>,
}
pub async fn list_model_weights_for_elastic_search_backfill_using_cursor(
mysql_pool: &MySqlPool,
page_size: u64,
cursor: u64,
) -> AnyhowResult<Vec<ModelWeightForElasticsearchRecord>> {
let mut connection = mysql_pool.acquire().await?;
let maybe_models
= list_model_weights(&mut connection, page_size, cursor)
.await;
let models : Vec<RawRecord> = match maybe_models {
Ok(models) => models,
Err(sqlx::error::Error::RowNotFound) => return Ok(Vec::new()),
Err(err) => {
warn!("vc model list query error: {:?}", err);
return Err(anyhow!("vc model list query error"));
}
};
Ok(models.into_iter()
.map(|model| {
ModelWeightForElasticsearchRecord {
id: model.id,
token: model.token,
title: model.title,
weights_type: model.weights_type,
weights_category: model.weights_category,
maybe_cover_image_media_file_token: model.maybe_cover_image_media_file_token,
maybe_cover_image_public_bucket_hash: model.maybe_cover_image_public_bucket_hash,
maybe_cover_image_public_bucket_prefix: model.maybe_cover_image_public_bucket_prefix,
maybe_cover_image_public_bucket_extension: model.maybe_cover_image_public_bucket_extension,
creator_user_token: model.creator_user_token,
creator_username: model.creator_username,
creator_display_name: model.creator_display_name,
creator_gravatar_hash: model.creator_gravatar_hash,
maybe_tts_ietf_language_tag: model.maybe_tts_ietf_language_tag,
maybe_tts_ietf_primary_language_subtag: model.maybe_tts_ietf_primary_language_subtag,
maybe_voice_conversion_ietf_language_tag: model.maybe_vc_ietf_language_tag,
maybe_voice_conversion_ietf_primary_language_subtag: model.maybe_vc_ietf_primary_language_subtag,
maybe_ratings_positive_count: model.maybe_ratings_positive_count,
maybe_ratings_negative_count: model.maybe_ratings_negative_count,
maybe_bookmark_count: model.maybe_bookmark_count,
creator_set_visibility: model.creator_set_visibility,
created_at: model.created_at,
updated_at: model.updated_at,
user_deleted_at: model.user_deleted_at,
mod_deleted_at: model.mod_deleted_at,
}
})
.collect::<Vec<ModelWeightForElasticsearchRecord>>())
}
async fn list_model_weights(
mysql_connection: &mut PoolConnection<MySql>,
page_size: u64,
cursor: u64,
) -> Result<Vec<RawRecord>, sqlx::Error> {
Ok(sqlx::query_as!(
RawRecord,
r#"
SELECT
w.id,
w.token as `token: tokens::tokens::model_weights::ModelWeightToken`,
w.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,
w.weights_type as `weights_type: enums::by_table::model_weights::weights_types::WeightsType`,
w.weights_category as `weights_category: enums::by_table::model_weights::weights_category::WeightsCategory`,
w.title,
cover_image.token as `maybe_cover_image_media_file_token: tokens::tokens::media_files::MediaFileToken`,
cover_image.public_bucket_directory_hash as maybe_cover_image_public_bucket_hash,
cover_image.maybe_public_bucket_prefix as maybe_cover_image_public_bucket_prefix,
cover_image.maybe_public_bucket_extension as maybe_cover_image_public_bucket_extension,
w.creator_user_token as `creator_user_token: tokens::tokens::users::UserToken`,
users.username as creator_username,
users.display_name as creator_display_name,
users.email_gravatar_hash as creator_gravatar_hash,
entity_stats.ratings_positive_count as maybe_ratings_positive_count,
entity_stats.ratings_negative_count as maybe_ratings_negative_count,
entity_stats.bookmark_count as maybe_bookmark_count,
extension_tts.ietf_language_tag as maybe_tts_ietf_language_tag,
extension_tts.ietf_primary_language_subtag as maybe_tts_ietf_primary_language_subtag,
extension_vc.ietf_language_tag as maybe_vc_ietf_language_tag,
extension_vc.ietf_primary_language_subtag as maybe_vc_ietf_primary_language_subtag,
w.created_at,
w.updated_at,
w.user_deleted_at,
w.mod_deleted_at
FROM model_weights as w
JOIN users
ON users.token = w.creator_user_token
LEFT OUTER JOIN model_weights_extension_tts_details as extension_tts
ON extension_tts.model_weights_token = w.token
LEFT OUTER JOIN model_weights_extension_voice_conversion_details as extension_vc
ON extension_vc.model_weights_token = w.token
LEFT OUTER JOIN entity_stats
ON entity_stats.entity_type = "model_weights"
AND entity_stats.entity_token = w.token
LEFT OUTER JOIN media_files as cover_image
ON cover_image.token = w.maybe_cover_image_media_file_token
WHERE
w.id > ?
ORDER BY id ASC
LIMIT ?
"#,
cursor,
page_size
)
.fetch_all(&mut **mysql_connection)
.await?)
}
struct RawRecord {
pub id: i64,
pub token: ModelWeightToken,
pub creator_set_visibility: Visibility,
pub weights_type: WeightsType,
pub weights_category: WeightsCategory,
pub title: String,
// Cover images
pub maybe_cover_image_media_file_token: Option<MediaFileToken>,
pub maybe_cover_image_public_bucket_hash: Option<String>,
pub maybe_cover_image_public_bucket_prefix: Option<String>,
pub maybe_cover_image_public_bucket_extension: Option<String>,
// Creator
pub creator_user_token: UserToken,
pub creator_username: String,
pub creator_display_name: String,
pub creator_gravatar_hash: String,
// Statistics
pub maybe_ratings_positive_count: Option<u32>,
pub maybe_ratings_negative_count: Option<u32>,
pub maybe_bookmark_count: Option<u32>,
// TTS extensions
pub maybe_tts_ietf_language_tag: Option<String>,
pub maybe_tts_ietf_primary_language_subtag: Option<String>,
// Voice conversion extensions
pub maybe_vc_ietf_language_tag: Option<String>,
pub maybe_vc_ietf_primary_language_subtag: Option<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub user_deleted_at: Option<DateTime<Utc>>,
pub mod_deleted_at: Option<DateTime<Utc>>,
}
@@ -0,0 +1,153 @@
use anyhow::anyhow;
use chrono::{DateTime, Utc};
use sqlx::MySql;
use sqlx::pool::PoolConnection;
use enums::by_table::model_weights::weights_types::WeightsType;
use enums::common::visibility::Visibility;
use errors::AnyhowResult;
use tokens::tokens::model_weights::ModelWeightToken;
use tokens::tokens::users::UserToken;
#[derive(Serialize, Clone)]
pub struct ModelWeightForTts {
pub token: ModelWeightToken,
pub weight_type: WeightsType,
pub title: String,
// We only supported tacotron2 in the legacy case
//pub tts_model_type: String,
pub ietf_language_tag: String,
pub ietf_primary_language_subtag: String,
pub creator_user_token: UserToken,
pub creator_username: String,
pub creator_display_name: String,
pub creator_gravatar_hash: String,
// NB: We won't port these...
//pub is_locked_from_use: bool,
//pub is_front_page_featured: bool,
//pub is_twitch_featured: bool,
//pub maybe_suggested_unique_bot_command: Option<String>,
//pub user_ratings_positive_count: u32,
//pub user_ratings_negative_count: u32,
//pub user_ratings_total_count: u32, // NB: Does not include "neutral" ratings.
pub creator_set_visibility: Visibility,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
// TODO(bt,2024-01-13): This is written to support the migration to the `model_weights`
// table from the `tts_models` table. We should write a more cross-cutting
// query to treat this not as a special cased thing. All weights should be listable.
/// This is to support the tts model list page.
/// Later this will be migrated or replaced with a more generic query.
pub async fn list_model_weights_for_text_to_speech(
mysql_connection: &mut PoolConnection<MySql>,
) -> AnyhowResult<Vec<ModelWeightForTts>> {
let models =
list_tts_models_for_all_creators(mysql_connection).await?;
Ok(models.into_iter()
.map(|model| {
ModelWeightForTts {
token: model.token,
weight_type: model.weight_type,
creator_user_token: model.creator_user_token,
creator_username: model.creator_username,
creator_display_name: model.creator_display_name,
creator_gravatar_hash: model.creator_gravatar_hash,
title: model.title,
ietf_language_tag: model.ietf_language_tag.unwrap_or("en".to_string()),
ietf_primary_language_subtag: model.ietf_primary_language_subtag.unwrap_or("en".to_string()),
creator_set_visibility: model.creator_set_visibility,
created_at: model.created_at,
updated_at: model.updated_at,
}
})
.collect::<Vec<ModelWeightForTts>>())
}
async fn list_tts_models_for_all_creators(
mysql_connection: &mut PoolConnection<MySql>,
) -> AnyhowResult<Vec<RawModelWeightForTts>> {
// NB: Scoped to only tt2 weights
let maybe_results = sqlx::query_as!(
RawModelWeightForTts,
r#"
SELECT
w.token as `token: tokens::tokens::model_weights::ModelWeightToken`,
w.weights_type as `weight_type: enums::by_table::model_weights::weights_types::WeightsType`,
w.title,
w.creator_user_token as `creator_user_token: tokens::tokens::users::UserToken`,
users.username as creator_username,
users.display_name as creator_display_name,
users.email_gravatar_hash as creator_gravatar_hash,
w_extension.ietf_language_tag,
w_extension.ietf_primary_language_subtag,
w.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,
w.created_at,
w.updated_at
FROM model_weights as w
LEFT OUTER JOIN model_weights_extension_tts_details as w_extension
ON w_extension.model_weights_token = w.token
JOIN users
ON users.token = w.creator_user_token
WHERE
w.weights_type IN ("tt2")
AND w.user_deleted_at IS NULL
AND w.mod_deleted_at IS NULL
"#
)
.fetch_all(&mut **mysql_connection)
.await;
match maybe_results {
Ok(results) => Ok(results),
Err(err) => match err {
sqlx::Error::RowNotFound => Ok(Vec::new()),
_ => {
Err(anyhow!("error querying : {:?}", err))
}
}
}
}
struct RawModelWeightForTts {
pub token: ModelWeightToken,
pub weight_type: WeightsType,
pub title: String,
// We only supported tacotron2 in the legacy case
//pub tts_model_type: String,
pub ietf_language_tag: Option<String>,
pub ietf_primary_language_subtag: Option<String>,
pub creator_user_token: UserToken,
pub creator_username: String,
pub creator_display_name: String,
pub creator_gravatar_hash: String,
// NB: We won't port these...
//pub is_locked_from_use: bool,
//pub is_front_page_featured: bool,
//pub is_twitch_featured: bool,
//pub maybe_suggested_unique_bot_command: Option<String>,
//pub user_ratings_positive_count: u32,
//pub user_ratings_negative_count: u32,
//pub user_ratings_total_count: u32, // NB: Does not include "neutral" ratings.
pub creator_set_visibility: Visibility,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
@@ -33,11 +33,9 @@ pub struct WeightsByTokensRecord {
pub maybe_cover_image_public_bucket_prefix: Option<String>,
pub maybe_cover_image_public_bucket_extension: Option<String>,
//pub cached_user_ratings_total_count: u32,
//pub cached_user_ratings_positive_count: u32,
//pub cached_user_ratings_negative_count: u32,
//pub maybe_cached_user_ratings_ratio: Option<f32>,
//pub cached_user_ratings_last_updated_at: DateTime<Utc>,
pub maybe_ratings_positive_count: Option<u32>,
pub maybe_ratings_negative_count: Option<u32>,
pub maybe_bookmark_count: Option<u32>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
@@ -83,11 +81,9 @@ async fn get_raw_weights_by_tokens(
cover_image.public_bucket_directory_hash as maybe_cover_image_public_bucket_hash,
cover_image.maybe_public_bucket_prefix as maybe_cover_image_public_bucket_prefix,
cover_image.maybe_public_bucket_extension as maybe_cover_image_public_bucket_extension,
mw.cached_user_ratings_negative_count,
mw.cached_user_ratings_positive_count,
mw.cached_user_ratings_total_count,
mw.maybe_cached_user_ratings_ratio,
mw.cached_user_ratings_last_updated_at,
entity_stats.ratings_positive_count as maybe_ratings_positive_count,
entity_stats.ratings_negative_count as maybe_ratings_negative_count,
entity_stats.bookmark_count as maybe_bookmark_count,
mw.created_at,
mw.updated_at,
mw.user_deleted_at,
@@ -97,6 +93,9 @@ async fn get_raw_weights_by_tokens(
ON users.token = mw.creator_user_token
LEFT OUTER JOIN media_files as cover_image
ON cover_image.token = mw.maybe_cover_image_media_file_token
LEFT OUTER JOIN entity_stats
ON entity_stats.entity_type = "model_weights"
AND entity_stats.entity_token = mw.token
WHERE
mw.creator_set_visibility = "public"
AND mw.token IN (
@@ -120,11 +119,9 @@ async fn get_raw_weights_by_tokens(
cover_image.public_bucket_directory_hash as maybe_cover_image_public_bucket_hash,
cover_image.maybe_public_bucket_prefix as maybe_cover_image_public_bucket_prefix,
cover_image.maybe_public_bucket_extension as maybe_cover_image_public_bucket_extension,
mw.cached_user_ratings_negative_count,
mw.cached_user_ratings_positive_count,
mw.cached_user_ratings_total_count,
mw.maybe_cached_user_ratings_ratio,
mw.cached_user_ratings_last_updated_at,
entity_stats.ratings_positive_count as maybe_ratings_positive_count,
entity_stats.ratings_negative_count as maybe_ratings_negative_count,
entity_stats.bookmark_count as maybe_bookmark_count,
mw.created_at,
mw.updated_at,
mw.user_deleted_at,
@@ -134,6 +131,9 @@ async fn get_raw_weights_by_tokens(
ON users.token = mw.creator_user_token
LEFT OUTER JOIN media_files as cover_image
ON cover_image.token = mw.maybe_cover_image_media_file_token
LEFT OUTER JOIN entity_stats
ON entity_stats.entity_type = "model_weights"
AND entity_stats.entity_token = mw.token
WHERE
mw.creator_set_visibility = "public"
AND mw.user_deleted_at IS NULL
@@ -187,11 +187,9 @@ fn map_to_weights(dataset:Vec<RawWeightJoinUser>) -> Vec<WeightsByTokensRecord>
maybe_cover_image_public_bucket_prefix: weight.maybe_cover_image_public_bucket_prefix,
maybe_cover_image_public_bucket_extension: weight.maybe_cover_image_public_bucket_extension,
//cached_user_ratings_negative_count: weight.cached_user_ratings_negative_count,
//cached_user_ratings_positive_count: weight.cached_user_ratings_positive_count,
//cached_user_ratings_total_count: weight.cached_user_ratings_total_count,
//maybe_cached_user_ratings_ratio: weight.maybe_cached_user_ratings_ratio,
//cached_user_ratings_last_updated_at: weight.cached_user_ratings_last_updated_at,
maybe_ratings_positive_count: weight.maybe_ratings_positive_count,
maybe_ratings_negative_count: weight.maybe_ratings_negative_count,
maybe_bookmark_count: weight.maybe_bookmark_count,
created_at: weight.created_at,
updated_at: weight.updated_at,
@@ -225,12 +223,10 @@ fn map_to_weights(dataset:Vec<RawWeightJoinUser>) -> Vec<WeightsByTokensRecord>
pub maybe_cover_image_public_bucket_prefix: Option<String>,
pub maybe_cover_image_public_bucket_extension: Option<String>,
//pub cached_user_ratings_total_count: u32,
//pub cached_user_ratings_positive_count: u32,
//pub cached_user_ratings_negative_count: u32,
//pub maybe_cached_user_ratings_ratio: Option<f32>,
//pub cached_user_ratings_last_updated_at: DateTime<Utc>,
pub maybe_ratings_positive_count: Option<u32>,
pub maybe_ratings_negative_count: Option<u32>,
pub maybe_bookmark_count: Option<u32>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub user_deleted_at: Option<DateTime<Utc>>,
@@ -266,11 +262,9 @@ impl FromRow<'_, MySqlRow> for RawWeightJoinUser {
maybe_cover_image_public_bucket_hash: row.try_get("maybe_cover_image_public_bucket_hash")?,
maybe_cover_image_public_bucket_prefix: row.try_get("maybe_cover_image_public_bucket_prefix")?,
maybe_cover_image_public_bucket_extension: row.try_get("maybe_cover_image_public_bucket_extension")?,
//cached_user_ratings_total_count: row.try_get("cached_user_ratings_total_count")?,
//cached_user_ratings_positive_count: row.try_get("cached_user_ratings_positive_count")?,
//cached_user_ratings_negative_count: row.try_get("cached_user_ratings_negative_count")?,
//maybe_cached_user_ratings_ratio: row.try_get("maybe_cached_user_ratings_ratio")?,
//cached_user_ratings_last_updated_at: row.try_get("cached_user_ratings_last_updated_at")?,
maybe_ratings_positive_count: row.try_get("maybe_ratings_positive_count")?,
maybe_ratings_negative_count: row.try_get("maybe_ratings_negative_count")?,
maybe_bookmark_count: row.try_get("maybe_bookmark_count")?,
created_at: row.try_get("created_at")?,
updated_at: row.try_get("updated_at")?,
user_deleted_at: row.try_get("user_deleted_at")?,
@@ -55,13 +55,11 @@ pub struct WeightsJoinUserRecord {
pub maybe_cover_image_public_bucket_hash: Option<String>,
pub maybe_cover_image_public_bucket_prefix: Option<String>,
pub maybe_cover_image_public_bucket_extension: Option<String>,
pub cached_user_ratings_total_count: u32,
pub cached_user_ratings_positive_count: u32,
pub cached_user_ratings_negative_count: u32,
pub maybe_cached_user_ratings_ratio: Option<f32>,
pub cached_user_ratings_last_updated_at: DateTime<Utc>,
pub maybe_ratings_positive_count: Option<u32>,
pub maybe_ratings_negative_count: Option<u32>,
pub maybe_bookmark_count: Option<u32>,
pub version: i32,
pub created_at: DateTime<Utc>,
@@ -165,11 +163,10 @@ fn select_result_fields() -> String {
cover_image.maybe_public_bucket_prefix as maybe_cover_image_public_bucket_prefix,
cover_image.maybe_public_bucket_extension as maybe_cover_image_public_bucket_extension,
mw.cached_user_ratings_negative_count,
mw.cached_user_ratings_positive_count,
mw.cached_user_ratings_total_count,
mw.maybe_cached_user_ratings_ratio,
mw.cached_user_ratings_last_updated_at,
entity_stats.ratings_positive_count as maybe_ratings_positive_count,
entity_stats.ratings_negative_count as maybe_ratings_negative_count,
entity_stats.bookmark_count as maybe_bookmark_count,
mw.version,
mw.created_at,
mw.updated_at,
@@ -200,6 +197,9 @@ JOIN users as u
ON u.token = mw.creator_user_token
LEFT OUTER JOIN media_files as cover_image
ON cover_image.token = mw.maybe_cover_image_media_file_token
LEFT OUTER JOIN entity_stats
ON entity_stats.entity_type = "model_weights"
AND entity_stats.entity_token = mw.token
"#
));
@@ -272,12 +272,10 @@ async fn map_to_weights(dataset:Vec<RawWeightJoinUser>) -> Vec<WeightsJoinUserRe
maybe_cover_image_public_bucket_prefix: weight.maybe_cover_image_public_bucket_prefix,
maybe_cover_image_public_bucket_extension: weight.maybe_cover_image_public_bucket_extension,
cached_user_ratings_negative_count: weight.cached_user_ratings_negative_count,
cached_user_ratings_positive_count: weight.cached_user_ratings_positive_count,
cached_user_ratings_total_count: weight.cached_user_ratings_total_count,
maybe_ratings_positive_count: weight.maybe_ratings_positive_count,
maybe_ratings_negative_count: weight.maybe_ratings_negative_count,
maybe_bookmark_count: weight.maybe_bookmark_count,
maybe_cached_user_ratings_ratio: weight.maybe_cached_user_ratings_ratio,
cached_user_ratings_last_updated_at: weight.cached_user_ratings_last_updated_at,
version: weight.version,
created_at: weight.created_at,
updated_at: weight.updated_at,
@@ -327,12 +325,10 @@ async fn map_to_weights(dataset:Vec<RawWeightJoinUser>) -> Vec<WeightsJoinUserRe
pub maybe_cover_image_public_bucket_prefix: Option<String>,
pub maybe_cover_image_public_bucket_extension: Option<String>,
pub cached_user_ratings_total_count: u32,
pub cached_user_ratings_positive_count: u32,
pub cached_user_ratings_negative_count: u32,
pub maybe_cached_user_ratings_ratio: Option<f32>,
pub cached_user_ratings_last_updated_at: DateTime<Utc>,
pub maybe_ratings_positive_count: Option<u32>,
pub maybe_ratings_negative_count: Option<u32>,
pub maybe_bookmark_count: Option<u32>,
pub version: i32,
pub created_at: DateTime<Utc>,
@@ -371,11 +367,9 @@ impl FromRow<'_, MySqlRow> for RawWeightJoinUser {
maybe_cover_image_public_bucket_hash: row.try_get("maybe_cover_image_public_bucket_hash")?,
maybe_cover_image_public_bucket_prefix: row.try_get("maybe_cover_image_public_bucket_prefix")?,
maybe_cover_image_public_bucket_extension: row.try_get("maybe_cover_image_public_bucket_extension")?,
cached_user_ratings_total_count: row.try_get("cached_user_ratings_total_count")?,
cached_user_ratings_positive_count: row.try_get("cached_user_ratings_positive_count")?,
cached_user_ratings_negative_count: row.try_get("cached_user_ratings_negative_count")?,
maybe_cached_user_ratings_ratio: row.try_get("maybe_cached_user_ratings_ratio")?,
cached_user_ratings_last_updated_at: row.try_get("cached_user_ratings_last_updated_at")?,
maybe_ratings_positive_count: row.try_get("maybe_ratings_positive_count")?,
maybe_ratings_negative_count: row.try_get("maybe_ratings_negative_count")?,
maybe_bookmark_count: row.try_get("maybe_bookmark_count")?,
version: row.try_get("version")?,
created_at: row.try_get("created_at")?,
updated_at: row.try_get("updated_at")?,
@@ -59,23 +59,20 @@ pub struct WeightJoinUser {
pub maybe_cover_image_public_bucket_prefix: Option<String>,
pub maybe_cover_image_public_bucket_extension: Option<String>,
//pub cached_user_ratings_total_count: u32,
//pub cached_user_ratings_positive_count: u32,
//pub cached_user_ratings_negative_count: u32,
//pub maybe_cached_user_ratings_ratio: Option<f32>,
//pub cached_user_ratings_last_updated_at: DateTime<Utc>,
pub creator_username: String,
pub creator_display_name: String,
pub creator_email_gravatar_hash: String,
pub maybe_ratings_positive_count: Option<u32>,
pub maybe_ratings_negative_count: Option<u32>,
pub maybe_bookmark_count: Option<u32>,
pub version: i32,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub user_deleted_at: Option<DateTime<Utc>>,
pub mod_deleted_at: Option<DateTime<Utc>>,
pub creator_username: String,
pub creator_display_name: String,
pub creator_email_gravatar_hash: String,
}
pub struct ListWeightsQueryBuilder {
@@ -237,19 +234,17 @@ impl ListWeightsQueryBuilder {
maybe_cover_image_public_bucket_hash: record.maybe_cover_image_public_bucket_hash,
maybe_cover_image_public_bucket_prefix: record.maybe_cover_image_public_bucket_prefix,
maybe_cover_image_public_bucket_extension: record.maybe_cover_image_public_bucket_extension,
//cached_user_ratings_total_count: record.cached_user_ratings_total_count,
//cached_user_ratings_positive_count: record.cached_user_ratings_positive_count,
//cached_user_ratings_negative_count: record.cached_user_ratings_negative_count,
//maybe_cached_user_ratings_ratio: record.maybe_cached_user_ratings_ratio,
//cached_user_ratings_last_updated_at: record.cached_user_ratings_last_updated_at,
creator_username: record.creator_username,
creator_display_name: record.creator_display_name,
creator_email_gravatar_hash: record.creator_email_gravatar_hash,
maybe_ratings_positive_count: record.maybe_ratings_positive_count,
maybe_ratings_negative_count: record.maybe_ratings_negative_count,
maybe_bookmark_count: record.maybe_bookmark_count,
version: record.version,
created_at: record.created_at,
updated_at: record.updated_at,
user_deleted_at: record.user_deleted_at,
mod_deleted_at: record.mod_deleted_at,
creator_username: record.creator_username,
creator_display_name: record.creator_display_name,
creator_email_gravatar_hash: record.creator_email_gravatar_hash,
}
})
.collect::<Vec<WeightJoinUser>>();
@@ -294,12 +289,18 @@ impl ListWeightsQueryBuilder {
model_weights.mod_deleted_at,
users.username AS creator_username,
users.display_name AS creator_display_name,
users.email_gravatar_hash AS creator_email_gravatar_hash
FROM model_weights
users.email_gravatar_hash AS creator_email_gravatar_hash,
entity_stats.ratings_positive_count as maybe_ratings_positive_count,
entity_stats.ratings_negative_count as maybe_ratings_negative_count,
entity_stats.bookmark_count as maybe_bookmark_count
FROM model_weights
JOIN users
ON users.token = model_weights.creator_user_token
LEFT OUTER JOIN media_files as cover_image
ON cover_image.token = model_weights.maybe_cover_image_media_file_token
LEFT OUTER JOIN entity_stats
ON entity_stats.entity_type = "model_weight"
AND entity_stats.entity_token = model_weights.token
"#.to_string();
query.push_str(&self.build_predicates());
@@ -443,11 +444,13 @@ struct RawWeightJoinUser {
pub maybe_cover_image_public_bucket_prefix: Option<String>,
pub maybe_cover_image_public_bucket_extension: Option<String>,
//pub cached_user_ratings_total_count: u32,
//pub cached_user_ratings_positive_count: u32,
//pub cached_user_ratings_negative_count: u32,
//pub maybe_cached_user_ratings_ratio: Option<f32>,
//pub cached_user_ratings_last_updated_at: DateTime<Utc>,
pub creator_username: String,
pub creator_display_name: String,
pub creator_email_gravatar_hash: String,
pub maybe_ratings_positive_count: Option<u32>,
pub maybe_ratings_negative_count: Option<u32>,
pub maybe_bookmark_count: Option<u32>,
pub version: i32,
@@ -456,10 +459,6 @@ struct RawWeightJoinUser {
pub user_deleted_at: Option<DateTime<Utc>>,
pub mod_deleted_at: Option<DateTime<Utc>>,
pub creator_username: String,
pub creator_display_name: String,
pub creator_email_gravatar_hash: String,
}
#[cfg(test)]
@@ -1,3 +1,5 @@
pub mod list_model_weights_for_elastic_search_backfill_using_cursor;
pub mod list_model_weights_for_text_to_speech;
pub mod list_model_weights_for_voice_conversion;
pub mod list_weights_by_tokens;
pub mod list_weights_by_user;

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