diff --git a/.docs/api/data-service.md b/.docs/api/data-service.md index 64f03976132352cea195c6c231e3cc16ebc3d54b..257c68c1957fa697957c9dfc3f6b681693ac3f9d 100644 --- a/.docs/api/data-service.md +++ b/.docs/api/data-service.md @@ -28,8 +28,23 @@ The Data Service is responsible for inserting AMQP tuples from the Broker Servic via [Spring AMQP](https://docs.spring.io/spring-amqp/reference/html/). To increase the number of consumers, scale the Data Service up. +## Data Processing + +The Data Service uses [Apache Spark](https://spark.apache.org/), a data engine to load data from/into +the [Data Database](../data-db) with a wide range of open-source connectors. The default deployment uses a local mode of +embedded processing directly in the service until there exists +a [Bitnami Chart](https://artifacthub.io/packages/helm/bitnami/spark) for Spark 4. + +Retrieving data from a subset internally generates a view with the 64-character hash of the query. This view is not +automatically deleted currently. + ## Limitations +* Views in DBRepo can only have 63-character length (it is assumed only internal views have the maximum length of 64 + characters). +* Local mode of embedded processing of Apache Spark directly in the service using + a [`local[2]`](https://spark.apache.org/docs/latest/#running-the-examples-and-shell) configuration. + !!! question "Do you miss functionality? Do these limitations affect you?" We strongly encourage you to help us implement it as we are welcoming contributors to open-source software and get diff --git a/.docs/api/ui.md b/.docs/api/ui.md index 08e21b1c26e8ad6a25ca548de475c76ae82e5dc8..30b32c0a0ccde771c8bde22f21ca630d6354a9b3 100644 --- a/.docs/api/ui.md +++ b/.docs/api/ui.md @@ -101,7 +101,8 @@ See the [API Overview](..) page for detailed examples. ## Limitations -(none) +* When developing locally, the `axios` module does not parse custom headers (such as `X-Count`, `X-Headers`) and/or + blocks CORS requests wrongfully. !!! question "Do you miss functionality? Do these limitations affect you?" diff --git a/.docs/changelog.md b/.docs/changelog.md index 98a65bf4cebdc205490b2cdfd7e1e0ee72f13984..429f6933b649570531700cbf2265c43b34329c5d 100644 --- a/.docs/changelog.md +++ b/.docs/changelog.md @@ -2,6 +2,17 @@ author: Martin Weise --- +## v1.5.3 (2024-12-13) + +[:simple-gitlab: GitLab Release](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tags/v1.5.3) + +### What's Changed + +#### Fixes + +* Fixed a bug where subsets containing sub-queries are not able to retrieve data + in [#476](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/476). + ## v1.5.2 (2024-12-03) [:simple-gitlab: GitLab Release](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tags/v1.5.2) diff --git a/.docs/index.md b/.docs/index.md index 8265da0102bbe966821c48cb4fb9473ac20eca99..d99d08d3581e7d480dc340fef1c9632564dd129e 100644 --- a/.docs/index.md +++ b/.docs/index.md @@ -14,7 +14,7 @@ author: Martin Weise   -Documentation for version: [v1.5.2](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases). +Documentation for version: [v1.5.3](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases). DBRepo is a repository for data in databases that are used from the beginning until the end of a research project supporting data evolution, -citation and -versioning. It implements the query store of the diff --git a/.docs/kubernetes.md b/.docs/kubernetes.md index fa40580f45a4a6b97222a804ae8c8699f39e2748..e553b0411030b5a1fbceff4df6cbb2ed6d876c99 100644 --- a/.docs/kubernetes.md +++ b/.docs/kubernetes.md @@ -14,7 +14,7 @@ helm upgrade --install dbrepo \ -n dbrepo \ "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" \ --values ./values.yaml \ - --version "1.5.2" \ + --version "1.5.3" \ --create-namespace \ --cleanup-on-fail ``` diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ac86d248266d9429e499623a2dba28691420e4dd..12d2779b65139dfc8fe9e187912fc91b7576ec39 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,8 +4,8 @@ variables: TESTCONTAINERS_RYUK_DISABLED: "false" PYTHON_VERSION: "3.11" DOC_VERSION: "1.5" - APP_VERSION: "1.5.2" - CHART_VERSION: "1.5.2" + APP_VERSION: "1.5.3" + CHART_VERSION: "1.5.3" CACHE_FALLBACK_KEY: ${CI_DEFAULT_BRANCH} # This will supress any download for dependencies and plugins or upload messages which would clutter the console log. # `showDateTime` will show the passed time in milliseconds. You need to specify `--batch-mode` to make this work. diff --git a/Makefile b/Makefile index 91994bda3b8a036503e05af28a152452e94fd087..a348649ecb8dbbd91969fa7ef636fc7bcbdcceae 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ .PHONY: all -APP_VERSION ?= 1.5.2 -CHART_VERSION ?= 1.5.2 +APP_VERSION ?= 1.5.3 +CHART_VERSION ?= 1.5.3 REPOSITORY_URL ?= registry.datalab.tuwien.ac.at/dbrepo .PHONY: all diff --git a/dbrepo-analyse-service/Pipfile b/dbrepo-analyse-service/Pipfile index 150d5811a6ce29bfc99588c65b5bafe6a2d87e2b..49d010321ffdd35bca3e13c59f46d2e45dfa7084 100644 --- a/dbrepo-analyse-service/Pipfile +++ b/dbrepo-analyse-service/Pipfile @@ -21,7 +21,7 @@ numpy = "*" pandas = "*" minio = "*" pydantic = "*" -dbrepo = {path = "./lib/dbrepo-1.5.2.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.5.3.tar.gz"} opensearch-py = "*" [dev-packages] diff --git a/dbrepo-analyse-service/Pipfile.lock b/dbrepo-analyse-service/Pipfile.lock index 8e7bafd4267885b6d55789c1c8a07a85c167a58b..ed07c44a6091c0904df910304e174771c87819f9 100644 --- a/dbrepo-analyse-service/Pipfile.lock +++ b/dbrepo-analyse-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "3df8e885e462132896bafc8d6c82c70226fc2352f2088eac67186d3e171b8308" + "sha256": "6b47020110a5b917d5fadf008775a0cc82e88b762b0bd127895ec92419b586da" }, "pipfile-spec": 6, "requires": { @@ -26,85 +26,85 @@ }, "aiohttp": { "hashes": [ - "sha256:0411777249f25d11bd2964a230b3ffafcbed6cd65d0f2b132bc2b8f5b8c347c7", - "sha256:0a97d657f6cf8782a830bb476c13f7d777cfcab8428ac49dde15c22babceb361", - "sha256:0b5a5009b0159a8f707879dc102b139466d8ec6db05103ec1520394fdd8ea02c", - "sha256:0bcb7f6976dc0b6b56efde13294862adf68dd48854111b422a336fa729a82ea6", - "sha256:14624d96f0d69cf451deed3173079a68c322279be6030208b045ab77e1e8d550", - "sha256:15c4e489942d987d5dac0ba39e5772dcbed4cc9ae3710d1025d5ba95e4a5349c", - "sha256:176f8bb8931da0613bb0ed16326d01330066bb1e172dd97e1e02b1c27383277b", - "sha256:17af09d963fa1acd7e4c280e9354aeafd9e3d47eaa4a6bfbd2171ad7da49f0c5", - "sha256:1a8b13b9950d8b2f8f58b6e5842c4b842b5887e2c32e3f4644d6642f1659a530", - "sha256:202f40fb686e5f93908eee0c75d1e6fbe50a43e9bd4909bf3bf4a56b560ca180", - "sha256:21cbe97839b009826a61b143d3ca4964c8590d7aed33d6118125e5b71691ca46", - "sha256:27935716f8d62c1c73010428db310fd10136002cfc6d52b0ba7bdfa752d26066", - "sha256:282e0a7ddd36ebc411f156aeaa0491e8fe7f030e2a95da532cf0c84b0b70bc66", - "sha256:28f29bce89c3b401a53d6fd4bee401ee943083bf2bdc12ef297c1d63155070b0", - "sha256:2ac9fd83096df36728da8e2f4488ac3b5602238f602706606f3702f07a13a409", - "sha256:30f9f89ae625d412043f12ca3771b2ccec227cc93b93bb1f994db6e1af40a7d3", - "sha256:317251b9c9a2f1a9ff9cd093775b34c6861d1d7df9439ce3d32a88c275c995cd", - "sha256:31de2f10f63f96cc19e04bd2df9549559beadd0b2ee2da24a17e7ed877ca8c60", - "sha256:36df00e0541f264ce42d62280281541a47474dfda500bc5b7f24f70a7f87be7a", - "sha256:39625703540feb50b6b7f938b3856d1f4886d2e585d88274e62b1bd273fae09b", - "sha256:3f5461c77649358610fb9694e790956b4238ac5d9e697a17f63619c096469afe", - "sha256:4313f3bc901255b22f01663eeeae167468264fdae0d32c25fc631d5d6e15b502", - "sha256:442356e8924fe1a121f8c87866b0ecdc785757fd28924b17c20493961b3d6697", - "sha256:44cb1a1326a0264480a789e6100dc3e07122eb8cd1ad6b784a3d47d13ed1d89c", - "sha256:44d323aa80a867cb6db6bebb4bbec677c6478e38128847f2c6b0f70eae984d72", - "sha256:499368eb904566fbdf1a3836a1532000ef1308f34a1bcbf36e6351904cced771", - "sha256:4b01d9cfcb616eeb6d40f02e66bebfe7b06d9f2ef81641fdd50b8dd981166e0b", - "sha256:5720ebbc7a1b46c33a42d489d25d36c64c419f52159485e55589fbec648ea49a", - "sha256:5cc5e0d069c56645446c45a4b5010d4b33ac6c5ebfd369a791b5f097e46a3c08", - "sha256:618b18c3a2360ac940a5503da14fa4f880c5b9bc315ec20a830357bcc62e6bae", - "sha256:6435a66957cdba1a0b16f368bde03ce9c79c57306b39510da6ae5312a1a5b2c1", - "sha256:647ec5bee7e4ec9f1034ab48173b5fa970d9a991e565549b965e93331f1328fe", - "sha256:6e1e9e447856e9b7b3d38e1316ae9a8c92e7536ef48373de758ea055edfd5db5", - "sha256:6ef1550bb5f55f71b97a6a395286db07f7f2c01c8890e613556df9a51da91e8d", - "sha256:6ffa45cc55b18d4ac1396d1ddb029f139b1d3480f1594130e62bceadf2e1a838", - "sha256:77f31cebd8c27a36af6c7346055ac564946e562080ee1a838da724585c67474f", - "sha256:7a3b5b2c012d70c63d9d13c57ed1603709a4d9d7d473e4a9dfece0e4ea3d5f51", - "sha256:7a7ddf981a0b953ade1c2379052d47ccda2f58ab678fca0671c7c7ca2f67aac2", - "sha256:84de955314aa5e8d469b00b14d6d714b008087a0222b0f743e7ffac34ef56aff", - "sha256:8dcfd14c712aa9dd18049280bfb2f95700ff6a8bde645e09f17c3ed3f05a0130", - "sha256:928f92f80e2e8d6567b87d3316c1fd9860ccfe36e87a9a7f5237d4cda8baa1ba", - "sha256:9384b07cfd3045b37b05ed002d1c255db02fb96506ad65f0f9b776b762a7572e", - "sha256:96726839a42429318017e67a42cca75d4f0d5248a809b3cc2e125445edd7d50d", - "sha256:96bbec47beb131bbf4bae05d8ef99ad9e5738f12717cfbbf16648b78b0232e87", - "sha256:9bcf97b971289be69638d8b1b616f7e557e1342debc7fc86cf89d3f08960e411", - "sha256:a0cf4d814689e58f57ecd5d8c523e6538417ca2e72ff52c007c64065cef50fb2", - "sha256:a7c6147c6306f537cff59409609508a1d2eff81199f0302dd456bb9e7ea50c39", - "sha256:a9266644064779840feec0e34f10a89b3ff1d2d6b751fe90017abcad1864fa7c", - "sha256:afbe85b50ade42ddff5669947afde9e8a610e64d2c80be046d67ec4368e555fa", - "sha256:afcda759a69c6a8be3aae764ec6733155aa4a5ad9aad4f398b52ba4037942fe3", - "sha256:b2fab23003c4bb2249729a7290a76c1dda38c438300fdf97d4e42bf78b19c810", - "sha256:bd3f711f4c99da0091ced41dccdc1bcf8be0281dc314d6d9c6b6cf5df66f37a9", - "sha256:be0c7c98e38a1e3ad7a6ff64af8b6d6db34bf5a41b1478e24c3c74d9e7f8ed42", - "sha256:c1f2d7fd583fc79c240094b3e7237d88493814d4b300d013a42726c35a734bc9", - "sha256:c5bba6b83fde4ca233cfda04cbd4685ab88696b0c8eaf76f7148969eab5e248a", - "sha256:c6beeac698671baa558e82fa160be9761cf0eb25861943f4689ecf9000f8ebd0", - "sha256:c7333e7239415076d1418dbfb7fa4df48f3a5b00f8fdf854fca549080455bc14", - "sha256:c8a02f74ae419e3955af60f570d83187423e42e672a6433c5e292f1d23619269", - "sha256:c9c23e62f3545c2216100603614f9e019e41b9403c47dd85b8e7e5015bf1bde0", - "sha256:cca505829cdab58c2495ff418c96092d225a1bbd486f79017f6de915580d3c44", - "sha256:d3108f0ad5c6b6d78eec5273219a5bbd884b4aacec17883ceefaac988850ce6e", - "sha256:d4b8a1b6c7a68c73191f2ebd3bf66f7ce02f9c374e309bdb68ba886bbbf1b938", - "sha256:d6e274661c74195708fc4380a4ef64298926c5a50bb10fbae3d01627d7a075b7", - "sha256:db2914de2559809fdbcf3e48f41b17a493b58cb7988d3e211f6b63126c55fe82", - "sha256:e738aabff3586091221044b7a584865ddc4d6120346d12e28e788307cd731043", - "sha256:e7f6173302f8a329ca5d1ee592af9e628d3ade87816e9958dcf7cdae2841def7", - "sha256:e9d036a9a41fc78e8a3f10a86c2fc1098fca8fab8715ba9eb999ce4788d35df0", - "sha256:ea142255d4901b03f89cb6a94411ecec117786a76fc9ab043af8f51dd50b5313", - "sha256:ebd3e6b0c7d4954cca59d241970011f8d3327633d555051c430bd09ff49dc494", - "sha256:ec656680fc53a13f849c71afd0c84a55c536206d524cbc831cde80abbe80489e", - "sha256:ec8df0ff5a911c6d21957a9182402aad7bf060eaeffd77c9ea1c16aecab5adbf", - "sha256:ed95d66745f53e129e935ad726167d3a6cb18c5d33df3165974d54742c373868", - "sha256:ef2c9499b7bd1e24e473dc1a85de55d72fd084eea3d8bdeec7ee0720decb54fa", - "sha256:f5252ba8b43906f206048fa569debf2cd0da0316e8d5b4d25abe53307f573941", - "sha256:f737fef6e117856400afee4f17774cdea392b28ecf058833f5eca368a18cf1bf", - "sha256:fc726c3fa8f606d07bd2b500e5dc4c0fd664c59be7788a16b9e34352c50b6b6b" + "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0", + "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769", + "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5", + "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59", + "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf", + "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985", + "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50", + "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299", + "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d", + "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab", + "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542", + "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b", + "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b", + "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838", + "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683", + "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df", + "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d", + "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91", + "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9", + "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be", + "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c", + "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219", + "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4", + "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf", + "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f", + "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199", + "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1", + "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60", + "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77", + "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf", + "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079", + "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4", + "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46", + "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8", + "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c", + "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d", + "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33", + "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34", + "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82", + "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b", + "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c", + "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836", + "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69", + "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39", + "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f", + "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32", + "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc", + "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52", + "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816", + "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1", + "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec", + "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487", + "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0", + "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767", + "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5", + "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6", + "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9", + "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f", + "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138", + "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e", + "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf", + "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109", + "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408", + "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6", + "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d", + "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99", + "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4", + "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74", + "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc", + "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d", + "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5", + "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a", + "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01", + "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f", + "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e", + "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3" ], "markers": "python_version >= '3.9'", - "version": "==3.11.9" + "version": "==3.11.10" }, "aiosignal": { "hashes": [ @@ -175,20 +175,20 @@ }, "boto3": { "hashes": [ - "sha256:88370c6845ba71a4dae7f6b357099df29b3965da584be040c8e72c9902bc9492", - "sha256:dab5bddbbe57dc707b6f6a1f25dc2823b8e234b6fe99fafef7fc406ab73031b9" + "sha256:21a3b18c3a7fd20e463708fe3fa035983105dc7f3a1c274e1903e1583ab91159", + "sha256:50dae461ab5fbedfb81b690895d48a918fed0d5fdff37be1c4232770c0dc9712" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==1.35.74" + "version": "==1.35.80" }, "botocore": { "hashes": [ - "sha256:9ac9d33d84dd9f05b35085de081552342a2c9ae22e3c4ee105723c9e92c07bd9", - "sha256:de5c4fa9a24cef3a758974857b5c5820a12fad345ebf33c052a5988e88f33634" + "sha256:36e589dccb62380abd628b08fecfa2f7c89b99f41ec9fc42c467c94008c0be4a", + "sha256:b8dfceca58891cb2711bd6455ec4f7159051f3796e0f64adef9bb334f19d8a92" ], "markers": "python_version >= '3.8'", - "version": "==1.35.74" + "version": "==1.35.80" }, "certifi": { "hashes": [ @@ -397,7 +397,6 @@ "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b", "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc", "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543", - "sha256:60eb32934076fa07e4316b7b2742fa52cbb190b42c2df2863dbc4230a0a9b385", "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c", "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591", "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede", @@ -405,7 +404,6 @@ "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f", "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123", "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c", - "sha256:9abcc2e083cbe8dde89124a47e5e53ec38751f0d7dfd36801008f316a127d7ba", "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c", "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285", "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd", @@ -427,9 +425,9 @@ }, "dbrepo": { "hashes": [ - "sha256:292c2631816ca3dbdbd243e4c006c4bd39d512f5ae7e4b10070102c85ec58a10" + "sha256:b746668ca7830897aa9ab7660c2b6cf420a6cde09afb87665f9fa9cb4d6a2314" ], - "path": "./lib/dbrepo-1.5.2.tar.gz" + "path": "./lib/dbrepo-1.5.3.tar.gz" }, "events": { "hashes": [ @@ -959,65 +957,65 @@ }, "numpy": { "hashes": [ - "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe", - "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0", - "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48", - "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a", - "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564", - "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958", - "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17", - "sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0", - "sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee", - "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b", - "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4", - "sha256:3522b0dfe983a575e6a9ab3a4a4dfe156c3e428468ff08ce582b9bb6bd1d71d4", - "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6", - "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4", - "sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d", - "sha256:4f2015dfe437dfebbfce7c85c7b53d81ba49e71ba7eadbf1df40c915af75979f", - "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f", - "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f", - "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56", - "sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9", - "sha256:6a4825252fcc430a182ac4dee5a505053d262c807f8a924603d411f6718b88fd", - "sha256:72dcc4a35a8515d83e76b58fdf8113a5c969ccd505c8a946759b24e3182d1f23", - "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed", - "sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a", - "sha256:78574ac2d1a4a02421f25da9559850d59457bac82f2b8d7a44fe83a64f770098", - "sha256:825656d0743699c529c5943554d223c021ff0494ff1442152ce887ef4f7561a1", - "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512", - "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f", - "sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09", - "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f", - "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc", - "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8", - "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0", - "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761", - "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef", - "sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5", - "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e", - "sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b", - "sha256:c006b607a865b07cd981ccb218a04fc86b600411d83d6fc261357f1c0966755d", - "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43", - "sha256:c7662f0e3673fe4e832fe07b65c50342ea27d989f92c80355658c7f888fcc83c", - "sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41", - "sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff", - "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408", - "sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2", - "sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9", - "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57", - "sha256:e14e26956e6f1696070788252dcdff11b4aca4c3e8bd166e0df1bb8f315a67cb", - "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9", - "sha256:e711e02f49e176a01d0349d82cb5f05ba4db7d5e7e0defd026328e5cfb3226d3", - "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a", - "sha256:ecc76a9ba2911d8d37ac01de72834d8849e55473457558e12995f4cd53e778e0", - "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e", - "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598", - "sha256:fa2d1337dc61c8dc417fbccf20f6d1e139896a30721b7f1e832b2bb6ef4eb6c4" + "sha256:0557eebc699c1c34cccdd8c3778c9294e8196df27d713706895edc6f57d29608", + "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef", + "sha256:0da8495970f6b101ddd0c38ace92edea30e7e12b9a926b57f5fabb1ecc25bb90", + "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae", + "sha256:122fd2fcfafdefc889c64ad99c228d5a1f9692c3a83f56c292618a59aa60ae83", + "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0", + "sha256:16757cf28621e43e252c560d25b15f18a2f11da94fea344bf26c599b9cf54b73", + "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671", + "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69", + "sha256:1e25507d85da11ff5066269d0bd25d06e0a0f2e908415534f3e603d2a78e4ffa", + "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066", + "sha256:3579eaeb5e07f3ded59298ce22b65f877a86ba8e9fe701f5576c99bb17c283da", + "sha256:36b2b43146f646642b425dd2027730f99bac962618ec2052932157e213a040e9", + "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e", + "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3", + "sha256:3f2f5cddeaa4424a0a118924b988746db6ffa8565e5829b1841a8a3bd73eb59a", + "sha256:40deb10198bbaa531509aad0cd2f9fadb26c8b94070831e2208e7df543562b74", + "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3", + "sha256:4723a50e1523e1de4fccd1b9a6dcea750c2102461e9a02b2ac55ffeae09a4410", + "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72", + "sha256:4e58666988605e251d42c2818c7d3d8991555381be26399303053b58a5bbf30d", + "sha256:54dc1d6d66f8d37843ed281773c7174f03bf7ad826523f73435deb88ba60d2d4", + "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038", + "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e", + "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13", + "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d", + "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95", + "sha256:7fe4bb0695fe986a9e4deec3b6857003b4cfe5c5e4aac0b95f6a658c14635e31", + "sha256:7fe8f3583e0607ad4e43a954e35c1748b553bfe9fdac8635c02058023277d1b3", + "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03", + "sha256:9874bc2ff574c40ab7a5cbb7464bf9b045d617e36754a7bc93f933d52bd9ffc6", + "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2", + "sha256:a222d764352c773aa5ebde02dd84dba3279c81c6db2e482d62a3fa54e5ece69b", + "sha256:a50aeff71d0f97b6450d33940c7181b08be1441c6c193e678211bff11aa725e7", + "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab", + "sha256:a62eb442011776e4036af5c8b1a00b706c5bc02dc15eb5344b0c750428c94219", + "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571", + "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d", + "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1", + "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca", + "sha256:b30042fe92dbd79f1ba7f6898fada10bdaad1847c44f2dff9a16147e00a93661", + "sha256:b606b1aaf802e6468c2608c65ff7ece53eae1a6874b3765f69b8ceb20c5fa78e", + "sha256:b6207dc8fb3c8cb5668e885cef9ec7f70189bec4e276f0ff70d5aa078d32c88e", + "sha256:c2aed8fcf8abc3020d6a9ccb31dbc9e7d7819c56a348cc88fd44be269b37427e", + "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a", + "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3", + "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881", + "sha256:df12a1f99b99f569a7c2ae59aa2d31724e8d835fc7f33e14f4792e3071d11221", + "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742", + "sha256:e12c6c1ce84628c52d6367863773f7c8c8241be554e8b79686e91a43f1733773", + "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e", + "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529", + "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67", + "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c", + "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367" ], "index": "pypi", "markers": "python_version >= '3.10'", - "version": "==2.1.3" + "version": "==2.2.0" }, "opensearch-py": { "hashes": [ @@ -1459,112 +1457,112 @@ }, "rpds-py": { "hashes": [ - "sha256:0545928bdf53dfdfcab284468212efefb8a6608ca3b6910c7fb2e5ed8bdc2dc0", - "sha256:05fdeae9010533e47715c37df83264df0122584e40d691d50cf3607c060952a3", - "sha256:09a1f000c5f6e08b298275bae00921e9fbbf2a35dae0a86db2821c058c2201a9", - "sha256:0a53592cdf98cec3dfcdb24ffec8a4797e7656b65700099af43ec7df023b6de4", - "sha256:0f057a0c546c42964836b209d8de9ea1a4f4b0432006c6343cbe633d8ca14571", - "sha256:0f9eb37d3a60b262a98ab51ee899cac039de9ca0ce68dcf1a6518a09719020b0", - "sha256:102be79c4cc47a4aeb5912401185c404cd2601c15a7163bbecff7f1bfe20b669", - "sha256:128cbaed7ba26116820bcb992405d6a13ea18c8fca1b8c4f59906d858e91e979", - "sha256:149b4d875ef9b12a8f5e303e86a32a58f8ef627e57ec97a7d0e4be819069d141", - "sha256:153248f48d6f90a295a502f53ec544a3ffbd21b0bb32f5dca39c4b93a764d6a2", - "sha256:157a023bded0618a1eea54979fe2e0f9309e9ddc818ef4b8fc3b884ff38fedd5", - "sha256:15fa4ca658f8ad22645d3531682b17e5580832efbfa87304c3e62214c79c1e8a", - "sha256:198067aa6f3d942ff5d0d655bb1e91b59ae85279d47590682cba2834ac1b97d2", - "sha256:1c40e02cc4f3e18fd39344edb10eebe04bd11cfd13119606b5771e5ea51630d3", - "sha256:1ded65691a1d3fd7d2aa89d2c91aa51f941601bb2ce099739909034d957fef4b", - "sha256:201650b309c419143775c15209c620627de3c09a27c7fb58375325aec5cce260", - "sha256:2143c3aed85992604d758bbe67da839fb4aab3dd2e1c6dddab5b3ca7162b34a2", - "sha256:2177e59c033bf0d1bf7de1ced561205963583caf3242c6c700a723034bfb5f8e", - "sha256:2ea23f1525d4f64286dbe0947c929d45c3ffe963b2dbed1d3844a2e4938bda42", - "sha256:31264187fc934ff1024a4f56775f33c9252d3f4f3e27ec07d1995a26b52702c3", - "sha256:36ce951800ed2acc6772fd9f42150f29d567f0423989748052fdb39d9e2b5795", - "sha256:3aaa22487477de9618ce3b37f99fbe81219ba96f3c2ca84f576f0ab451b83aba", - "sha256:3e7e99e2af59c56c59b6c964d612511b8203480d39d1ef83edc56f2cb42a3f5d", - "sha256:413a30a99d8683dace3765885920ed27ab662efbb6c98d81db76c397ad1ffd71", - "sha256:447ae1104fb32197b9262f772d565d38e834cc2e9edd89350b37b88fed636e70", - "sha256:4659b2e4a5008715099e216050f5c6976e5a4329482664411789968b82e3f17d", - "sha256:48ee97c7c6027fd423058675b5a39d0b5f7a1648250b671563d5c9f74ff13ff0", - "sha256:4ba6c66fbc6015b2f99e7176fec41793cecb00c4cc357cad038dff85e6ac42ab", - "sha256:4c8dc7331e8cbb1c0ea2bcb550adb1777365944ffd125c69aa1117fdef4887f5", - "sha256:50e4b5d291105f7063259fe0125b1af902fb34499444d7c5c521dd8328b00939", - "sha256:542eb246d5be31b5e0a9c8ddb9539416f9b31f58f75bd4ee328bff2b5c58d6fd", - "sha256:55d371b9d8b0c2a68a50413a8cb01c3c3ce1ea4f768bf77b66669a9a486e101e", - "sha256:580ccbf11f02f948add4cb641843030a89f1463d7c0740cbfc9aca91e9dc34b3", - "sha256:5dbff9402c2bdf00bf0df9905694b3c292a3847c725651938a72f554351a5fcb", - "sha256:5f941fb86195f97be7f6efe04a21b223f05dfe4d1dfb159999e2f8d101e44cc4", - "sha256:608c84699b2db09c6a8743845b1a3dad36fae53eaaecb241d45b13dff74405fb", - "sha256:626b9feb01bff049a5aec4804f0c58db12585778b4902e5376a95b01f80a7a16", - "sha256:66f4f48a89cdd30ab3a47335df81c76e9a63799d0d84b29c0618371c66fa37b0", - "sha256:6c8e97e19aa7b0b0d801a159f932ce4435f1049c8c38e2bb372bb5bee559ce50", - "sha256:72407065ad459db9f3d052ea8c51e02534f02533fc61e51cbab3bd94166f086c", - "sha256:734783dd7da58f76222f458346ddebdb3621686a1a2a667db5049caf0c9956b9", - "sha256:76eaa4c087a061a2c8a0a92536405069878a8f530c00e84a9eaf332e70f5561f", - "sha256:776a06cb5720556a549829896a49acebb5bdd96c7bba100191a994053546975a", - "sha256:7839b7528faa4d134c183b1f2dd1ee4dc2ca2f899f4f0cfdf00fc04c255262a7", - "sha256:8080467df22feca0fc9c46567001777c6fbc2b4a2683a7137420896051874ca1", - "sha256:85060e96953647871957d41707adb8d7bff4e977042fd0deb4fc1881b98dd2fe", - "sha256:8954b9ffe60f479a0c0ba40987db2546c735ab02a725ea7fd89342152d4d821d", - "sha256:8a603155db408f773637f9e3a712c6e3cbc521aaa8fa2b99f9ba6106c59a2496", - "sha256:8bd9ec1db79a664f4cbb12878693b73416f4d2cb425d3e27eccc1bdfbdc826ef", - "sha256:8c0c324879d483504b07f7b18eb1b50567c434263bbe4866ecce33056162668a", - "sha256:8ce729f1dc8a4a190c34b69f75377bddc004079b2963ab722ab91fafe040be6d", - "sha256:8ec41049c90d204a6561238a9ad6c7263ebb7009d9759c98b58078d9d2fec9ba", - "sha256:959ae04ed30cde606f3a0320f0a1f4167a107e685ef5209cce28c5080590bd31", - "sha256:96559e05bdf938b2048353e10a7920b98f853cefe4482c2064a718d7d0a50bd7", - "sha256:96b3759d8ab2323324e0a92b2f44834f9d88089b8d1ab6f533b61f4be3411cef", - "sha256:97c5ffe47ccf92d8b17e10f8a5ce28d015aa1196edc3359684cf31504eae6a14", - "sha256:9d5b925156a746dc1f5f52376fdd1fbdd3f6ffe1fcd6f5e06f77ca79abb940a3", - "sha256:9dae4eb9b5534e09ba6c6ab496a757e5e394b7e7b08767d25ca37e8d36491114", - "sha256:a083221b6a4ecdef38a60c95d8d3223d99449cb4da2544e9644958dc16664eb9", - "sha256:a0ed14a4162c2c2b21a162c9fcf90057e3e7da18cd171ab344c1e1664f75090e", - "sha256:a18aedc032d6468b73ebbe4437129cb30d54fe543cde2f23671ecad76c3aea24", - "sha256:a451dba533be77454ebcffc85189108fc05f279100835ac76e7989edacb89156", - "sha256:aa2ba0176037c915d8660a4e46581d645e2c22b5373e466bc8640a794d45861a", - "sha256:ab27dd4edd84b13309f268ffcdfc07aef8339135ffab7b6d43f16884307a2a48", - "sha256:ab784621d3e2a41916e21f13a483602cc989fd45fff637634b9231ba43d4383b", - "sha256:b07fa9e634234e84096adfa4be3828c8f26e238679c122824b2b3d7131bec578", - "sha256:b09209cdfcacf5eba9cf80367130532e6c02e695252e1f64d3cfcc2356e6e19f", - "sha256:babec324e8654a59122aaa66936a9a483faa03276db9792f51332475c2dddc4a", - "sha256:bca4428c4a957b78ded3e6e62884ab03f029dce8fa8d34818da0f80f61332b49", - "sha256:c0467838c90435b80793cde486a318fc916ee57f2af54e4b10c72b20cbdcbaa9", - "sha256:c2a214bf5b79bd39a9de1c991353aaaacafda83ba1374178309e92be8e67d411", - "sha256:c3029f481b31f329b1fdb4ec4b56935d82210ddd9c6f86ea5a87c06f1e97b161", - "sha256:c6f3fd617db422c9d4e12cb8d84c984fe07d6d9cb0950cbf117f3bccc6268d05", - "sha256:c783e4ed68200f4e03c125690d23158b1c49c4b186d458a18debc109bbdc3c2e", - "sha256:c8502a02ae3ae67084f5a0bf5a8253b19fa7a887f824e41e016cdb0ac532a06f", - "sha256:c88535f83f7391cf3a45af990237e3939a6fdfbedaed2571633bfdd0bceb36b0", - "sha256:c9ce6b83597d45bec44a2690857ede62fc98223772135f8a7fa90884eb726501", - "sha256:ca4657e9fd0b1b5376942d403d634ce188f79064f0873aa853ab05b10185ceec", - "sha256:d0ff8d5b13ce2357fa8b33a0a2e3775aa71df5bf7c8ba060634c9d15ab12f357", - "sha256:d280b4bf09f719b89fd9aab3b71067acc0d0449b7d1eba99a2ade4939cef8296", - "sha256:d3777c446bb1c5fcd82dc3f8776e1a146cd91e80cc1892f8634575ace438d22f", - "sha256:d7833ef6f5d6cb634f296abfd93452fb3eb44c4e9a6ae95c1021eab704c1cee2", - "sha256:d8306f27418361b788e3fca9f47dec125457f80122e7e31ba7ff5cdba98343f8", - "sha256:d962e2e89b3a95e3597a34b8c93ced1e98958502c5b8096c9fd69deff279f561", - "sha256:dbe428d0ac6eacaf05402adbaf137f59ad6063848182d1ff294f95ce0f24005b", - "sha256:e4f91d702b9ce1388660b3d4a28aa552614a1399e93f718ed0dacd68f23b3d32", - "sha256:e69acdbc132c9592c8dc393af85e38e206ca847c7019a953ff625191c3a12312", - "sha256:e8056adcefa2dcb67e8bc91ea5eee26df66e8b297a8cd6ff0903f85c70908fa0", - "sha256:e9ac7280bd045f472b50306d7efeee051b69e3a2dd1b90f46bd7e86e63b1efa2", - "sha256:eb013aa01b404219f28dc973d9e6310fd4db216d7299253dd355629952e0564e", - "sha256:ec1ccc2a9f764cd632fb8ab28fdde166250df54fc8d97315a4a6948dc5367639", - "sha256:ef7282d8a14b60dd515e47060638687710b1d518f4b5e961caad43fb3a3606f9", - "sha256:ef92b1fbe6aa2e7885eb90853cc016b1fc95439a8cc8da6d526880e9e2148695", - "sha256:efb2ad60ca8637d5f9f653f9a9a8d73964059972b6b95036be77e028bffc68a3", - "sha256:effcae2152afe7937a28376dbabb25c770ef99ed4e16a4ffeb8e6a4f7c4f06aa", - "sha256:f2d1b58a0c3a73f0361759642e80260a6d28eee6501b40fe25b82af33ef83f21", - "sha256:f57e2d0f8022783426121b586d7c842ea40ea832a29e28ca36c881b54c74fb28", - "sha256:f5cae9b415ea8a6a563566dbf46650222eccc5971c7daa16fbee63aef92ae543", - "sha256:f76c6f319e57007ad52e671ec741d801324760a377e3d4992c9bb8200333ebac", - "sha256:f91bfc39f7a64168e08ab831fa497ec5438c1d6c6e2f9e12848d95ad11ac8523", - "sha256:fdaee3947eaaa52dae3ceb9d9f66329e13d8bae35682b1e5dd54612938693934", - "sha256:fe3f245c2f39a5692d9123c174bc48f6f9fe3e96407e67c6d04541a767d99e72", - "sha256:ffae97d28ea4f2c613a751d087b75a97fb78311b38cc2e9a2f4587e473ace167" + "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518", + "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059", + "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61", + "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5", + "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9", + "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543", + "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2", + "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a", + "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d", + "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56", + "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d", + "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd", + "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b", + "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4", + "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99", + "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d", + "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd", + "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe", + "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1", + "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e", + "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f", + "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3", + "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca", + "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d", + "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e", + "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc", + "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea", + "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38", + "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b", + "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c", + "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff", + "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723", + "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e", + "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493", + "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6", + "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83", + "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091", + "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1", + "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627", + "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1", + "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728", + "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16", + "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c", + "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45", + "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7", + "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a", + "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730", + "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967", + "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25", + "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24", + "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055", + "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d", + "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0", + "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e", + "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7", + "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c", + "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f", + "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd", + "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652", + "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8", + "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11", + "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333", + "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96", + "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64", + "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b", + "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e", + "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c", + "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9", + "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec", + "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb", + "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37", + "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad", + "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9", + "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c", + "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf", + "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4", + "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f", + "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d", + "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09", + "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d", + "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566", + "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74", + "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338", + "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15", + "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c", + "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648", + "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84", + "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3", + "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123", + "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520", + "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831", + "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e", + "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf", + "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b", + "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2", + "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3", + "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130", + "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b", + "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de", + "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5", + "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d", + "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00", + "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e" ], "markers": "python_version >= '3.9'", - "version": "==0.22.1" + "version": "==0.22.3" }, "s3transfer": { "hashes": [ @@ -1584,11 +1582,11 @@ }, "six": { "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", + "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" + "version": "==1.17.0" }, "tinydb": { "hashes": [ @@ -1627,7 +1625,7 @@ "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" ], - "markers": "python_version >= '3.10'", + "markers": "python_version >= '3.8'", "version": "==2.2.3" }, "werkzeug": { @@ -2008,72 +2006,72 @@ }, "coverage": { "hashes": [ - "sha256:093896e530c38c8e9c996901858ac63f3d4171268db2c9c8b373a228f459bbc5", - "sha256:09b9f848b28081e7b975a3626e9081574a7b9196cde26604540582da60235fdf", - "sha256:0b0c69f4f724c64dfbfe79f5dfb503b42fe6127b8d479b2677f2b227478db2eb", - "sha256:13618bed0c38acc418896005732e565b317aa9e98d855a0e9f211a7ffc2d6638", - "sha256:13690e923a3932e4fad4c0ebfb9cb5988e03d9dcb4c5150b5fcbf58fd8bddfc4", - "sha256:177f01eeaa3aee4a5ffb0d1439c5952b53d5010f86e9d2667963e632e30082cc", - "sha256:193e3bffca48ad74b8c764fb4492dd875038a2f9925530cb094db92bb5e47bed", - "sha256:1defe91d41ce1bd44b40fabf071e6a01a5aa14de4a31b986aa9dfd1b3e3e414a", - "sha256:1f188a2402f8359cf0c4b1fe89eea40dc13b52e7b4fd4812450da9fcd210181d", - "sha256:202a2d645c5a46b84992f55b0a3affe4f0ba6b4c611abec32ee88358db4bb649", - "sha256:24eda3a24a38157eee639ca9afe45eefa8d2420d49468819ac5f88b10de84f4c", - "sha256:2e4e0f60cb4bd7396108823548e82fdab72d4d8a65e58e2c19bbbc2f1e2bfa4b", - "sha256:379c111d3558272a2cae3d8e57e6b6e6f4fe652905692d54bad5ea0ca37c5ad4", - "sha256:37cda8712145917105e07aab96388ae76e787270ec04bcb9d5cc786d7cbb8443", - "sha256:38c51297b35b3ed91670e1e4efb702b790002e3245a28c76e627478aa3c10d83", - "sha256:3985b9be361d8fb6b2d1adc9924d01dec575a1d7453a14cccd73225cb79243ee", - "sha256:3988665ee376abce49613701336544041f2117de7b7fbfe91b93d8ff8b151c8e", - "sha256:3ac47fa29d8d41059ea3df65bd3ade92f97ee4910ed638e87075b8e8ce69599e", - "sha256:3b4b4299dd0d2c67caaaf286d58aef5e75b125b95615dda4542561a5a566a1e3", - "sha256:3ea8bb1ab9558374c0ab591783808511d135a833c3ca64a18ec927f20c4030f0", - "sha256:3fe47da3e4fda5f1abb5709c156eca207eacf8007304ce3019eb001e7a7204cb", - "sha256:428ac484592f780e8cd7b6b14eb568f7c85460c92e2a37cb0c0e5186e1a0d076", - "sha256:44e6c85bbdc809383b509d732b06419fb4544dca29ebe18480379633623baafb", - "sha256:4674f0daa1823c295845b6a740d98a840d7a1c11df00d1fd62614545c1583787", - "sha256:4be32da0c3827ac9132bb488d331cb32e8d9638dd41a0557c5569d57cf22c9c1", - "sha256:4db3ed6a907b555e57cc2e6f14dc3a4c2458cdad8919e40b5357ab9b6db6c43e", - "sha256:5c52a036535d12590c32c49209e79cabaad9f9ad8aa4cbd875b68c4d67a9cbce", - "sha256:629a1ba2115dce8bf75a5cce9f2486ae483cb89c0145795603d6554bdc83e801", - "sha256:62a66ff235e4c2e37ed3b6104d8b478d767ff73838d1222132a7a026aa548764", - "sha256:63068a11171e4276f6ece913bde059e77c713b48c3a848814a6537f35afb8365", - "sha256:63c19702db10ad79151a059d2d6336fe0c470f2e18d0d4d1a57f7f9713875dcf", - "sha256:644ec81edec0f4ad17d51c838a7d01e42811054543b76d4ba2c5d6af741ce2a6", - "sha256:6535d996f6537ecb298b4e287a855f37deaf64ff007162ec0afb9ab8ba3b8b71", - "sha256:6f4548c5ead23ad13fb7a2c8ea541357474ec13c2b736feb02e19a3085fac002", - "sha256:716a78a342679cd1177bc8c2fe957e0ab91405bd43a17094324845200b2fddf4", - "sha256:74610105ebd6f33d7c10f8907afed696e79c59e3043c5f20eaa3a46fddf33b4c", - "sha256:768939f7c4353c0fac2f7c37897e10b1414b571fd85dd9fc49e6a87e37a2e0d8", - "sha256:86cffe9c6dfcfe22e28027069725c7f57f4b868a3f86e81d1c62462764dc46d4", - "sha256:8aae5aea53cbfe024919715eca696b1a3201886ce83790537d1c3668459c7146", - "sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc", - "sha256:912e95017ff51dc3d7b6e2be158dedc889d9a5cc3382445589ce554f1a34c0ea", - "sha256:9a7b8ac36fd688c8361cbc7bf1cb5866977ece6e0b17c34aa0df58bda4fa18a4", - "sha256:9e89d5c8509fbd6c03d0dd1972925b22f50db0792ce06324ba069f10787429ad", - "sha256:ae270e79f7e169ccfe23284ff5ea2d52a6f401dc01b337efb54b3783e2ce3f28", - "sha256:b07c25d52b1c16ce5de088046cd2432b30f9ad5e224ff17c8f496d9cb7d1d451", - "sha256:b39e6011cd06822eb964d038d5dff5da5d98652b81f5ecd439277b32361a3a50", - "sha256:bd55f8fc8fa494958772a2a7302b0354ab16e0b9272b3c3d83cdb5bec5bd1779", - "sha256:c15b32a7aca8038ed7644f854bf17b663bc38e1671b5d6f43f9a2b2bd0c46f63", - "sha256:c1b4474beee02ede1eef86c25ad4600a424fe36cff01a6103cb4533c6bf0169e", - "sha256:c79c0685f142ca53256722a384540832420dff4ab15fec1863d7e5bc8691bdcc", - "sha256:c9ebfb2507751f7196995142f057d1324afdab56db1d9743aab7f50289abd022", - "sha256:d7ad66e8e50225ebf4236368cc43c37f59d5e6728f15f6e258c8639fa0dd8e6d", - "sha256:d82ab6816c3277dc962cfcdc85b1efa0e5f50fb2c449432deaf2398a2928ab94", - "sha256:d9fd2547e6decdbf985d579cf3fc78e4c1d662b9b0ff7cc7862baaab71c9cc5b", - "sha256:de38add67a0af869b0d79c525d3e4588ac1ffa92f39116dbe0ed9753f26eba7d", - "sha256:e19122296822deafce89a0c5e8685704c067ae65d45e79718c92df7b3ec3d331", - "sha256:e44961e36cb13c495806d4cac67640ac2866cb99044e210895b506c26ee63d3a", - "sha256:e4c81ed2820b9023a9a90717020315e63b17b18c274a332e3b6437d7ff70abe0", - "sha256:e683e6ecc587643f8cde8f5da6768e9d165cd31edf39ee90ed7034f9ca0eefee", - "sha256:f39e2f3530ed1626c66e7493be7a8423b023ca852aacdc91fb30162c350d2a92", - "sha256:f56f49b2553d7dd85fd86e029515a221e5c1f8cb3d9c38b470bc38bde7b8445a", - "sha256:fb9fc32399dca861584d96eccd6c980b69bbcd7c228d06fb74fe53e007aa8ef9" + "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4", + "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c", + "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f", + "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b", + "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6", + "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae", + "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692", + "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4", + "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4", + "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717", + "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d", + "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198", + "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1", + "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3", + "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb", + "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d", + "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08", + "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf", + "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b", + "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710", + "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c", + "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae", + "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077", + "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00", + "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb", + "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664", + "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014", + "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9", + "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6", + "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e", + "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9", + "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa", + "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611", + "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b", + "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a", + "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8", + "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030", + "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678", + "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015", + "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902", + "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97", + "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845", + "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419", + "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464", + "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be", + "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9", + "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7", + "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be", + "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1", + "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba", + "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5", + "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073", + "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4", + "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a", + "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a", + "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3", + "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599", + "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0", + "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b", + "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec", + "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1", + "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==7.6.8" + "version": "==7.6.9" }, "docker": { "hashes": [ @@ -2222,11 +2220,11 @@ }, "six": { "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", + "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" + "version": "==1.17.0" }, "testcontainers-core": { "hashes": [ @@ -2264,7 +2262,7 @@ "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" ], - "markers": "python_version >= '3.10'", + "markers": "python_version >= '3.8'", "version": "==2.2.3" }, "wrapt": { diff --git a/dbrepo-analyse-service/lib/dbrepo-1.5.3.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.5.3.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..2bb796d8fece2d97c3b2168248ff493dfa24a549 Binary files /dev/null and b/dbrepo-analyse-service/lib/dbrepo-1.5.3.tar.gz differ diff --git a/dbrepo-data-service/pom.xml b/dbrepo-data-service/pom.xml index 5f813b94c7f6861b26e36ceb70c74d3c8c8e26fd..99822586dbea93aadbf3ad9f1013d9551012d185 100644 --- a/dbrepo-data-service/pom.xml +++ b/dbrepo-data-service/pom.xml @@ -11,7 +11,7 @@ <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> <name>dbrepo-data-service</name> - <version>1.5.2</version> + <version>1.5.3</version> <description>Service that manages the data</description> @@ -44,7 +44,6 @@ <jwt.version>4.3.0</jwt.version> <opencsv.version>5.7.1</opencsv.version> <super-csv.version>2.4.0</super-csv.version> - <jsql.version>4.6</jsql.version> <springdoc-openapi.version>2.3.0</springdoc-openapi.version> <hsqldb.version>2.7.2</hsqldb.version> <testcontainers.version>1.19.1</testcontainers.version> @@ -64,6 +63,10 @@ </properties> <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-validation</artifactId> + </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> @@ -208,11 +211,6 @@ <artifactId>jackson-datatype-hibernate6</artifactId> <version>${jackson-datatype.version}</version> </dependency> - <dependency> - <groupId>com.github.jsqlparser</groupId> - <artifactId>jsqlparser</artifactId> - <version>${jsql.version}</version> - </dependency> <!-- Authentication --> <dependency> <groupId>com.auth0</groupId> diff --git a/dbrepo-data-service/querystore/pom.xml b/dbrepo-data-service/querystore/pom.xml index a508c88343838c4e04601b6ad91496643eb7bb96..1c794f4ef603eedbc5c36396515353832bb859f9 100644 --- a/dbrepo-data-service/querystore/pom.xml +++ b/dbrepo-data-service/querystore/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.5.2</version> + <version>1.5.3</version> </parent> <artifactId>dbrepo-data-service-querystore</artifactId> <name>dbrepo-data-service-querystore</name> - <version>1.5.2</version> + <version>1.5.3</version> <dependencies/> diff --git a/dbrepo-data-service/report/pom.xml b/dbrepo-data-service/report/pom.xml index da3d605405f9b4ab85d3e23bd30f15025962f187..2315b33d4844bfa12bcc51a8c54ea202bd6f01a5 100644 --- a/dbrepo-data-service/report/pom.xml +++ b/dbrepo-data-service/report/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.5.2</version> + <version>1.5.3</version> </parent> <artifactId>report</artifactId> <name>dbrepo-data-service-report</name> - <version>1.5.2</version> + <version>1.5.3</version> <description> This module is only intended for the pipeline coverage report. See the detailed report in the respective modules diff --git a/dbrepo-data-service/rest-service/pom.xml b/dbrepo-data-service/rest-service/pom.xml index 0859d437249495400f536e22aea82130fdd1ef98..96b02e1b506ad488b757813d07ec350e00f067ee 100644 --- a/dbrepo-data-service/rest-service/pom.xml +++ b/dbrepo-data-service/rest-service/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.5.2</version> + <version>1.5.3</version> </parent> <artifactId>rest-service</artifactId> <name>dbrepo-data-service-rest-service</name> - <version>1.5.2</version> + <version>1.5.3</version> <dependencies> <dependency> <groupId>at.tuwien</groupId> <artifactId>services</artifactId> - <version>1.5.2</version> + <version>1.5.3</version> </dependency> </dependencies> diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/AbstractEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/AbstractEndpoint.java new file mode 100644 index 0000000000000000000000000000000000000000..334128637ec5113e6478567d30e44b2f61ea3f5b --- /dev/null +++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/AbstractEndpoint.java @@ -0,0 +1,34 @@ +package at.tuwien.endpoints; + +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public abstract class AbstractEndpoint { + + public List<Map<String, Object>> transform(Dataset<Row> dataset) { + return dataset.collectAsList() + .stream() + .map(row -> { + final Map<String, Object> map = new LinkedHashMap<>(); + for (int i = 0; i < dataset.columns().length; i++) { + if (row.get(i) == null) { + map.put(dataset.columns()[i], null); + continue; + } + try { + map.put(dataset.columns()[i], Integer.parseInt(String.valueOf(row.get(i)))); + map.put(dataset.columns()[i], Double.parseDouble(String.valueOf(row.get(i)))); + } catch (NumberFormatException e) { + /* ignore */ + } + map.put(dataset.columns()[i], String.valueOf(row.get(i))); + } + return map; + }) + .toList(); + } +} diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java index 63962694f164a79e6268b579372f6324704f9fa7..22b74f9d5ad3fe19b122cd008eb0ec7009cd6074 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java @@ -1,14 +1,18 @@ package at.tuwien.endpoints; import at.tuwien.ExportResourceDto; +import at.tuwien.api.database.ViewColumnDto; +import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.query.ExecuteStatementDto; import at.tuwien.api.database.query.QueryDto; import at.tuwien.api.database.query.QueryPersistDto; -import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.api.error.ApiErrorDto; import at.tuwien.exception.*; import at.tuwien.gateway.MetadataServiceGateway; +import at.tuwien.mapper.MetadataMapper; +import at.tuwien.service.SchemaService; +import at.tuwien.service.StorageService; import at.tuwien.service.SubsetService; import at.tuwien.utils.UserUtil; import at.tuwien.validation.EndpointValidator; @@ -25,10 +29,10 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; import lombok.extern.log4j.Log4j2; -import org.apache.commons.lang3.RandomStringUtils; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -38,22 +42,30 @@ import java.security.Principal; import java.sql.SQLException; import java.time.Instant; import java.util.List; +import java.util.Map; import java.util.UUID; @Log4j2 @RestController @CrossOrigin(origins = "*") @RequestMapping(path = "/api/database/{databaseId}/subset") -public class SubsetEndpoint { +public class SubsetEndpoint extends AbstractEndpoint { + private final SchemaService schemaService; private final SubsetService subsetService; + private final MetadataMapper metadataMapper; + private final StorageService storageService; private final EndpointValidator endpointValidator; private final MetadataServiceGateway metadataServiceGateway; @Autowired - public SubsetEndpoint(SubsetService queryService, EndpointValidator endpointValidator, + public SubsetEndpoint(SchemaService schemaService, SubsetService subsetService, MetadataMapper metadataMapper, + StorageService storageService, EndpointValidator endpointValidator, MetadataServiceGateway metadataServiceGateway) { - this.subsetService = queryService; + this.schemaService = schemaService; + this.subsetService = subsetService; + this.metadataMapper = metadataMapper; + this.storageService = storageService; this.endpointValidator = endpointValidator; this.metadataServiceGateway = metadataServiceGateway; } @@ -145,16 +157,15 @@ public class SubsetEndpoint { @NotNull HttpServletRequest httpServletRequest, @RequestParam(required = false) Instant timestamp) throws DatabaseUnavailableException, DatabaseNotFoundException, RemoteUnavailableException, - QueryNotFoundException, FormatNotAvailableException, StorageUnavailableException, QueryMalformedException, - StorageNotFoundException, UserNotFoundException, MetadataServiceException, ViewNotFoundException, - MalformedException { + QueryNotFoundException, FormatNotAvailableException, StorageUnavailableException, UserNotFoundException, + MetadataServiceException, TableNotFoundException, ViewMalformedException, QueryMalformedException { String accept = httpServletRequest.getHeader("Accept"); log.debug("endpoint find subset in database, databaseId={}, subsetId={}, accept={}, timestamp={}", databaseId, subsetId, accept, timestamp); final PrivilegedDatabaseDto database = metadataServiceGateway.getDatabaseById(databaseId); - final QueryDto query; + final QueryDto subset; try { - query = subsetService.findById(database, subsetId); + subset = subsetService.findById(database, subsetId); } catch (SQLException e) { log.error("Failed to establish connection to database: {}", e.getMessage()); throw new DatabaseUnavailableException("Failed to establish connection to database: " + e.getMessage(), e); @@ -171,21 +182,21 @@ public class SubsetEndpoint { switch (accept) { case MediaType.APPLICATION_JSON_VALUE: log.trace("accept header matches json"); - return ResponseEntity.ok(query); + return ResponseEntity.ok(subset); case "text/csv": log.trace("accept header matches csv"); try { - final ExportResourceDto resource = subsetService.export(database, query, timestamp); + final Dataset<Row> dataset = subsetService.getData(database, subset, null, null); + final ExportResourceDto resource = storageService.transformDataset(dataset); final HttpHeaders headers = new HttpHeaders(); headers.add("Content-Disposition", "attachment; filename=\"" + resource.getFilename() + "\""); log.trace("export table resulted in resource {}", resource); return ResponseEntity.ok() .headers(headers) .body(resource.getResource()); - } catch (SQLException e) { - log.error("Failed to establish connection to database: {}", e.getMessage()); - throw new DatabaseUnavailableException("Failed to establish connection to database: " + e.getMessage(), e); + log.error("Failed to find data: {}", e.getMessage()); + throw new DatabaseUnavailableException("Failed to find data: " + e.getMessage(), e); } } throw new FormatNotAvailableException("Must provide either application/json or text/csv headers"); @@ -201,7 +212,7 @@ public class SubsetEndpoint { description = "Created subset", content = {@Content( mediaType = "application/json", - schema = @Schema(implementation = QueryResultDto.class))}), + schema = @Schema(implementation = List.class))}), @ApiResponse(responseCode = "400", description = "Malformed select query", content = {@Content( @@ -233,16 +244,18 @@ public class SubsetEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<QueryResultDto> create(@NotNull @PathVariable("databaseId") Long databaseId, - @Valid @RequestBody ExecuteStatementDto data, - Principal principal, - @RequestParam(required = false) Long page, - @RequestParam(required = false) Long size, - @RequestParam(required = false) Instant timestamp) + public ResponseEntity<List<Map<String, Object>>> create(@NotNull @PathVariable("databaseId") Long databaseId, + @Valid @RequestBody ExecuteStatementDto data, + Principal principal, + @NotNull HttpServletRequest request, + @RequestParam(required = false) Instant timestamp, + @RequestParam(required = false) Long page, + @RequestParam(required = false) Long size) throws DatabaseUnavailableException, DatabaseNotFoundException, RemoteUnavailableException, QueryNotFoundException, StorageUnavailableException, QueryMalformedException, StorageNotFoundException, QueryStoreInsertException, TableMalformedException, PaginationException, QueryNotSupportedException, - NotAllowedException, UserNotFoundException, MetadataServiceException { + NotAllowedException, UserNotFoundException, MetadataServiceException, TableNotFoundException, + ViewMalformedException, ViewNotFoundException { log.debug("endpoint create subset in database, databaseId={}, data.statement={}, page={}, size={}, " + "timestamp={}", databaseId, data.getStatement(), page, size, timestamp); @@ -265,17 +278,13 @@ public class SubsetEndpoint { } /* create */ final PrivilegedDatabaseDto database = metadataServiceGateway.getDatabaseById(databaseId); - final QueryResultDto queryResult; try { - queryResult = subsetService.execute(database, data.getStatement(), timestamp, userId, page, size, null, - null); + final Long subsetId = subsetService.create(database, data.getStatement(), timestamp, userId); + return getData(databaseId, subsetId, principal, request, page, size); } catch (SQLException e) { log.error("Failed to establish connection to database: {}", e.getMessage()); throw new DatabaseUnavailableException("Failed to establish connection to database: " + e.getMessage(), e); } - log.info("Created subset with id: {}", queryResult.getId()); - return ResponseEntity.status(HttpStatus.CREATED) - .body(queryResult); } @RequestMapping(value = "/{subsetId}/data", method = {RequestMethod.GET, RequestMethod.HEAD}) @@ -286,11 +295,13 @@ public class SubsetEndpoint { @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Retrieved subset data", - headers = {@Header(name = "X-Count", description = "Number of rows", schema = @Schema(implementation = Long.class), required = true), - @Header(name = "Access-Control-Expose-Headers", description = "Expose `X-Count` custom header", schema = @Schema(implementation = String.class), required = true)}, + headers = {@Header(name = "X-Count", description = "Number of rows", schema = @Schema(implementation = Long.class)), + @Header(name = "X-Headers", description = "The list of headers separated by comma", schema = @Schema(implementation = String.class)), + @Header(name = "X-Id", description = "The subset id", schema = @Schema(implementation = Long.class), required = true), + @Header(name = "Access-Control-Expose-Headers", description = "Reverse proxy exposing of custom headers", schema = @Schema(implementation = String.class), required = true)}, content = {@Content( mediaType = "application/json", - schema = @Schema(implementation = QueryResultDto.class))}), + schema = @Schema(implementation = List.class))}), @ApiResponse(responseCode = "400", description = "Invalid pagination", content = {@Content( @@ -312,16 +323,16 @@ public class SubsetEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<QueryResultDto> getData(@NotNull @PathVariable("databaseId") Long databaseId, - @NotNull @PathVariable("subsetId") Long subsetId, - Principal principal, - @NotNull HttpServletRequest request, - @RequestParam(required = false) Long page, - @RequestParam(required = false) Long size) throws PaginationException, - DatabaseNotFoundException, RemoteUnavailableException, NotAllowedException, QueryNotFoundException, - DatabaseUnavailableException, TableMalformedException, QueryMalformedException, UserNotFoundException, - MetadataServiceException { - log.debug("endpoint re-execute query, databaseId={}, subsetId={}, principal.name={} page={}, size={}", + public ResponseEntity<List<Map<String, Object>>> getData(@NotNull @PathVariable("databaseId") Long databaseId, + @NotNull @PathVariable("subsetId") Long subsetId, + Principal principal, + @NotNull HttpServletRequest request, + @RequestParam(required = false) Long page, + @RequestParam(required = false) Long size) + throws PaginationException, DatabaseNotFoundException, RemoteUnavailableException, NotAllowedException, + QueryNotFoundException, DatabaseUnavailableException, TableMalformedException, QueryMalformedException, + UserNotFoundException, MetadataServiceException, TableNotFoundException, ViewMalformedException, ViewNotFoundException { + log.debug("endpoint get subset data, databaseId={}, subsetId={}, principal.name={} page={}, size={}", databaseId, subsetId, principal != null ? principal.getName() : null, page, size); endpointValidator.validateDataParams(page, size); final PrivilegedDatabaseDto database = metadataServiceGateway.getDatabaseById(databaseId); @@ -342,21 +353,24 @@ public class SubsetEndpoint { log.debug("size not set: default to {}", size); } try { - final QueryDto query = subsetService.findById(database, subsetId); + final HttpHeaders headers = new HttpHeaders(); + headers.set("X-Id", "" + subsetId); + final QueryDto subset = subsetService.findById(database, subsetId); if (request.getMethod().equals("HEAD")) { - final HttpHeaders headers = new HttpHeaders(); - headers.set("Access-Control-Expose-Headers", "X-Count"); - final Long count = subsetService.reExecuteCount(database, query); + headers.set("Access-Control-Expose-Headers", "X-Count X-Id"); + final Long count = subsetService.reExecuteCount(database, subset); headers.set("X-Count", "" + count); return ResponseEntity.ok() .headers(headers) .build(); } - final QueryResultDto result = subsetService.reExecute(database, query, page, size, null, null); - result.setId(subsetId); - log.trace("re-execute query resulted in result {}", result); + final Dataset<Row> dataset = subsetService.getData(database, subset, page, size); + final ViewDto view = schemaService.inspectView(database, metadataMapper.queryDtoToViewName(subset)); + headers.set("Access-Control-Expose-Headers", "X-Id X-Headers"); + headers.set("X-Headers", String.join(",", view.getColumns().stream().map(ViewColumnDto::getInternalName).toList())); return ResponseEntity.ok() - .body(result); + .headers(headers) + .body(transform(dataset)); } catch (SQLException e) { log.error("Failed to establish connection to database: {}", e.getMessage()); throw new DatabaseUnavailableException("Failed to establish connection to database: " + e.getMessage(), e); diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java index 2a9beb3d04fdd137340571ea122bf8e398738044..54a19850a4bafce9c7fe6c102aa2b5007b279de9 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java @@ -5,14 +5,15 @@ import at.tuwien.api.database.DatabaseAccessDto; import at.tuwien.api.database.DatabaseDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.query.ImportDto; -import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.api.database.table.*; +import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.database.table.internal.PrivilegedTableDto; import at.tuwien.api.database.table.internal.TableCreateDto; import at.tuwien.api.error.ApiErrorDto; import at.tuwien.exception.*; import at.tuwien.gateway.MetadataServiceGateway; import at.tuwien.service.SchemaService; +import at.tuwien.service.StorageService; import at.tuwien.service.TableService; import at.tuwien.utils.UserUtil; import at.tuwien.validation.EndpointValidator; @@ -29,6 +30,8 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; import lombok.extern.log4j.Log4j2; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpHeaders; @@ -41,23 +44,26 @@ import java.security.Principal; import java.sql.SQLException; import java.time.Instant; import java.util.List; +import java.util.Map; @Log4j2 @RestController @CrossOrigin(origins = "*") @RequestMapping(path = "/api/database/{databaseId}/table") -public class TableEndpoint { +public class TableEndpoint extends AbstractEndpoint { private final TableService tableService; private final SchemaService schemaService; + private final StorageService storageService; private final EndpointValidator endpointValidator; private final MetadataServiceGateway metadataServiceGateway; @Autowired - public TableEndpoint(TableService tableService, SchemaService schemaService, EndpointValidator endpointValidator, - MetadataServiceGateway metadataServiceGateway) { + public TableEndpoint(TableService tableService, SchemaService schemaService, StorageService storageService, + EndpointValidator endpointValidator, MetadataServiceGateway metadataServiceGateway) { this.tableService = tableService; this.schemaService = schemaService; + this.storageService = storageService; this.endpointValidator = endpointValidator; this.metadataServiceGateway = metadataServiceGateway; } @@ -171,7 +177,7 @@ public class TableEndpoint { @Header(name = "Access-Control-Expose-Headers", description = "Expose `X-Count` custom header", schema = @Schema(implementation = String.class), required = true)}, content = {@Content( mediaType = "application/json", - schema = @Schema(implementation = QueryResultDto.class))}), + schema = @Schema(implementation = List.class))}), @ApiResponse(responseCode = "400", description = "Request pagination or table data select query is malformed", content = {@Content( @@ -193,17 +199,16 @@ public class TableEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<QueryResultDto> getData(@NotNull @PathVariable("databaseId") Long databaseId, - @NotNull @PathVariable("tableId") Long tableId, - @RequestParam(required = false) Instant timestamp, - @RequestParam(required = false) Long page, - @RequestParam(required = false) Long size, - @NotNull HttpServletRequest request, - Principal principal) + public ResponseEntity<List<Map<String, Object>>> getData(@NotNull @PathVariable("databaseId") Long databaseId, + @NotNull @PathVariable("tableId") Long tableId, + @RequestParam(required = false) Instant timestamp, + @RequestParam(required = false) Long page, + @RequestParam(required = false) Long size, + @NotNull HttpServletRequest request, + Principal principal) throws DatabaseUnavailableException, RemoteUnavailableException, TableNotFoundException, - TableMalformedException, PaginationException, QueryMalformedException, MetadataServiceException, - NotAllowedException { - log.debug("endpoint find table data, databaseId={}, tableId={}, timestamp={}, page={}, size={}", databaseId, + PaginationException, QueryMalformedException, MetadataServiceException, NotAllowedException { + log.debug("endpoint get table data, databaseId={}, tableId={}, timestamp={}, page={}, size={}", databaseId, tableId, timestamp, page, size); endpointValidator.validateDataParams(page, size); /* parameters */ @@ -228,18 +233,21 @@ public class TableEndpoint { metadataServiceGateway.getAccess(databaseId, UserUtil.getId(principal)); } try { + final HttpHeaders headers = new HttpHeaders(); if (request.getMethod().equals("HEAD")) { - final HttpHeaders headers = new HttpHeaders(); headers.set("Access-Control-Expose-Headers", "X-Count"); headers.set("X-Count", "" + tableService.getCount(table, timestamp)); return ResponseEntity.ok() .headers(headers) .build(); } - final QueryResultDto dto = tableService.getPaginatedData(table, timestamp, page, size); + headers.set("Access-Control-Expose-Headers", "X-Headers"); + headers.set("X-Headers", String.join(",", table.getColumns().stream().map(ColumnDto::getInternalName).toList())); return ResponseEntity.ok() - .body(dto); - } catch (SQLException e) { + .headers(headers) + .body(transform(tableService.getData(table.getDatabase(), table.getInternalName(), timestamp, + null, null, null, null))); + } catch (SQLException | QueryMalformedException e) { log.error("Failed to establish connection to database: {}", e.getMessage()); throw new DatabaseUnavailableException("Failed to establish connection to database: " + e.getMessage(), e); } @@ -552,13 +560,14 @@ public class TableEndpoint { @RequestParam(required = false) Instant timestamp, Principal principal) throws RemoteUnavailableException, TableNotFoundException, NotAllowedException, StorageUnavailableException, - QueryMalformedException, MetadataServiceException, MalformedException { + QueryMalformedException, MetadataServiceException { log.debug("endpoint export table data, databaseId={}, tableId={}, timestamp={}", databaseId, tableId, timestamp); /* parameters */ if (timestamp == null) { timestamp = Instant.now(); log.debug("timestamp not set: default to {}", timestamp); } + // TODO improve to single operation checking if user xyz has access to table abc final PrivilegedTableDto table = metadataServiceGateway.getTableById(databaseId, tableId); if (!table.getIsPublic()) { if (principal == null) { @@ -567,8 +576,10 @@ public class TableEndpoint { } metadataServiceGateway.getAccess(databaseId, UserUtil.getId(principal)); } + final Dataset<Row> dataset = tableService.getData(table.getDatabase(), table.getInternalName(), timestamp, null, + null, null, null); + final ExportResourceDto resource = storageService.transformDataset(dataset); final HttpHeaders headers = new HttpHeaders(); - final ExportResourceDto resource = tableService.exportDataset(table, timestamp); headers.add("Content-Disposition", "attachment; filename=\"" + resource.getFilename() + "\""); log.trace("export table resulted in resource {}", resource); return ResponseEntity.ok() diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java index f0b1b891e73990b56510ec292643db96fbe6c1da..001350246e68e7e75bbfc781695b284138c01ace 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java @@ -1,14 +1,16 @@ package at.tuwien.endpoints; import at.tuwien.ExportResourceDto; +import at.tuwien.api.database.ViewColumnDto; import at.tuwien.api.database.ViewCreateDto; import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.internal.PrivilegedViewDto; -import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.api.error.ApiErrorDto; import at.tuwien.exception.*; import at.tuwien.gateway.MetadataServiceGateway; +import at.tuwien.service.StorageService; +import at.tuwien.service.TableService; import at.tuwien.service.ViewService; import at.tuwien.utils.UserUtil; import at.tuwien.validation.EndpointValidator; @@ -22,7 +24,6 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; -import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; @@ -37,21 +38,26 @@ import java.security.Principal; import java.sql.SQLException; import java.time.Instant; import java.util.List; +import java.util.Map; @Log4j2 @RestController @CrossOrigin(origins = "*") @RequestMapping(path = "/api/database/{databaseId}/view") -public class ViewEndpoint { +public class ViewEndpoint extends AbstractEndpoint { private final ViewService viewService; + private final TableService tableService; + private final StorageService storageService; private final EndpointValidator endpointValidator; private final MetadataServiceGateway metadataServiceGateway; @Autowired - public ViewEndpoint(ViewService viewService, EndpointValidator endpointValidator, - MetadataServiceGateway metadataServiceGateway) { + public ViewEndpoint(ViewService viewService, TableService tableService, StorageService storageService, + EndpointValidator endpointValidator, MetadataServiceGateway metadataServiceGateway) { this.viewService = viewService; + this.tableService = tableService; + this.storageService = storageService; this.endpointValidator = endpointValidator; this.metadataServiceGateway = metadataServiceGateway; } @@ -188,7 +194,7 @@ public class ViewEndpoint { log.debug("endpoint delete view, databaseId={}, viewId={}", databaseId, viewId); final PrivilegedViewDto view = metadataServiceGateway.getViewById(databaseId, viewId); try { - viewService.delete(view); + viewService.delete(view.getDatabase(), view.getInternalName()); return ResponseEntity.status(HttpStatus.ACCEPTED) .build(); } catch (SQLException e) { @@ -209,7 +215,7 @@ public class ViewEndpoint { @Header(name = "Access-Control-Expose-Headers", description = "Expose `X-Count` custom header", schema = @Schema(implementation = String.class), required = true)}, content = {@Content( mediaType = "application/json", - schema = @Schema(implementation = QueryResultDto.class))}), + schema = @Schema(implementation = List.class))}), @ApiResponse(responseCode = "400", description = "Request pagination is malformed", content = {@Content( @@ -236,16 +242,15 @@ public class ViewEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<QueryResultDto> getData(@NotNull @PathVariable("databaseId") Long databaseId, - @NotNull @PathVariable("viewId") Long viewId, - @RequestParam(required = false) Long page, - @RequestParam(required = false) Long size, - @RequestParam(required = false) Instant timestamp, - @NotNull HttpServletRequest request, - Principal principal) - throws DatabaseUnavailableException, RemoteUnavailableException, ViewNotFoundException, - QueryMalformedException, ViewMalformedException, PaginationException, NotAllowedException, - MetadataServiceException { + public ResponseEntity<List<Map<String, Object>>> getData(@NotNull @PathVariable("databaseId") Long databaseId, + @NotNull @PathVariable("viewId") Long viewId, + @RequestParam(required = false) Long page, + @RequestParam(required = false) Long size, + @RequestParam(required = false) Instant timestamp, + @NotNull HttpServletRequest request, + Principal principal) + throws DatabaseUnavailableException, RemoteUnavailableException, ViewNotFoundException, PaginationException, + QueryMalformedException, NotAllowedException, MetadataServiceException, TableNotFoundException { log.debug("endpoint get view data, databaseId={}, viewId={}, page={}, size={}, timestamp={}", databaseId, viewId, page, size, timestamp); endpointValidator.validateDataParams(page, size); @@ -262,23 +267,26 @@ public class ViewEndpoint { timestamp = Instant.now(); log.debug("timestamp not set: default to {}", timestamp); } + // TODO improve with a single operation that checks if user xyz has access to view abc final PrivilegedViewDto view = metadataServiceGateway.getViewById(databaseId, viewId); if (!view.getIsPublic()) { metadataServiceGateway.getAccess(databaseId, UserUtil.getId(principal)); } try { + final HttpHeaders headers = new HttpHeaders(); if (request.getMethod().equals("HEAD")) { - final HttpHeaders headers = new HttpHeaders(); headers.set("Access-Control-Expose-Headers", "X-Count"); headers.set("X-Count", "" + viewService.count(view, timestamp)); return ResponseEntity.ok() .headers(headers) .build(); } - final QueryResultDto result = viewService.data(view, timestamp, page, size); - log.trace("get view data resulted in result {}", result); + headers.set("Access-Control-Expose-Headers", "X-Headers"); + headers.set("X-Headers", String.join(",", view.getColumns().stream().map(ViewColumnDto::getInternalName).toList())); return ResponseEntity.ok() - .body(result); + .headers(headers) + .body(transform(tableService.getData(view.getDatabase(), view.getInternalName(), timestamp, page, + size, null, null))); } catch (SQLException e) { log.error("Failed to establish connection to database: {}", e.getMessage()); throw new DatabaseUnavailableException("Failed to establish connection to database: " + e.getMessage(), e); @@ -319,11 +327,17 @@ public class ViewEndpoint { }) public ResponseEntity<InputStreamResource> exportDataset(@NotNull @PathVariable("databaseId") Long databaseId, @NotNull @PathVariable("viewId") Long viewId, + @RequestParam(required = false) Instant timestamp, Principal principal) throws RemoteUnavailableException, ViewNotFoundException, NotAllowedException, MetadataServiceException, - StorageUnavailableException, QueryMalformedException, MalformedException { + StorageUnavailableException, QueryMalformedException, TableNotFoundException { log.debug("endpoint export view data, databaseId={}, viewId={}", databaseId, viewId); /* parameters */ + if (timestamp == null) { + timestamp = Instant.now(); + log.debug("timestamp not set: default to {}", timestamp); + } + /* parameters */ final PrivilegedViewDto view = metadataServiceGateway.getViewById(databaseId, viewId); if (!view.getIsPublic()) { if (principal == null) { @@ -332,8 +346,13 @@ public class ViewEndpoint { } metadataServiceGateway.getAccess(databaseId, UserUtil.getId(principal)); } + final List<String> columns = view.getColumns() + .stream() + .map(ViewColumnDto::getInternalName) + .toList(); final HttpHeaders headers = new HttpHeaders(); - final ExportResourceDto resource = viewService.exportDataset(view); + final ExportResourceDto resource = storageService.transformDataset(tableService.getData(view.getDatabase(), + view.getInternalName(), timestamp, null, null, null, null)); headers.add("Content-Disposition", "attachment; filename=\"" + resource.getFilename() + "\""); log.trace("export table resulted in resource {}", resource); return ResponseEntity.ok() diff --git a/dbrepo-data-service/rest-service/src/main/resources/application.yml b/dbrepo-data-service/rest-service/src/main/resources/application.yml index 9bd16e6089443bfb2eb8972d7a8bc362661cb2a5..c23c50bad69ac5916357f276efddb51c00e10202 100644 --- a/dbrepo-data-service/rest-service/src/main/resources/application.yml +++ b/dbrepo-data-service/rest-service/src/main/resources/application.yml @@ -3,27 +3,26 @@ application: version: '@project.version@' spring: datasource: - url: jdbc:h2:mem:fda;DB_CLOSE_ON_EXIT=FALSE;INIT=CREATE SCHEMA IF NOT EXISTS FDA;NON_KEYWORDS=value + url: "jdbc:h2:mem:dbrepo;DB_CLOSE_ON_EXIT=FALSE;INIT=CREATE SCHEMA IF NOT EXISTS dbrepo;NON_KEYWORDS=value" driver-class-name: org.h2.Driver username: sa password: password - rabbitmq: - host: "${BROKER_HOST:broker-service}" - virtual-host: "${BROKER_VIRTUALHOST:dbrepo}" - password: "${BROKER_PASSWORD:admin}" - username: "${BROKER_USERNAME:admin}" - port: ${BROKER_PORT:5672} jpa: show-sql: false - database-platform: org.hibernate.dialect.H2Dialect open-in-view: false properties: hibernate: - default_schema: fda + default_schema: "${METADATA_DB:dbrepo}" jdbc: time_zone: UTC application: name: data-service + rabbitmq: + host: "${BROKER_HOST:broker-service}" + virtual-host: "${BROKER_VIRTUALHOST:dbrepo}" + username: "${BROKER_USERNAME:admin}" + password: "${BROKER_PASSWORD:admin}" + port: ${BROKER_PORT:5672} main: banner-mode: off management: @@ -65,8 +64,8 @@ dbrepo: jwt: public_key: "${JWT_PUBKEY:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB}" keycloak: - username: "${AUTH_SERVICE_ADMIN:fda}" - password: "${AUTH_SERVICE_ADMIN_PASSWORD:fda}" + username: "${AUTH_SERVICE_ADMIN:admin}" + password: "${AUTH_SERVICE_ADMIN_PASSWORD:admin}" client: "${AUTH_SERVICE_CLIENT:dbrepo-client}" clientSecret: "${AUTH_SERVICE_CLIENT_SECRET:MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}" sql: @@ -81,4 +80,4 @@ dbrepo: queueName: "${BROKER_QUEUE_NAME:dbrepo}" exchangeName: "${BROKER_EXCHANGE_NAME:dbrepo}" routingKey: "${BROKER_ROUTING_KEY:#}" - connectionTimeout: ${CONNECTION_TIMEOUT:10000} + connectionTimeout: "${SPARQL_CONNECTION_TIMEOUT:10000}" diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/annotations/MockAmqp.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/annotations/MockAmqp.java deleted file mode 100644 index 0f3868c25e5494ffe409046883f4ad6d5babff4a..0000000000000000000000000000000000000000 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/annotations/MockAmqp.java +++ /dev/null @@ -1,17 +0,0 @@ -package at.tuwien.annotations; - -import at.tuwien.listener.DefaultListener; -import com.rabbitmq.client.Channel; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.boot.test.mock.mockito.MockBeans; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -@MockBeans({@MockBean(Channel.class), @MockBean(DefaultListener.class)}) -public @interface MockAmqp { -} diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java index 5f302368eedec06766e77328fe4d738c28e9a168..f1d1b6d795a88f14e3f256df3ccf097a59afc292 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java @@ -1,25 +1,27 @@ package at.tuwien.endpoint; -import at.tuwien.ExportResourceDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.query.ExecuteStatementDto; import at.tuwien.api.database.query.QueryDto; import at.tuwien.api.database.query.QueryPersistDto; -import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.endpoints.SubsetEndpoint; import at.tuwien.exception.*; import at.tuwien.gateway.MetadataServiceGateway; +import at.tuwien.service.SchemaService; +import at.tuwien.service.StorageService; import at.tuwien.service.SubsetService; import at.tuwien.test.AbstractUnitTest; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.log4j.Log4j2; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; +import org.apache.spark.sql.SparkSession; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -28,13 +30,12 @@ import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; -import java.io.InputStream; import java.sql.SQLException; import java.time.Instant; import java.util.List; +import java.util.Map; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @Log4j2 @@ -45,12 +46,21 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { @Autowired private SubsetEndpoint subsetEndpoint; + @Autowired + private SparkSession sparkSession; + @MockBean private SubsetService subsetService; + @MockBean + private SchemaService schemaService; + @MockBean private HttpServletRequest httpServletRequest; + @MockBean + private StorageService storageService; + @MockBean private MetadataServiceGateway metadataServiceGateway; @@ -108,8 +118,8 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { @WithAnonymousUser public void findById_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException, DatabaseUnavailableException, StorageUnavailableException, QueryMalformedException, QueryNotFoundException, - FormatNotAvailableException, StorageNotFoundException, SQLException, MetadataServiceException, - ViewNotFoundException, MalformedException { + FormatNotAvailableException, TableNotFoundException, MetadataServiceException, SQLException, + ViewMalformedException { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) @@ -142,19 +152,18 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { @WithAnonymousUser public void findById_acceptCsv_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException, DatabaseUnavailableException, StorageUnavailableException, QueryMalformedException, - QueryNotFoundException, FormatNotAvailableException, StorageNotFoundException, SQLException, - MetadataServiceException, ViewNotFoundException, MalformedException { - final ExportResourceDto mock = ExportResourceDto.builder() - .filename("deadbeef") - .resource(new InputStreamResource(InputStream.nullInputStream())) - .build(); + QueryNotFoundException, FormatNotAvailableException, SQLException, MetadataServiceException, + TableNotFoundException, ViewMalformedException { + final Dataset<Row> mock = sparkSession.emptyDataFrame(); /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) .thenReturn(DATABASE_3_PRIVILEGED_DTO); when(subsetService.findById(DATABASE_3_PRIVILEGED_DTO, QUERY_5_ID)) .thenReturn(QUERY_5_DTO); - when(subsetService.export(any(PrivilegedDatabaseDto.class), any(QueryDto.class), any(Instant.class))) + when(storageService.transformDataset(any(Dataset.class))) + .thenReturn(EXPORT_RESOURCE_DTO); + when(subsetService.getData(any(PrivilegedDatabaseDto.class), any(QueryDto.class), eq(null), eq(null))) .thenReturn(mock); /* test */ @@ -165,20 +174,19 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { @WithAnonymousUser public void findById_timestamp_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException, DatabaseUnavailableException, StorageUnavailableException, QueryMalformedException, - QueryNotFoundException, FormatNotAvailableException, StorageNotFoundException, SQLException, - MetadataServiceException, ViewNotFoundException, MalformedException { - final ExportResourceDto mock = ExportResourceDto.builder() - .filename("deadbeef") - .resource(new InputStreamResource(InputStream.nullInputStream())) - .build(); + QueryNotFoundException, FormatNotAvailableException, SQLException, MetadataServiceException, + TableNotFoundException, ViewMalformedException { + final Dataset<Row> mock = sparkSession.emptyDataFrame(); /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) .thenReturn(DATABASE_3_PRIVILEGED_DTO); when(subsetService.findById(DATABASE_3_PRIVILEGED_DTO, QUERY_5_ID)) .thenReturn(QUERY_5_DTO); - when(subsetService.export(any(PrivilegedDatabaseDto.class), any(QueryDto.class), any(Instant.class))) + when(subsetService.getData(any(PrivilegedDatabaseDto.class), any(QueryDto.class), eq(null), eq(null))) .thenReturn(mock); + when(storageService.transformDataset(any(Dataset.class))) + .thenReturn(EXPORT_RESOURCE_DTO); /* test */ generic_findById(QUERY_5_ID, MediaType.parseMediaType("text/csv"), Instant.now()); @@ -220,23 +228,19 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { @Test @WithAnonymousUser public void findById_unavailableExport_fails() throws DatabaseNotFoundException, RemoteUnavailableException, - MetadataServiceException, SQLException, StorageUnavailableException, QueryMalformedException, - StorageNotFoundException, UserNotFoundException, QueryNotFoundException, ViewNotFoundException, MalformedException { - final ExportResourceDto mock = ExportResourceDto.builder() - .filename("deadbeef") - .resource(new InputStreamResource(InputStream.nullInputStream())) - .build(); + MetadataServiceException, SQLException, QueryMalformedException, UserNotFoundException, + QueryNotFoundException, TableNotFoundException, ViewMalformedException, StorageUnavailableException { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) .thenReturn(DATABASE_3_PRIVILEGED_DTO); when(subsetService.findById(DATABASE_3_PRIVILEGED_DTO, QUERY_5_ID)) .thenReturn(QUERY_5_DTO); - when(subsetService.export(any(PrivilegedDatabaseDto.class), any(QueryDto.class), any(Instant.class))) - .thenReturn(mock); + when(storageService.transformDataset(any(Dataset.class))) + .thenReturn(EXPORT_RESOURCE_DTO); doThrow(SQLException.class) .when(subsetService) - .export(eq(DATABASE_3_PRIVILEGED_DTO), eq(QUERY_5_DTO), any(Instant.class)); + .getData(eq(DATABASE_3_PRIVILEGED_DTO), eq(QUERY_5_DTO), eq(null), eq(null)); /* test */ assertThrows(DatabaseUnavailableException.class, () -> { @@ -248,9 +252,10 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { @WithMockUser(username = USER_1_USERNAME, authorities = {"execute-query"}) public void create_noAccess_succeeds() throws UserNotFoundException, QueryStoreInsertException, TableMalformedException, NotAllowedException, QueryNotSupportedException, PaginationException, - StorageNotFoundException, DatabaseUnavailableException, StorageUnavailableException, + StorageNotFoundException, DatabaseUnavailableException, StorageUnavailableException, SQLException, QueryMalformedException, QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException, - SQLException, MetadataServiceException { + MetadataServiceException, TableNotFoundException, ViewMalformedException, ViewNotFoundException { + final Dataset<Row> mock = sparkSession.emptyDataFrame(); final ExecuteStatementDto request = ExecuteStatementDto.builder() .statement(QUERY_5_STATEMENT) .build(); @@ -258,11 +263,17 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) .thenReturn(DATABASE_3_PRIVILEGED_DTO); - when(subsetService.execute(eq(DATABASE_3_PRIVILEGED_DTO), anyString(), any(Instant.class), eq(USER_1_ID), eq(0L), eq(10L), eq(null), eq(null))) - .thenReturn(QUERY_5_RESULT_DTO); + when(subsetService.getData(eq(DATABASE_3_PRIVILEGED_DTO), any(QueryDto.class), eq(0L), eq(10L))) + .thenReturn(mock); + when(subsetService.findById(eq(DATABASE_3_PRIVILEGED_DTO), anyLong())) + .thenReturn(QUERY_5_DTO); + when(schemaService.inspectView(eq(DATABASE_3_PRIVILEGED_DTO), anyString())) + .thenReturn(VIEW_5_DTO); + when(httpServletRequest.getMethod()) + .thenReturn("POST"); /* test */ - subsetEndpoint.create(DATABASE_3_ID, request, USER_1_PRINCIPAL, 0L, 10L, null); + subsetEndpoint.create(DATABASE_3_ID, request, USER_1_PRINCIPAL, httpServletRequest, null, 0L, 10L); } @Test @@ -272,9 +283,13 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { .statement("SELECT COUNT(id) FROM tbl") .build(); + /* mock */ + when(httpServletRequest.getMethod()) + .thenReturn("POST"); + /* test */ assertThrows(QueryNotSupportedException.class, () -> { - subsetEndpoint.create(DATABASE_3_ID, request, USER_1_PRINCIPAL, 0L, 10L, null); + subsetEndpoint.create(DATABASE_3_ID, request, USER_1_PRINCIPAL, httpServletRequest, null, 0L, 10L); }); } @@ -284,7 +299,9 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { TableMalformedException, NotAllowedException, QueryNotSupportedException, PaginationException, StorageNotFoundException, DatabaseUnavailableException, StorageUnavailableException, QueryMalformedException, QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException, - SQLException, MetadataServiceException { + SQLException, MetadataServiceException, TableNotFoundException, ViewMalformedException, + ViewNotFoundException { + final Dataset<Row> mock = sparkSession.emptyDataFrame(); final ExecuteStatementDto request = ExecuteStatementDto.builder() .statement(QUERY_5_STATEMENT) .build(); @@ -292,18 +309,24 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) .thenReturn(DATABASE_3_PRIVILEGED_DTO); - when(subsetService.execute(eq(DATABASE_3_PRIVILEGED_DTO), anyString(), any(Instant.class), eq(USER_1_ID), eq(0L), eq(10L), eq(null), eq(null))) - .thenReturn(QUERY_5_RESULT_DTO); + when(schemaService.inspectView(eq(DATABASE_3_PRIVILEGED_DTO), anyString())) + .thenReturn(VIEW_5_DTO); + when(subsetService.findById(eq(DATABASE_3_PRIVILEGED_DTO), anyLong())) + .thenReturn(QUERY_5_DTO); + when(subsetService.getData(eq(DATABASE_3_PRIVILEGED_DTO), any(QueryDto.class), eq(0L), eq(10L))) + .thenReturn(mock); + when(httpServletRequest.getMethod()) + .thenReturn("POST"); /* test */ - subsetEndpoint.create(DATABASE_3_ID, request, USER_1_PRINCIPAL, null, null, null); + subsetEndpoint.create(DATABASE_3_ID, request, USER_1_PRINCIPAL, httpServletRequest, null, null, null); } @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"execute-query"}) - public void create_unavailable_succeeds() throws UserNotFoundException, QueryStoreInsertException, - TableMalformedException, NotAllowedException, QueryNotFoundException, DatabaseNotFoundException, - RemoteUnavailableException, SQLException, MetadataServiceException { + public void create_unavailable_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, + SQLException, MetadataServiceException, QueryMalformedException, TableNotFoundException, + ViewMalformedException, UserNotFoundException, QueryNotFoundException, QueryStoreInsertException { final ExecuteStatementDto request = ExecuteStatementDto.builder() .statement(QUERY_5_STATEMENT) .build(); @@ -313,11 +336,18 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { .thenReturn(DATABASE_3_PRIVILEGED_DTO); doThrow(SQLException.class) .when(subsetService) - .execute(eq(DATABASE_3_PRIVILEGED_DTO), anyString(), any(Instant.class), eq(USER_1_ID), eq(0L), eq(10L), eq(null), eq(null)); + .getData(eq(DATABASE_3_PRIVILEGED_DTO), any(QueryDto.class), eq(null), eq(null)); + when(subsetService.findById(eq(DATABASE_3_PRIVILEGED_DTO), anyLong())) + .thenReturn(QUERY_5_DTO); + doThrow(SQLException.class) + .when(subsetService) + .create(eq(DATABASE_3_PRIVILEGED_DTO), eq(QUERY_5_STATEMENT), any(Instant.class), eq(USER_1_ID)); + when(httpServletRequest.getMethod()) + .thenReturn("POST"); /* test */ assertThrows(DatabaseUnavailableException.class, () -> { - subsetEndpoint.create(DATABASE_3_ID, request, USER_1_PRINCIPAL, null, null, null); + subsetEndpoint.create(DATABASE_3_ID, request, USER_1_PRINCIPAL, httpServletRequest, null, null, null); }); } @@ -333,10 +363,12 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { doThrow(DatabaseNotFoundException.class) .when(metadataServiceGateway) .getDatabaseById(DATABASE_3_ID); + when(httpServletRequest.getMethod()) + .thenReturn("POST"); /* test */ assertThrows(DatabaseNotFoundException.class, () -> { - subsetEndpoint.create(DATABASE_3_ID, request, USER_1_PRINCIPAL, null, null, null); + subsetEndpoint.create(DATABASE_3_ID, request, USER_1_PRINCIPAL, httpServletRequest, null, null, null); }); } @@ -346,7 +378,8 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { MetadataServiceException, UserNotFoundException, QueryStoreInsertException, TableMalformedException, NotAllowedException, SQLException, QueryNotFoundException, DatabaseUnavailableException, StorageUnavailableException, QueryMalformedException, QueryNotSupportedException, PaginationException, - StorageNotFoundException { + StorageNotFoundException, TableNotFoundException, ViewMalformedException, ViewNotFoundException { + final Dataset<Row> mock = sparkSession.emptyDataFrame(); final ExecuteStatementDto request = ExecuteStatementDto.builder() .statement(QUERY_5_STATEMENT) .build(); @@ -354,11 +387,17 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) .thenReturn(DATABASE_3_PRIVILEGED_DTO); - when(subsetService.execute(eq(DATABASE_3_PRIVILEGED_DTO), anyString(), any(Instant.class), eq(USER_4_ID), eq(0L), eq(10L), eq(null), eq(null))) - .thenReturn(QUERY_5_RESULT_DTO); + when(subsetService.getData(eq(DATABASE_3_PRIVILEGED_DTO), any(QueryDto.class), eq(0L), eq(10L))) + .thenReturn(mock); + when(subsetService.findById(eq(DATABASE_3_PRIVILEGED_DTO), anyLong())) + .thenReturn(QUERY_5_DTO); + when(schemaService.inspectView(eq(DATABASE_3_PRIVILEGED_DTO), anyString())) + .thenReturn(VIEW_5_DTO); + when(httpServletRequest.getMethod()) + .thenReturn("POST"); /* test */ - subsetEndpoint.create(DATABASE_3_ID, request, USER_4_PRINCIPAL, null, null, null); + subsetEndpoint.create(DATABASE_3_ID, request, USER_4_PRINCIPAL, httpServletRequest, null, null, null); } @Test @@ -367,7 +406,8 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { MetadataServiceException, UserNotFoundException, QueryStoreInsertException, TableMalformedException, NotAllowedException, SQLException, QueryNotFoundException, DatabaseUnavailableException, StorageUnavailableException, QueryMalformedException, QueryNotSupportedException, PaginationException, - StorageNotFoundException { + StorageNotFoundException, TableNotFoundException, ViewMalformedException, ViewNotFoundException { + final Dataset<Row> mock = sparkSession.emptyDataFrame(); final ExecuteStatementDto request = ExecuteStatementDto.builder() .statement(QUERY_5_STATEMENT) .build(); @@ -375,17 +415,25 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) .thenReturn(DATABASE_3_PRIVILEGED_DTO); - when(subsetService.execute(eq(DATABASE_3_PRIVILEGED_DTO), anyString(), any(Instant.class), eq(null), eq(0L), eq(10L), eq(null), eq(null))) - .thenReturn(QUERY_5_RESULT_DTO); + when(subsetService.findById(eq(DATABASE_3_PRIVILEGED_DTO), anyLong())) + .thenReturn(QUERY_5_DTO); + when(subsetService.getData(eq(DATABASE_3_PRIVILEGED_DTO), any(QueryDto.class), eq(0L), eq(10L))) + .thenReturn(mock); + when(schemaService.inspectView(eq(DATABASE_3_PRIVILEGED_DTO), anyString())) + .thenReturn(VIEW_5_DTO); + when(httpServletRequest.getMethod()) + .thenReturn("POST"); /* test */ - subsetEndpoint.create(DATABASE_3_ID, request, null, null, null, null); + subsetEndpoint.create(DATABASE_3_ID, request, null, httpServletRequest, null, null, null); } @Test public void getData_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException, NotAllowedException, SQLException, QueryNotFoundException, TableMalformedException, QueryMalformedException, - DatabaseUnavailableException, PaginationException, MetadataServiceException { + DatabaseUnavailableException, PaginationException, MetadataServiceException, TableNotFoundException, + ViewMalformedException, ViewNotFoundException { + final Dataset<Row> mock = sparkSession.emptyDataFrame(); /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) @@ -394,21 +442,24 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { .thenReturn(QUERY_5_DTO); when(subsetService.reExecuteCount(DATABASE_3_PRIVILEGED_DTO, QUERY_5_DTO)) .thenReturn(QUERY_5_RESULT_NUMBER); - when(subsetService.reExecute(DATABASE_3_PRIVILEGED_DTO, QUERY_5_DTO, 0L, 10L, null, null)) - .thenReturn(QUERY_5_RESULT_DTO); + when(subsetService.getData(eq(DATABASE_3_PRIVILEGED_DTO), any(QueryDto.class), eq(0L), eq(10L))) + .thenReturn(mock); + when(schemaService.inspectView(eq(DATABASE_3_PRIVILEGED_DTO), anyString())) + .thenReturn(VIEW_5_DTO); when(httpServletRequest.getMethod()) .thenReturn("GET"); /* test */ - final ResponseEntity<QueryResultDto> response = subsetEndpoint.getData(DATABASE_3_ID, QUERY_5_ID, null, httpServletRequest, null, null); + final ResponseEntity<List<Map<String, Object>>> response = subsetEndpoint.getData(DATABASE_3_ID, QUERY_5_ID, null, httpServletRequest, null, null); assertEquals(HttpStatus.OK, response.getStatusCode()); assertNotNull(response.getBody()); } @Test - public void getData_head_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException, - NotAllowedException, SQLException, QueryNotFoundException, TableMalformedException, QueryMalformedException, - DatabaseUnavailableException, PaginationException, MetadataServiceException { + public void getData_head_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, + UserNotFoundException, NotAllowedException, SQLException, QueryNotFoundException, TableMalformedException, + QueryMalformedException, DatabaseUnavailableException, PaginationException, MetadataServiceException, + TableNotFoundException, ViewMalformedException, ViewNotFoundException { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID)) @@ -421,7 +472,7 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { .thenReturn("HEAD"); /* test */ - final ResponseEntity<QueryResultDto> response = subsetEndpoint.getData(DATABASE_3_ID, QUERY_5_ID, null, httpServletRequest, null, null); + final ResponseEntity<List<Map<String, Object>>> response = subsetEndpoint.getData(DATABASE_3_ID, QUERY_5_ID, null, httpServletRequest, null, null); assertEquals(HttpStatus.OK, response.getStatusCode()); assertNotNull(response.getHeaders().get("X-Count")); assertEquals(1, response.getHeaders().get("X-Count").size()); @@ -432,22 +483,26 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { @WithMockUser(username = USER_1_USERNAME) public void getData_private_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException, DatabaseUnavailableException, NotAllowedException, TableMalformedException, - QueryMalformedException, QueryNotFoundException, PaginationException, SQLException, MetadataServiceException { + QueryMalformedException, QueryNotFoundException, PaginationException, SQLException, + MetadataServiceException, TableNotFoundException, ViewMalformedException, ViewNotFoundException { + final Dataset<Row> mock = sparkSession.emptyDataFrame(); /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) .thenReturn(DATABASE_1_PRIVILEGED_DTO); - when(httpServletRequest.getMethod()) - .thenReturn("GET"); when(subsetService.findById(DATABASE_1_PRIVILEGED_DTO, QUERY_1_ID)) .thenReturn(QUERY_1_DTO); when(subsetService.reExecuteCount(DATABASE_1_PRIVILEGED_DTO, QUERY_1_DTO)) .thenReturn(QUERY_1_RESULT_NUMBER); - when(subsetService.reExecute(DATABASE_1_PRIVILEGED_DTO, QUERY_1_DTO, 0L, 10L, null, null)) - .thenReturn(QUERY_1_RESULT_DTO); + when(subsetService.getData(DATABASE_1_PRIVILEGED_DTO, QUERY_1_DTO, 0L, 10L)) + .thenReturn(mock); + when(schemaService.inspectView(eq(DATABASE_1_PRIVILEGED_DTO), anyString())) + .thenReturn(VIEW_1_DTO); + when(httpServletRequest.getMethod()) + .thenReturn("GET"); /* test */ - final ResponseEntity<QueryResultDto> response = subsetEndpoint.getData(DATABASE_1_ID, QUERY_1_ID, USER_1_PRINCIPAL, httpServletRequest, null, null); + final ResponseEntity<List<Map<String, Object>>> response = subsetEndpoint.getData(DATABASE_1_ID, QUERY_1_ID, USER_1_PRINCIPAL, httpServletRequest, null, null); assertEquals(HttpStatus.OK, response.getStatusCode()); assertNotNull(response.getBody()); } @@ -489,7 +544,8 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { @WithMockUser(username = USER_1_USERNAME) public void getData_privateHead_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException, DatabaseUnavailableException, NotAllowedException, TableMalformedException, - QueryMalformedException, QueryNotFoundException, PaginationException, SQLException, MetadataServiceException { + QueryMalformedException, QueryNotFoundException, PaginationException, SQLException, + MetadataServiceException, TableNotFoundException, ViewMalformedException, ViewNotFoundException { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) @@ -502,7 +558,7 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { .thenReturn("HEAD"); /* test */ - final ResponseEntity<QueryResultDto> response = subsetEndpoint.getData(DATABASE_1_ID, QUERY_1_ID, USER_1_PRINCIPAL, httpServletRequest, null, null); + final ResponseEntity<List<Map<String, Object>>> response = subsetEndpoint.getData(DATABASE_1_ID, QUERY_1_ID, USER_1_PRINCIPAL, httpServletRequest, null, null); assertEquals(HttpStatus.OK, response.getStatusCode()); assertNotNull(response.getHeaders().get("X-Count")); assertEquals(1, response.getHeaders().get("X-Count").size()); @@ -512,8 +568,8 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_1_USERNAME) public void getData_unavailable_fails() throws DatabaseNotFoundException, RemoteUnavailableException, SQLException, - UserNotFoundException, NotAllowedException, TableMalformedException, QueryNotFoundException, - MetadataServiceException { + UserNotFoundException, QueryNotFoundException, MetadataServiceException, QueryMalformedException, + TableNotFoundException, ViewMalformedException { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) @@ -524,7 +580,7 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { .thenReturn("GET"); doThrow(SQLException.class) .when(subsetService) - .reExecute(DATABASE_1_PRIVILEGED_DTO, QUERY_1_DTO, 0L, 10L, null, null); + .getData(DATABASE_1_PRIVILEGED_DTO, QUERY_1_DTO, 0L, 10L); /* test */ assertThrows(DatabaseUnavailableException.class, () -> { @@ -654,7 +710,7 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { protected void generic_findById(Long subsetId, MediaType accept, Instant timestamp) throws UserNotFoundException, DatabaseUnavailableException, StorageUnavailableException, QueryMalformedException, QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException, FormatNotAvailableException, - StorageNotFoundException, MetadataServiceException, ViewNotFoundException, MalformedException { + MetadataServiceException, TableNotFoundException, ViewMalformedException, SQLException { /* mock */ when(mockHttpServletRequest.getHeader("Accept")) diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java index f13b02caa2f8d268ba7449ab322d7e4deab34dd6..66f06786fb85ea1a95961216044d05a04d8f4c41 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java @@ -1,9 +1,7 @@ package at.tuwien.endpoint; -import at.tuwien.ExportResourceDto; import at.tuwien.api.database.DatabaseAccessDto; import at.tuwien.api.database.query.ImportDto; -import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.api.database.table.*; import at.tuwien.api.database.table.internal.PrivilegedTableDto; import at.tuwien.endpoints.TableEndpoint; @@ -14,6 +12,9 @@ import at.tuwien.service.TableService; import at.tuwien.test.AbstractUnitTest; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.log4j.Log4j2; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; +import org.apache.spark.sql.SparkSession; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -31,11 +32,11 @@ import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; -import java.io.InputStream; import java.sql.SQLException; import java.time.Instant; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.*; @@ -50,6 +51,9 @@ public class TableEndpointUnitTest extends AbstractUnitTest { private TableEndpoint tableEndpoint; @Autowired + private SparkSession sparkSession; + + @MockBean private HttpServletRequest httpServletRequest; @MockBean @@ -269,41 +273,43 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithAnonymousUser - public void getData_succeeds() throws DatabaseUnavailableException, TableNotFoundException, TableMalformedException, - SQLException, QueryMalformedException, RemoteUnavailableException, PaginationException, MetadataServiceException, - NotAllowedException { + public void getData_succeeds() throws DatabaseUnavailableException, TableNotFoundException, QueryMalformedException, + RemoteUnavailableException, PaginationException, MetadataServiceException, NotAllowedException { + final Dataset<Row> mock = sparkSession.emptyDataFrame(); /* mock */ when(metadataServiceGateway.getTableById(DATABASE_3_ID, TABLE_8_ID)) .thenReturn(TABLE_8_PRIVILEGED_DTO); - when(tableService.getPaginatedData(eq(TABLE_8_PRIVILEGED_DTO), any(Instant.class), eq(0L), eq(10L))) - .thenReturn(TABLE_8_DATA_DTO); + when(tableService.getData(eq(DATABASE_3_PRIVILEGED_DTO), eq(TABLE_8_INTERNAL_NAME), any(Instant.class), eq(null), eq(null), eq(null), eq(null))) + .thenReturn(mock); + when(httpServletRequest.getMethod()) + .thenReturn("GET"); /* test */ - final ResponseEntity<QueryResultDto> response = tableEndpoint.getData(DATABASE_3_ID, TABLE_8_ID, null, null, null, httpServletRequest, null); + final ResponseEntity<List<Map<String, Object>>> response = tableEndpoint.getData(DATABASE_3_ID, TABLE_8_ID, null, null, null, httpServletRequest, null); assertEquals(HttpStatus.OK, response.getStatusCode()); } @Test @WithAnonymousUser - public void getData_head_succeeds() throws DatabaseUnavailableException, TableNotFoundException, TableMalformedException, - SQLException, QueryMalformedException, RemoteUnavailableException, PaginationException, MetadataServiceException, - NotAllowedException { - final HttpServletRequest mock = mock(HttpServletRequest.class); + public void getData_head_succeeds() throws DatabaseUnavailableException, TableNotFoundException, + SQLException, QueryMalformedException, RemoteUnavailableException, PaginationException, + MetadataServiceException, NotAllowedException { + final Dataset<Row> mock = sparkSession.emptyDataFrame(); /* mock */ when(metadataServiceGateway.getTableById(DATABASE_3_ID, TABLE_8_ID)) .thenReturn(TABLE_8_PRIVILEGED_DTO); - when(mock.getMethod()) - .thenReturn("HEAD"); when(tableService.getCount(eq(TABLE_8_PRIVILEGED_DTO), any(Instant.class))) .thenReturn(3L); - when(tableService.getPaginatedData(eq(TABLE_8_PRIVILEGED_DTO), any(Instant.class), eq(0L), eq(10L))) - .thenReturn(TABLE_8_DATA_DTO); + when(tableService.getData(eq(DATABASE_3_PRIVILEGED_DTO), eq(TABLE_8_INTERNAL_NAME), any(Instant.class), eq(null), eq(null), eq(null), eq(null))) + .thenReturn(mock); + when(httpServletRequest.getMethod()) + .thenReturn("HEAD"); /* test */ - final ResponseEntity<QueryResultDto> response = tableEndpoint.getData(DATABASE_3_ID, TABLE_8_ID, null, null, null, mock, null); + final ResponseEntity<List<Map<String, Object>>> response = tableEndpoint.getData(DATABASE_3_ID, TABLE_8_ID, null, null, null, httpServletRequest, null); assertEquals(HttpStatus.OK, response.getStatusCode()); assertNotNull(response.getHeaders().get("Access-Control-Expose-Headers")); assertEquals("X-Count", response.getHeaders().get("Access-Control-Expose-Headers").get(0)); @@ -348,14 +354,16 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithAnonymousUser public void getData_unavailable_fails() throws TableNotFoundException, RemoteUnavailableException, - MetadataServiceException, TableMalformedException, SQLException { + MetadataServiceException, QueryMalformedException { /* mock */ when(metadataServiceGateway.getTableById(DATABASE_3_ID, TABLE_8_ID)) .thenReturn(TABLE_8_PRIVILEGED_DTO); - doThrow(SQLException.class) + doThrow(QueryMalformedException.class) .when(tableService) - .getPaginatedData(eq(TABLE_8_PRIVILEGED_DTO), any(Instant.class), eq(0L), eq(10L)); + .getData(eq(DATABASE_3_PRIVILEGED_DTO), eq(TABLE_8_INTERNAL_NAME), any(Instant.class), eq(null), eq(null), eq(null), eq(null)); + when(httpServletRequest.getMethod()) + .thenReturn("GET"); /* test */ assertThrows(DatabaseUnavailableException.class, () -> { @@ -385,19 +393,22 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @WithMockUser(username = USER_2_USERNAME) @MethodSource("anyAccess_parameters") public void getData_private_succeeds(String name, DatabaseAccessDto access) throws DatabaseUnavailableException, - TableNotFoundException, TableMalformedException, SQLException, QueryMalformedException, - RemoteUnavailableException, PaginationException, MetadataServiceException, NotAllowedException { + TableNotFoundException, QueryMalformedException, RemoteUnavailableException, PaginationException, + MetadataServiceException, NotAllowedException { + final Dataset<Row> mock = sparkSession.emptyDataFrame(); /* mock */ when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID)) .thenReturn(TABLE_1_PRIVILEGED_DTO); when(metadataServiceGateway.getAccess(DATABASE_1_ID, USER_2_ID)) .thenReturn(access); - when(tableService.getPaginatedData(eq(TABLE_1_PRIVILEGED_DTO), any(Instant.class), eq(0L), eq(10L))) - .thenReturn(TABLE_1_DATA_DTO); + when(tableService.getData(eq(DATABASE_1_PRIVILEGED_DTO), eq(TABLE_1_INTERNAL_NAME), any(Instant.class), eq(null), eq(null), eq(null), eq(null))) + .thenReturn(mock); + when(httpServletRequest.getMethod()) + .thenReturn("GET"); /* test */ - final ResponseEntity<QueryResultDto> response = tableEndpoint.getData(DATABASE_1_ID, TABLE_1_ID, null, null, null, httpServletRequest, USER_2_PRINCIPAL); + final ResponseEntity<List<Map<String, Object>>> response = tableEndpoint.getData(DATABASE_1_ID, TABLE_1_ID, null, null, null, httpServletRequest, USER_2_PRINCIPAL); assertEquals(HttpStatus.OK, response.getStatusCode()); } @@ -1125,24 +1136,19 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithAnonymousUser - public void exportData_succeeds() throws DatabaseUnavailableException, TableNotFoundException, NotAllowedException, - StorageUnavailableException, QueryMalformedException, RemoteUnavailableException, StorageNotFoundException, - SQLException, MetadataServiceException, MalformedException { - final ExportResourceDto mock = ExportResourceDto.builder() - .filename("deadbeef") - .resource(new InputStreamResource(InputStream.nullInputStream())) - .build(); + public void exportData_succeeds() throws TableNotFoundException, NotAllowedException, + StorageUnavailableException, QueryMalformedException, RemoteUnavailableException, MetadataServiceException { + final Dataset<Row> mock = sparkSession.emptyDataFrame(); /* mock */ when(metadataServiceGateway.getTableById(DATABASE_3_ID, TABLE_8_ID)) .thenReturn(TABLE_8_PRIVILEGED_DTO); - when(tableService.exportDataset(eq(TABLE_8_PRIVILEGED_DTO), any(Instant.class))) + when(tableService.getData(eq(DATABASE_3_PRIVILEGED_DTO), eq(TABLE_8_INTERNAL_NAME), any(Instant.class), eq(null), eq(null), eq(null), eq(null))) .thenReturn(mock); /* test */ final ResponseEntity<InputStreamResource> response = tableEndpoint.exportDataset(DATABASE_3_ID, TABLE_8_ID, null, null); assertEquals(HttpStatus.OK, response.getStatusCode()); - } @ParameterizedTest @@ -1150,24 +1156,20 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @MethodSource("anyAccess_parameters") public void exportData_private_succeeds(String name, DatabaseAccessDto access) throws TableNotFoundException, NotAllowedException, StorageUnavailableException, QueryMalformedException, RemoteUnavailableException, - MetadataServiceException, MalformedException { - final ExportResourceDto mock = ExportResourceDto.builder() - .filename("deadbeef") - .resource(new InputStreamResource(InputStream.nullInputStream())) - .build(); + MetadataServiceException { + final Dataset<Row> mock = sparkSession.emptyDataFrame(); /* mock */ when(metadataServiceGateway.getTableById(DATABASE_1_ID, TABLE_1_ID)) .thenReturn(TABLE_1_PRIVILEGED_DTO); when(metadataServiceGateway.getAccess(DATABASE_1_ID, USER_2_ID)) .thenReturn(access); - when(tableService.exportDataset(eq(TABLE_1_PRIVILEGED_DTO), any(Instant.class))) + when(tableService.getData(eq(DATABASE_1_PRIVILEGED_DTO), eq(TABLE_1_INTERNAL_NAME), any(Instant.class), eq(null), eq(null), eq(null), eq(null))) .thenReturn(mock); /* test */ final ResponseEntity<InputStreamResource> response = tableEndpoint.exportDataset(DATABASE_1_ID, TABLE_1_ID, null, USER_2_PRINCIPAL); assertEquals(HttpStatus.OK, response.getStatusCode()); - } @Test diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/ViewEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/ViewEndpointUnitTest.java index 2e856b2d2fbdcfc22368bafa72e99e77798a83a1..8062de7b454306dd86c1118c7a7ffca65794d905 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/ViewEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/ViewEndpointUnitTest.java @@ -1,7 +1,6 @@ package at.tuwien.endpoint; import at.tuwien.api.database.ViewDto; -import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.endpoints.ViewEndpoint; import at.tuwien.exception.*; import at.tuwien.gateway.MetadataServiceGateway; @@ -22,10 +21,10 @@ import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.sql.SQLException; -import java.time.Instant; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.*; @Log4j2 @@ -189,15 +188,15 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"}) - public void delete_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, ViewMalformedException, - SQLException, DatabaseUnavailableException, ViewNotFoundException, MetadataServiceException { + public void delete_succeeds() throws RemoteUnavailableException, ViewMalformedException, ViewNotFoundException, + SQLException, DatabaseUnavailableException, MetadataServiceException { /* mock */ - when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) - .thenReturn(DATABASE_1_PRIVILEGED_DTO); + when(metadataServiceGateway.getViewById(DATABASE_1_ID, VIEW_1_ID)) + .thenReturn(VIEW_1_PRIVILEGED_DTO); doNothing() .when(viewService) - .delete(VIEW_1_PRIVILEGED_DTO); + .delete(DATABASE_1_PRIVILEGED_DTO, VIEW_1_INTERNAL_NAME); /* test */ final ResponseEntity<Void> response = viewEndpoint.delete(DATABASE_1_ID, VIEW_1_ID); @@ -214,7 +213,7 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { .thenReturn(VIEW_1_PRIVILEGED_DTO); doThrow(SQLException.class) .when(viewService) - .delete(VIEW_1_PRIVILEGED_DTO); + .delete(DATABASE_1_PRIVILEGED_DTO, VIEW_1_INTERNAL_NAME); /* test */ assertThrows(DatabaseUnavailableException.class, () -> { @@ -232,7 +231,7 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { .thenReturn(DATABASE_1_PRIVILEGED_DTO); doNothing() .when(viewService) - .delete(VIEW_1_PRIVILEGED_DTO); + .delete(DATABASE_1_PRIVILEGED_DTO, VIEW_1_INTERNAL_NAME); /* test */ assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { @@ -256,77 +255,77 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { }); } - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"view-database-view-data"}) - public void getData_private_succeeds() throws RemoteUnavailableException, ViewNotFoundException, ViewMalformedException, - SQLException, DatabaseUnavailableException, QueryMalformedException, PaginationException, - NotAllowedException, MetadataServiceException { - - /* mock */ - when(metadataServiceGateway.getViewById(DATABASE_1_ID, VIEW_1_ID)) - .thenReturn(VIEW_1_PRIVILEGED_DTO); - when(metadataServiceGateway.getAccess(DATABASE_1_ID, USER_1_ID)) - .thenReturn(DATABASE_1_USER_1_READ_ACCESS_DTO); - when(httpServletRequest.getMethod()) - .thenReturn("GET"); - when(viewService.data(eq(VIEW_1_PRIVILEGED_DTO), any(Instant.class), eq(0L), eq(10L))) - .thenReturn(VIEW_1_DATA_DTO); - - /* test */ - final ResponseEntity<QueryResultDto> response = viewEndpoint.getData(DATABASE_1_ID, VIEW_1_ID, null, null, null, httpServletRequest, USER_1_PRINCIPAL); - assertEquals(HttpStatus.OK, response.getStatusCode()); - assertNotNull(response.getBody()); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"view-database-view-data"}) - public void getData_privateHead_succeeds() throws RemoteUnavailableException, ViewNotFoundException, - ViewMalformedException, SQLException, DatabaseUnavailableException, QueryMalformedException, - PaginationException, NotAllowedException, MetadataServiceException { - - /* mock */ - when(metadataServiceGateway.getViewById(DATABASE_1_ID, VIEW_3_ID)) - .thenReturn(VIEW_3_PRIVILEGED_DTO); - when(metadataServiceGateway.getAccess(DATABASE_1_ID, USER_1_ID)) - .thenReturn(DATABASE_1_USER_1_READ_ACCESS_DTO); - when(httpServletRequest.getMethod()) - .thenReturn("HEAD"); - when(viewService.count(eq(VIEW_3_PRIVILEGED_DTO), any(Instant.class))) - .thenReturn(VIEW_3_DATA_COUNT); - - /* test */ - final ResponseEntity<QueryResultDto> response = viewEndpoint.getData(DATABASE_1_ID, VIEW_3_ID, null, null, null, httpServletRequest, USER_1_PRINCIPAL); - assertEquals(HttpStatus.OK, response.getStatusCode()); - assertNotNull(response.getHeaders().get("X-Count")); - assertEquals(1, response.getHeaders().get("X-Count").size()); - assertEquals(VIEW_3_DATA_COUNT, Long.parseLong(response.getHeaders().get("X-Count").get(0))); - assertNotNull(response.getHeaders().get("Access-Control-Expose-Headers")); - assertEquals(1, response.getHeaders().get("Access-Control-Expose-Headers").size()); - assertEquals("X-Count", response.getHeaders().get("Access-Control-Expose-Headers").get(0)); - assertNull(response.getBody()); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"view-database-view-data"}) - public void getData_unavailable_fails() throws RemoteUnavailableException, ViewNotFoundException, SQLException, - ViewMalformedException, NotAllowedException, MetadataServiceException { - - /* mock */ - when(metadataServiceGateway.getViewById(DATABASE_1_ID, VIEW_1_ID)) - .thenReturn(VIEW_1_PRIVILEGED_DTO); - when(metadataServiceGateway.getAccess(DATABASE_1_ID, USER_1_ID)) - .thenReturn(DATABASE_1_USER_1_READ_ACCESS_DTO); - when(httpServletRequest.getMethod()) - .thenReturn("GET"); - doThrow(SQLException.class) - .when(viewService) - .data(eq(VIEW_1_PRIVILEGED_DTO), any(Instant.class), eq(0L), eq(10L)); - - /* test */ - assertThrows(DatabaseUnavailableException.class, () -> { - viewEndpoint.getData(DATABASE_1_ID, VIEW_1_ID, null, null, null, httpServletRequest, USER_1_PRINCIPAL); - }); - } +// @Test +// @WithMockUser(username = USER_1_USERNAME, authorities = {"view-database-view-data"}) +// public void getData_private_succeeds() throws RemoteUnavailableException, ViewNotFoundException, ViewMalformedException, +// SQLException, DatabaseUnavailableException, QueryMalformedException, PaginationException, +// NotAllowedException, MetadataServiceException { +// +// /* mock */ +// when(metadataServiceGateway.getViewById(DATABASE_1_ID, VIEW_1_ID)) +// .thenReturn(VIEW_1_PRIVILEGED_DTO); +// when(metadataServiceGateway.getAccess(DATABASE_1_ID, USER_1_ID)) +// .thenReturn(DATABASE_1_USER_1_READ_ACCESS_DTO); +// when(httpServletRequest.getMethod()) +// .thenReturn("GET"); +// when(viewService.data(eq(VIEW_1_PRIVILEGED_DTO), any(Instant.class), eq(0L), eq(10L))) +// .thenReturn(VIEW_1_DATA_DTO); +// +// /* test */ +// final ResponseEntity<QueryResultDto> response = viewEndpoint.getData(DATABASE_1_ID, VIEW_1_ID, null, null, null, httpServletRequest, USER_1_PRINCIPAL); +// assertEquals(HttpStatus.OK, response.getStatusCode()); +// assertNotNull(response.getBody()); +// } +// +// @Test +// @WithMockUser(username = USER_1_USERNAME, authorities = {"view-database-view-data"}) +// public void getData_privateHead_succeeds() throws RemoteUnavailableException, ViewNotFoundException, +// ViewMalformedException, SQLException, DatabaseUnavailableException, QueryMalformedException, +// PaginationException, NotAllowedException, MetadataServiceException { +// +// /* mock */ +// when(metadataServiceGateway.getViewById(DATABASE_1_ID, VIEW_3_ID)) +// .thenReturn(VIEW_3_PRIVILEGED_DTO); +// when(metadataServiceGateway.getAccess(DATABASE_1_ID, USER_1_ID)) +// .thenReturn(DATABASE_1_USER_1_READ_ACCESS_DTO); +// when(httpServletRequest.getMethod()) +// .thenReturn("HEAD"); +// when(viewService.count(eq(VIEW_3_PRIVILEGED_DTO), any(Instant.class))) +// .thenReturn(VIEW_3_DATA_COUNT); +// +// /* test */ +// final ResponseEntity<QueryResultDto> response = viewEndpoint.getData(DATABASE_1_ID, VIEW_3_ID, null, null, null, httpServletRequest, USER_1_PRINCIPAL); +// assertEquals(HttpStatus.OK, response.getStatusCode()); +// assertNotNull(response.getHeaders().get("X-Count")); +// assertEquals(1, response.getHeaders().get("X-Count").size()); +// assertEquals(VIEW_3_DATA_COUNT, Long.parseLong(response.getHeaders().get("X-Count").get(0))); +// assertNotNull(response.getHeaders().get("Access-Control-Expose-Headers")); +// assertEquals(1, response.getHeaders().get("Access-Control-Expose-Headers").size()); +// assertEquals("X-Count", response.getHeaders().get("Access-Control-Expose-Headers").get(0)); +// assertNull(response.getBody()); +// } +// +// @Test +// @WithMockUser(username = USER_1_USERNAME, authorities = {"view-database-view-data"}) +// public void getData_unavailable_fails() throws RemoteUnavailableException, ViewNotFoundException, SQLException, +// ViewMalformedException, NotAllowedException, MetadataServiceException { +// +// /* mock */ +// when(metadataServiceGateway.getViewById(DATABASE_1_ID, VIEW_1_ID)) +// .thenReturn(VIEW_1_PRIVILEGED_DTO); +// when(metadataServiceGateway.getAccess(DATABASE_1_ID, USER_1_ID)) +// .thenReturn(DATABASE_1_USER_1_READ_ACCESS_DTO); +// when(httpServletRequest.getMethod()) +// .thenReturn("GET"); +// doThrow(SQLException.class) +// .when(viewService) +// .data(eq(VIEW_1_PRIVILEGED_DTO), any(Instant.class), eq(0L), eq(10L)); +// +// /* test */ +// assertThrows(DatabaseUnavailableException.class, () -> { +// viewEndpoint.getData(DATABASE_1_ID, VIEW_1_ID, null, null, null, httpServletRequest, USER_1_PRINCIPAL); +// }); +// } @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"view-database-view-data"}) @@ -396,7 +395,7 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(NotAllowedException.class, () -> { - viewEndpoint.exportDataset(DATABASE_1_ID, VIEW_3_ID, USER_3_PRINCIPAL); + viewEndpoint.exportDataset(DATABASE_1_ID, VIEW_3_ID, null, USER_3_PRINCIPAL); }); } @@ -412,7 +411,7 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(ViewNotFoundException.class, () -> { - viewEndpoint.exportDataset(DATABASE_1_ID, VIEW_1_ID, USER_4_PRINCIPAL); + viewEndpoint.exportDataset(DATABASE_1_ID, VIEW_1_ID, null, USER_4_PRINCIPAL); }); } @@ -430,7 +429,7 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { /* test */ assertThrows(NotAllowedException.class, () -> { - viewEndpoint.exportDataset(DATABASE_1_ID, VIEW_3_ID, USER_1_PRINCIPAL); + viewEndpoint.exportDataset(DATABASE_1_ID, VIEW_3_ID, null, USER_1_PRINCIPAL); }); } diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/MetadataServiceGatewayUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/MetadataServiceGatewayUnitTest.java index 2730e94d9cb433b198681720a2d54d1de7fdef7a..939d8b5eac46d1d90e7a683b75693558070ef1d9 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/MetadataServiceGatewayUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/MetadataServiceGatewayUnitTest.java @@ -31,7 +31,8 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.*; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; @@ -62,7 +63,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest { headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME); headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD); headers.set("X-Database", DATABASE_1_INTERNALNAME); - headers.set("X-Table", TABLE_1_INTERNALNAME); + headers.set("X-Table", TABLE_1_INTERNAL_NAME); /* mock */ when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class))) @@ -78,7 +79,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest { assertEquals(CONTAINER_1_PRIVILEGED_USERNAME, response.getDatabase().getContainer().getUsername()); assertEquals(CONTAINER_1_PRIVILEGED_PASSWORD, response.getDatabase().getContainer().getPassword()); assertEquals(DATABASE_1_INTERNALNAME, response.getDatabase().getInternalName()); - assertEquals(TABLE_1_INTERNALNAME, response.getInternalName()); + assertEquals(TABLE_1_INTERNAL_NAME, response.getInternalName()); } @Test @@ -153,7 +154,7 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest { headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME); headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD); headers.set("X-Database", DATABASE_1_INTERNALNAME); - headers.set("X-Table", TABLE_1_INTERNALNAME); + headers.set("X-Table", TABLE_1_INTERNAL_NAME); /* mock */ when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(TableDto.class))) @@ -167,80 +168,6 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest { }); } - @Test - public void getDatabaseByInternalName_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, - MetadataServiceException { - - /* mock */ - final HttpHeaders headers = new HttpHeaders(); - headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME); - headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD); - when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(PrivilegedDatabaseDto[].class))) - .thenReturn(ResponseEntity.status(HttpStatus.OK) - .headers(headers) - .body(new PrivilegedDatabaseDto[]{DATABASE_1_PRIVILEGED_DTO})); - - /* test */ - final PrivilegedDatabaseDto response = metadataServiceGateway.getDatabaseByInternalName(DATABASE_1_INTERNALNAME); - assertEquals(response.getId(), response.getId()); - } - - @Test - public void getDatabaseByInternalName_unavailable_fails() { - - /* mock */ - doThrow(HttpServerErrorException.ServiceUnavailable.class) - .when(restTemplate) - .exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(PrivilegedDatabaseDto[].class)); - - /* test */ - assertThrows(RemoteUnavailableException.class, () -> { - metadataServiceGateway.getDatabaseByInternalName(DATABASE_1_INTERNALNAME); - }); - } - - @Test - public void getDatabaseByInternalName_statusCode_fails() { - - /* mock */ - when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(PrivilegedDatabaseDto[].class))) - .thenReturn(ResponseEntity.status(HttpStatus.NO_CONTENT) - .body(new PrivilegedDatabaseDto[]{DATABASE_1_PRIVILEGED_DTO})); - - /* test */ - assertThrows(MetadataServiceException.class, () -> { - metadataServiceGateway.getDatabaseByInternalName(DATABASE_1_INTERNALNAME); - }); - } - - @Test - public void getDatabaseByInternalName_emptyBody_fails() { - - /* mock */ - when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(PrivilegedDatabaseDto[].class))) - .thenReturn(ResponseEntity.ok() - .build()); - - /* test */ - assertThrows(DatabaseNotFoundException.class, () -> { - metadataServiceGateway.getDatabaseByInternalName(DATABASE_1_INTERNALNAME); - }); - } - - @Test - public void getDatabaseByInternalName_notFound_fails() { - - /* mock */ - when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(PrivilegedDatabaseDto[].class))) - .thenReturn(ResponseEntity.ok() - .body(new PrivilegedDatabaseDto[]{})); - - /* test */ - assertThrows(DatabaseNotFoundException.class, () -> { - metadataServiceGateway.getDatabaseByInternalName(DATABASE_1_INTERNALNAME); - }); - } - @Test public void getDatabaseById_succeeds() throws RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException { diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/ActuatorEndpointMvcTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/ActuatorEndpointMvcTest.java index f074abcc875b1f5389aa0c371f05247fac305cc9..a7a83a6184cab52aa4739df2005680a60eb7f81b 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/ActuatorEndpointMvcTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/ActuatorEndpointMvcTest.java @@ -1,6 +1,5 @@ package at.tuwien.mvc; -import at.tuwien.annotations.MockAmqp; import at.tuwien.test.AbstractUnitTest; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.Test; @@ -21,7 +20,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @AutoConfigureMockMvc @SpringBootTest @AutoConfigureObservability -@MockAmqp public class ActuatorEndpointMvcTest extends AbstractUnitTest { @Autowired diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/OpenApiEndpointMvcTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/OpenApiEndpointMvcTest.java index d1426cdf69db414892baed59cd121087cea8cc1b..b5ed475ea83a42db6f458d95254a081c5de5ae95 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/OpenApiEndpointMvcTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/OpenApiEndpointMvcTest.java @@ -12,7 +12,6 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java index f4bd429a9039ab2f2fb36c4fc2fce653ceda8054..01bce16b08f84e7ad3901beb143ef0737d9ad571 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java @@ -136,7 +136,7 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { /* ignore */ } try { - subsetEndpoint.create(DATABASE_1_ID, ExecuteStatementDto.builder().statement(QUERY_5_STATEMENT).build(), USER_1_PRINCIPAL, 0L, 10L, null); + subsetEndpoint.create(DATABASE_1_ID, ExecuteStatementDto.builder().statement(QUERY_5_STATEMENT).build(), USER_1_PRINCIPAL, httpServletRequest, null, 0L, 10L); } catch (Exception e) { /* ignore */ } diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/SubsetEndpointMvcTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/SubsetEndpointMvcTest.java index 94341550a389505f07301bb34c105547aaaec9b8..6a3851b445cf83b74eaccf1b6a3b86bf61ec03d8 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/SubsetEndpointMvcTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/SubsetEndpointMvcTest.java @@ -1,6 +1,5 @@ package at.tuwien.mvc; -import at.tuwien.annotations.MockAmqp; import at.tuwien.gateway.MetadataServiceGateway; import at.tuwien.service.SubsetService; import at.tuwien.test.AbstractUnitTest; @@ -26,7 +25,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @AutoConfigureMockMvc @SpringBootTest @AutoConfigureObservability -@MockAmqp public class SubsetEndpointMvcTest extends AbstractUnitTest { @MockBean diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java index 23503384b617ec7e066d9a0aeebe6c04c5f22a13..96d78da001a67a8e4e774b54b0c98e70234218b4 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java @@ -196,8 +196,8 @@ public class SchemaServiceIntegrationTest extends AbstractUnitTest { assertNotNull(unique0.getTable()); assertEquals("some_constraint", unique0.getName()); assertNull(unique0.getTable().getId()); - assertEquals(TABLE_1_INTERNALNAME, unique0.getTable().getName()); - assertEquals(TABLE_1_INTERNALNAME, unique0.getTable().getInternalName()); + assertEquals(TABLE_1_INTERNAL_NAME, unique0.getTable().getName()); + assertEquals(TABLE_1_INTERNAL_NAME, unique0.getTable().getInternalName()); assertEquals(TABLE_1_DESCRIPTION, unique0.getTable().getDescription()); assertTrue(unique0.getTable().getIsVersioned()); assertNotNull(unique0.getColumns()); @@ -235,8 +235,8 @@ public class SchemaServiceIntegrationTest extends AbstractUnitTest { final TableBriefDto fk0table = fk0.getTable(); assertNull(fk0table.getId()); assertEquals(DATABASE_1_ID, fk0table.getDatabaseId()); - assertEquals(TABLE_1_INTERNALNAME, fk0table.getName()); - assertEquals(TABLE_1_INTERNALNAME, fk0table.getInternalName()); + assertEquals(TABLE_1_INTERNAL_NAME, fk0table.getName()); + assertEquals(TABLE_1_INTERNAL_NAME, fk0table.getInternalName()); assertNotNull(fk0.getOnDelete()); assertNotNull(fk0.getOnUpdate()); assertNotNull(fk0.getReferencedTable()); diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SubsetServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SubsetServiceIntegrationTest.java index 0f0820926f71b5a78bebd0b6b97f763e99145abe..215e919844cab0f595b040eeb340e9f51cec2bde 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SubsetServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SubsetServiceIntegrationTest.java @@ -1,19 +1,13 @@ package at.tuwien.service; -import at.tuwien.ExportResourceDto; import at.tuwien.api.database.query.QueryDto; -import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.api.identifier.IdentifierDto; import at.tuwien.config.MariaDbConfig; import at.tuwien.config.MariaDbContainerConfig; -import at.tuwien.config.S3Config; import at.tuwien.exception.*; -import at.tuwien.gateway.AnalyseServiceGateway; import at.tuwien.gateway.MetadataServiceGateway; import at.tuwien.test.AbstractUnitTest; import lombok.extern.log4j.Log4j2; -import org.apache.commons.lang3.RandomStringUtils; -import org.apache.spark.sql.Dataset; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -25,16 +19,11 @@ import org.testcontainers.containers.MariaDBContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.io.IOException; -import java.math.BigInteger; import java.sql.SQLException; -import java.time.Instant; import java.util.List; import java.util.Map; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.when; @Log4j2 @@ -49,18 +38,9 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { @MockBean private MetadataServiceGateway metadataServiceGateway; - @MockBean - private AnalyseServiceGateway dataDatabaseSidecarGateway; - - @MockBean - private StorageService storageService; - @Container private static MariaDBContainer<?> mariaDBContainer = MariaDbContainerConfig.getContainer(); - @Autowired - private S3Config s3Config; - @BeforeEach public void beforeEach() throws SQLException { genesis(); @@ -69,138 +49,6 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_DTO); } - @Test - public void execute_succeeds() throws QueryStoreInsertException, TableMalformedException, SQLException, - QueryNotFoundException, UserNotFoundException, NotAllowedException, RemoteUnavailableException, - MetadataServiceException, DatabaseNotFoundException, InterruptedException { - - /* pre-condition */ - Thread.sleep(1000) /* wait for test container some more */; - - /* mock */ - when(metadataServiceGateway.getUserById(QUERY_1_CREATED_BY)) - .thenReturn(QUERY_1_CREATOR); - - /* test */ - final QueryResultDto response = queryService.execute(DATABASE_1_PRIVILEGED_DTO, QUERY_1_STATEMENT, Instant.now(), USER_1_ID, 0L, 10L, null, null); - assertNotNull(response); - assertNotNull(response.getId()); - assertNotNull(response.getHeaders()); - assertEquals(5, response.getHeaders().size()); - assertEquals(List.of(Map.of("id", 0), Map.of("date", 1), Map.of("location", 2), Map.of("mintemp", 3), Map.of("rainfall", 4)), response.getHeaders()); - assertNotNull(response.getResult()); - assertEquals(3, response.getResult().size()); - /* row 0 */ - assertEquals(BigInteger.valueOf(1L), response.getResult().get(0).get("id")); - assertEquals(Instant.ofEpochSecond(1228089600), response.getResult().get(0).get("date")); - assertEquals("Albury", response.getResult().get(0).get("location")); - assertEquals(13.4, response.getResult().get(0).get("mintemp")); - assertEquals(0.6, response.getResult().get(0).get("rainfall")); - /* row 1 */ - assertEquals(BigInteger.valueOf(2L), response.getResult().get(1).get("id")); - assertEquals(Instant.ofEpochSecond(1228176000), response.getResult().get(1).get("date")); - assertEquals("Albury", response.getResult().get(1).get("location")); - assertEquals(7.4, response.getResult().get(1).get("mintemp")); - assertEquals(0.0, response.getResult().get(1).get("rainfall")); - /* row 2 */ - assertEquals(BigInteger.valueOf(3L), response.getResult().get(2).get("id")); - assertEquals(Instant.ofEpochSecond(1228262400), response.getResult().get(2).get("date")); - assertEquals("Albury", response.getResult().get(2).get("location")); - assertEquals(12.9, response.getResult().get(2).get("mintemp")); - assertEquals(0.0, response.getResult().get(2).get("rainfall")); - } - - @Test - public void execute_joinWithAlias_succeeds() throws QueryStoreInsertException, TableMalformedException, - SQLException, QueryNotFoundException, UserNotFoundException, NotAllowedException, - RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException, InterruptedException { - - /* pre-condition */ - Thread.sleep(1000) /* wait for test container some more */; - - /* mock */ - when(metadataServiceGateway.getUserById(QUERY_1_CREATED_BY)) - .thenReturn(QUERY_1_CREATOR); - - /* test */ - final QueryResultDto response = queryService.execute(DATABASE_1_PRIVILEGED_DTO, QUERY_7_STATEMENT, Instant.now(), USER_1_ID, 0L, 10L, null, null); - assertNotNull(response); - assertNotNull(response.getId()); - assertNotNull(response.getHeaders()); - assertEquals(5, response.getHeaders().size()); - assertEquals(List.of(Map.of("id", 0), Map.of("date", 1), Map.of("location", 2), Map.of("lat", 3), Map.of("lng", 4)), response.getHeaders()); - assertNotNull(response.getResult()); - assertEquals(1, response.getResult().size()); - /* row 0 */ - assertEquals(BigInteger.valueOf(1L), response.getResult().get(0).get("id")); - assertEquals(Instant.ofEpochSecond(1228089600), response.getResult().get(0).get("date")); - assertEquals("Albury", response.getResult().get(0).get("location")); - assertEquals(-36.0653583, response.getResult().get(0).get("lat")); - assertEquals(146.9112214, response.getResult().get(0).get("lng")); - } - - @Test - public void execute_oneResult_succeeds() throws QueryStoreInsertException, TableMalformedException, SQLException, - QueryNotFoundException, UserNotFoundException, NotAllowedException, RemoteUnavailableException, - MetadataServiceException, DatabaseNotFoundException, InterruptedException { - - /* pre-condition */ - Thread.sleep(1000) /* wait for test container some more */; - - /* mock */ - when(metadataServiceGateway.getIdentifiers(DATABASE_1_ID, QUERY_1_ID)) - .thenReturn(List.of(IDENTIFIER_2_DTO)); - when(metadataServiceGateway.getUserById(QUERY_1_CREATED_BY)) - .thenReturn(QUERY_1_CREATOR); - - /* test */ - final QueryResultDto response = queryService.execute(DATABASE_1_PRIVILEGED_DTO, QUERY_1_STATEMENT, Instant.now(), USER_1_ID, 0L, 1L, null, null); - assertNotNull(response); - assertNotNull(response.getId()); - assertNotNull(response.getHeaders()); - assertEquals(5, response.getHeaders().size()); - assertEquals(List.of(Map.of("id", 0), Map.of("date", 1), Map.of("location", 2), Map.of("mintemp", 3), Map.of("rainfall", 4)), response.getHeaders()); - assertNotNull(response.getResult()); - assertEquals(1, response.getResult().size()); - /* row 0 */ - assertEquals(BigInteger.valueOf(1L), response.getResult().get(0).get("id")); - assertEquals(Instant.ofEpochSecond(1228089600), response.getResult().get(0).get("date")); - assertEquals("Albury", response.getResult().get(0).get("location")); - assertEquals(13.4, response.getResult().get(0).get("mintemp")); - assertEquals(0.6, response.getResult().get(0).get("rainfall")); - } - - @Test - public void execute_oneResultPagination_succeeds() throws QueryStoreInsertException, TableMalformedException, - SQLException, QueryNotFoundException, UserNotFoundException, NotAllowedException, - RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException, InterruptedException { - - /* pre-condition */ - Thread.sleep(1000) /* wait for test container some more */; - - /* mock */ - when(metadataServiceGateway.getUserById(USER_1_ID)) - .thenReturn(USER_1_DTO); - when(metadataServiceGateway.getIdentifiers(eq(DATABASE_1_ID), anyLong())) - .thenReturn(List.of()); - - /* test */ - final QueryResultDto response = queryService.execute(DATABASE_1_PRIVILEGED_DTO, QUERY_1_STATEMENT, Instant.now(), USER_1_ID, 1L, 1L, null, null); - assertNotNull(response); - assertNotNull(response.getId()); - assertNotNull(response.getHeaders()); - assertEquals(5, response.getHeaders().size()); - assertEquals(List.of(Map.of("id", 0), Map.of("date", 1), Map.of("location", 2), Map.of("mintemp", 3), Map.of("rainfall", 4)), response.getHeaders()); - assertNotNull(response.getResult()); - assertEquals(1, response.getResult().size()); - /* row 1 */ - assertEquals(BigInteger.valueOf(2L), response.getResult().get(0).get("id")); - assertEquals(Instant.ofEpochSecond(1228176000), response.getResult().get(0).get("date")); - assertEquals("Albury", response.getResult().get(0).get("location")); - assertEquals(7.4, response.getResult().get(0).get("mintemp")); - assertEquals(0.0, response.getResult().get(0).get("rainfall")); - } - @Test public void findAll_succeeds() throws SQLException, QueryNotFoundException, RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException, InterruptedException { @@ -300,18 +148,6 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { }); } - @Test - public void export_succeeds() throws SQLException, StorageUnavailableException, QueryMalformedException, - RemoteUnavailableException, IOException, StorageNotFoundException, InterruptedException, - AnalyseServiceException, ViewNotFoundException, MalformedException { - - /* mock */ - MariaDbConfig.dropQueryStore(DATABASE_1_PRIVILEGED_DTO); - - /* test */ - export_generic(); - } - protected void findById_generic(Long queryId) throws RemoteUnavailableException, SQLException, UserNotFoundException, QueryNotFoundException, MetadataServiceException, DatabaseNotFoundException, InterruptedException { @@ -378,26 +214,4 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest { assertEquals(0, response.size()); } - protected void export_generic() throws StorageUnavailableException, SQLException, RemoteUnavailableException, - QueryMalformedException, StorageNotFoundException, IOException, InterruptedException, - AnalyseServiceException, ViewNotFoundException, MalformedException { - final String filename = RandomStringUtils.randomAlphanumeric(40).toLowerCase() + ".tmp"; - EXPORT_RESOURCE_DTO.setFilename(filename); - - /* pre-condition */ - Thread.sleep(1000) /* wait for test container some more */; - - /* mock */ - doNothing() - .when(dataDatabaseSidecarGateway) - .exportTable(anyLong(), anyLong()); - when(storageService.transformDataset(any(Dataset.class))) - .thenReturn(EXPORT_RESOURCE_DTO); - - /* test */ - final ExportResourceDto response = queryService.export(DATABASE_1_PRIVILEGED_DTO, QUERY_1_DTO, Instant.now()); - assertEquals(filename, response.getFilename()); - assertNotNull(response.getResource().getInputStream()); - } - } diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java index 3b59dac2c14c6e1194af7b135869273719244d1f..1236c549d77c79271576738c6f6a226aea314b5a 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java @@ -1,7 +1,5 @@ package at.tuwien.service; -import at.tuwien.ExportResourceDto; -import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.api.database.table.*; import at.tuwien.api.database.table.columns.ColumnCreateDto; import at.tuwien.api.database.table.columns.ColumnDto; @@ -18,7 +16,6 @@ import at.tuwien.api.database.table.internal.TableCreateDto; import at.tuwien.config.MariaDbConfig; import at.tuwien.config.MariaDbContainerConfig; import at.tuwien.exception.*; -import at.tuwien.gateway.AnalyseServiceGateway; import at.tuwien.gateway.MetadataServiceGateway; import at.tuwien.test.AbstractUnitTest; import lombok.extern.log4j.Log4j2; @@ -27,23 +24,18 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.core.io.InputStreamResource; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.testcontainers.containers.MariaDBContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.io.InputStream; import java.math.BigDecimal; -import java.math.BigInteger; import java.sql.SQLException; import java.time.Instant; import java.util.*; import static at.tuwien.service.SchemaServiceIntegrationTest.assertColumn; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.when; @Log4j2 @@ -58,9 +50,6 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { @MockBean private MetadataServiceGateway metadataServiceGateway; - @MockBean - private AnalyseServiceGateway dataDatabaseSidecarGateway; - @MockBean private StorageService storageService; @@ -618,12 +607,12 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { TableExistsException { /* mock */ - MariaDbConfig.dropTable(DATABASE_1_PRIVILEGED_DTO, TABLE_1_INTERNALNAME); + MariaDbConfig.dropTable(DATABASE_1_PRIVILEGED_DTO, TABLE_1_INTERNAL_NAME); /* test */ final TableDto response = tableService.createTable(DATABASE_1_PRIVILEGED_DTO, TABLE_1_CREATE_INTERNAL_DTO); assertEquals(TABLE_1_NAME, response.getName()); - assertEquals(TABLE_1_INTERNALNAME, response.getInternalName()); + assertEquals(TABLE_1_INTERNAL_NAME, response.getInternalName()); assertEquals(TABLE_1_COLUMNS.size(), response.getColumns().size()); } @@ -674,49 +663,6 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { }); } - @Test - public void getPaginatedData_succeeds() throws SQLException, TableMalformedException { - - /* test */ - final QueryResultDto response = tableService.getPaginatedData(TABLE_1_PRIVILEGED_DTO, null, 0L, 10L); - assertEquals(TABLE_1_ID, response.getId()); - final List<Map<String, Integer>> headers = response.getHeaders(); - assertEquals(5, headers.size()); - assertEquals(0, headers.get(0).get("id")); - assertEquals(1, headers.get(1).get("date")); - assertEquals(2, headers.get(2).get("location")); - assertEquals(3, headers.get(3).get("mintemp")); - assertEquals(4, headers.get(4).get("rainfall")); - final List<Map<String, Object>> result = response.getResult(); - assertEquals(Instant.ofEpochSecond(1228089600), result.get(0).get("date")); - assertEquals(0.6, result.get(0).get("rainfall")); - assertEquals("Albury", result.get(0).get("location")); - assertEquals(BigInteger.valueOf(1L), result.get(0).get("id")); - assertEquals(13.4, result.get(0).get("mintemp")); - assertEquals(Instant.ofEpochSecond(1228176000), result.get(1).get("date")); - assertEquals(0.0, result.get(1).get("rainfall")); - assertEquals("Albury", result.get(1).get("location")); - assertEquals(BigInteger.valueOf(2L), result.get(1).get("id")); - assertEquals(7.4, result.get(1).get("mintemp")); - assertEquals(Instant.ofEpochSecond(1228262400), result.get(2).get("date")); - assertEquals(0.0, result.get(2).get("rainfall")); - assertEquals("Albury", result.get(2).get("location")); - assertEquals(BigInteger.valueOf(3L), result.get(2).get("id")); - assertEquals(12.9, result.get(2).get("mintemp")); - } - - @Test - public void getPaginatedData_notFound_fails() throws SQLException { - - /* mock */ - MariaDbConfig.createDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_2_INTERNALNAME); - - /* test */ - assertThrows(TableMalformedException.class, () -> { - tableService.getPaginatedData(TABLE_5_PRIVILEGED_DTO, null, 0L, 10L); - }); - } - @Test public void history_succeeds() throws SQLException, TableNotFoundException { @@ -741,36 +687,4 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { }); } - @Test - public void exportTable_succeeds() throws QueryMalformedException, RemoteUnavailableException, - StorageNotFoundException, StorageUnavailableException, AnalyseServiceException, TableNotFoundException, - MalformedException { - final ExportResourceDto mock = ExportResourceDto.builder() - .filename("weather_aus.csv") - .resource(new InputStreamResource(InputStream.nullInputStream())) - .build(); - - /* mock */ - doNothing() - .when(dataDatabaseSidecarGateway) - .exportTable(anyLong(), anyLong()); - when(storageService.getResource("weather_aus.csv")) - .thenReturn(mock); - - /* test */ - final ExportResourceDto response = tableService.exportDataset(TABLE_1_PRIVILEGED_DTO, null); - } - - @Test - public void exportDataset_malformedData_fails() throws SQLException { - - /* mock */ - MariaDbConfig.createDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_2_INTERNALNAME); - - /* test */ - assertThrows(QueryMalformedException.class, () -> { - tableService.exportDataset(TABLE_5_PRIVILEGED_DTO, null); - }); - } - } diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java index 4018c95334ffff498ac0f72aa28528e719d266f0..f3b309cba43d28545b4d7bcac45bdfef42c5b089 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java @@ -2,7 +2,6 @@ package at.tuwien.service; import at.tuwien.api.database.ViewColumnDto; import at.tuwien.api.database.ViewDto; -import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.config.MariaDbConfig; import at.tuwien.config.MariaDbContainerConfig; import at.tuwien.exception.DatabaseMalformedException; @@ -21,9 +20,7 @@ import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import java.sql.SQLException; -import java.time.Instant; import java.util.List; -import java.util.Map; import static org.junit.jupiter.api.Assertions.*; @@ -51,7 +48,7 @@ public class ViewServiceIntegrationTest extends AbstractUnitTest { public void delete_succeeds() throws SQLException, ViewMalformedException { /* test */ - viewService.delete(VIEW_1_PRIVILEGED_DTO); + viewService.delete(DATABASE_1_PRIVILEGED_DTO, VIEW_1_INTERNAL_NAME); } @Test @@ -75,36 +72,6 @@ public class ViewServiceIntegrationTest extends AbstractUnitTest { } - @Test - public void data_succeeds() throws SQLException, ViewMalformedException { - - /* test */ - final QueryResultDto response = viewService.data(VIEW_2_PRIVILEGED_DTO, Instant.now(), 0L, 10L); - assertNotNull(response); - assertNotNull(response.getId()); - assertEquals(VIEW_2_ID, response.getId()); - assertNotNull(response.getHeaders()); - assertEquals(4, response.getHeaders().size()); - assertEquals(List.of(Map.of("date", 0), Map.of("loc", 1), Map.of("mintemp", 2), Map.of("rainfall", 3)), response.getHeaders()); - assertNotNull(response.getResult()); - assertEquals(3, response.getResult().size()); - /* row 0 */ - assertEquals(Instant.ofEpochSecond(1228089600), response.getResult().get(0).get("date")); - assertEquals("Albury", response.getResult().get(0).get("loc")); - assertEquals(13.4, response.getResult().get(0).get("mintemp")); - assertEquals(0.6, response.getResult().get(0).get("rainfall")); - /* row 1 */ - assertEquals(Instant.ofEpochSecond(1228176000), response.getResult().get(1).get("date")); - assertEquals("Albury", response.getResult().get(1).get("loc")); - assertEquals(7.4, response.getResult().get(1).get("mintemp")); - assertEquals(0.0, response.getResult().get(1).get("rainfall")); - /* row 2 */ - assertEquals(Instant.ofEpochSecond(1228262400), response.getResult().get(2).get("date")); - assertEquals("Albury", response.getResult().get(2).get("loc")); - assertEquals(12.9, response.getResult().get(2).get("mintemp")); - assertEquals(0.0, response.getResult().get(2).get("rainfall")); - } - @Test public void getSchemas_succeeds() throws SQLException, ViewNotFoundException, DatabaseMalformedException { diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/validation/EndpointValidatorUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/validation/EndpointValidatorUnitTest.java index b12313dfe957d0f02f05c58bfce1066979973d07..e237c32d2862c70e4f0f1ea4ccfae8f44e468ffb 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/validation/EndpointValidatorUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/validation/EndpointValidatorUnitTest.java @@ -1,6 +1,5 @@ package at.tuwien.validation; -import at.tuwien.annotations.MockAmqp; import at.tuwien.exception.PaginationException; import at.tuwien.exception.QueryNotSupportedException; import at.tuwien.test.AbstractUnitTest; @@ -12,19 +11,14 @@ import org.springframework.boot.test.autoconfigure.actuate.observability.AutoCon import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.test.web.servlet.MockMvc; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @Log4j2 @ExtendWith(SpringExtension.class) @AutoConfigureMockMvc @SpringBootTest @AutoConfigureObservability -@MockAmqp public class EndpointValidatorUnitTest extends AbstractUnitTest { @Autowired diff --git a/dbrepo-data-service/rest-service/src/test/resources/init/weather.sql b/dbrepo-data-service/rest-service/src/test/resources/init/weather.sql index 322e67cc07397105bb7c763efe4d37c905cc1b18..7b8dd082b5bce7ba87db7188c8d4814afb20f940 100644 --- a/dbrepo-data-service/rest-service/src/test/resources/init/weather.sql +++ b/dbrepo-data-service/rest-service/src/test/resources/init/weather.sql @@ -1,6 +1,8 @@ /* https://www.kaggle.com/jsphyg/weather-dataset-rattle-package */ -CREATE DATABASE weather; -USE weather; +CREATE +DATABASE weather; +USE +weather; CREATE TABLE weather_location ( @@ -12,8 +14,8 @@ CREATE TABLE weather_location CREATE TABLE weather_aus ( id SERIAL PRIMARY KEY, - `date` DATE NOT NULL, - location VARCHAR(255) NULL COMMENT 'Closest city', + `date` DATE NOT NULL, + location VARCHAR(255) NULL COMMENT 'Closest city', mintemp DOUBLE PRECISION NULL, rainfall DOUBLE PRECISION NULL, FOREIGN KEY (location) REFERENCES weather_location (location) ON DELETE SET NULL, @@ -44,7 +46,7 @@ CREATE TABLE sensor CREATE TABLE exotic_boolean ( - `bool_default` BOOLEAN NOT NULL PRIMARY KEY, + `bool_default` BOOLEAN NOT NULL PRIMARY KEY, `bool_tinyint` TINYINT(1) NOT NULL, `bool_tinyint_unsigned` TINYINT(1) UNSIGNED NOT NULL ) WITH SYSTEM VERSIONING; @@ -91,4 +93,11 @@ CREATE VIEW not_in_metadata_db2 AS ( select `date`, `location`, `mintemp` as `MinTemp`, `rainfall` as `Rainfall` from `weather_aus` +where `location` = 'Vienna'); + +-- internal view who should not be indexed into schema +CREATE VIEW 5c7ba02f681b889892ee82987aa6c74ce45a30973cfef06b78ce797f25189b9a AS +( +select `date`, `location`, `mintemp` as `MinTemp`, `rainfall` as `Rainfall` +from `weather_aus` where `location` = 'Vienna'); \ No newline at end of file diff --git a/dbrepo-data-service/services/pom.xml b/dbrepo-data-service/services/pom.xml index ee3c9b2b6cb322239efcc4eb8c828a5c6c6e88dc..66f014ef7c14c1e2ced090684a20a538a1713fcd 100644 --- a/dbrepo-data-service/services/pom.xml +++ b/dbrepo-data-service/services/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.5.2</version> + <version>1.5.3</version> </parent> <artifactId>services</artifactId> <name>dbrepo-data-service-services</name> - <version>1.5.2</version> + <version>1.5.3</version> <dependencies> <dependency> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service-querystore</artifactId> - <version>1.5.2</version> + <version>1.5.3</version> </dependency> </dependencies> diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/MetadataServiceGateway.java b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/MetadataServiceGateway.java index 282e7d593feec58991dc9f4530e3314fa208eb29..6575913040f1c62e242d092d1564bc3dccc87ba0 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/MetadataServiceGateway.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/MetadataServiceGateway.java @@ -4,11 +4,9 @@ import at.tuwien.api.container.internal.PrivilegedContainerDto; import at.tuwien.api.database.DatabaseAccessDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.internal.PrivilegedViewDto; -import at.tuwien.api.database.table.TableStatisticDto; import at.tuwien.api.database.table.internal.PrivilegedTableDto; import at.tuwien.api.identifier.IdentifierDto; import at.tuwien.api.user.PrivilegedUserDto; -import at.tuwien.api.user.UserBriefDto; import at.tuwien.api.user.UserDto; import at.tuwien.exception.*; import jakarta.validation.constraints.NotNull; @@ -42,18 +40,6 @@ public interface MetadataServiceGateway { PrivilegedDatabaseDto getDatabaseById(Long id) throws DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException; - /** - * Get a database with given internal name from the metadata service. - * - * @param internalName The internal name. - * @return The database, if successful. - * @throws DatabaseNotFoundException The database was not found in the metadata service. - * @throws RemoteUnavailableException The remote service is not available. - * @throws MetadataServiceException The remote service returned invalid data. - */ - PrivilegedDatabaseDto getDatabaseByInternalName(String internalName) throws DatabaseNotFoundException, - RemoteUnavailableException, MetadataServiceException; - /** * Get a table with given database id and table id from the metadata service. * @@ -91,17 +77,6 @@ public interface MetadataServiceGateway { */ UserDto getUserById(UUID userId) throws RemoteUnavailableException, UserNotFoundException, MetadataServiceException; - /** - * Get a user with given username from the metadata service. - * - * @return The user, if successful. Otherwise empty list. - * @throws RemoteUnavailableException The remote service is not available and invalid data was returned. - * @throws UserNotFoundException The user was not found in the metadata service. - * @throws MetadataServiceException The remote service returned invalid data. - */ - UUID getSystemUserId() throws RemoteUnavailableException, UserNotFoundException, - MetadataServiceException; - /** * Get a user with given user id from the metadata service. * diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java index 3c03f022b311bbbe1d161888cec1a10d07bae55a..d83a06389d448e335ed0a5b339c28988ec8e0efa 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java @@ -10,9 +10,7 @@ import at.tuwien.api.database.table.TableDto; import at.tuwien.api.database.table.internal.PrivilegedTableDto; import at.tuwien.api.identifier.IdentifierDto; import at.tuwien.api.user.PrivilegedUserDto; -import at.tuwien.api.user.UserBriefDto; import at.tuwien.api.user.UserDto; -import at.tuwien.config.GatewayConfig; import at.tuwien.exception.*; import at.tuwien.gateway.MetadataServiceGateway; import at.tuwien.mapper.MetadataMapper; @@ -37,14 +35,11 @@ import java.util.UUID; public class MetadataServiceGatewayImpl implements MetadataServiceGateway { private final RestTemplate restTemplate; - private final GatewayConfig gatewayConfig; private final MetadataMapper metadataMapper; @Autowired - public MetadataServiceGatewayImpl(RestTemplate restTemplate, GatewayConfig gatewayConfig, - MetadataMapper metadataMapper) { + public MetadataServiceGatewayImpl(RestTemplate restTemplate, MetadataMapper metadataMapper) { this.restTemplate = restTemplate; - this.gatewayConfig = gatewayConfig; this.metadataMapper = metadataMapper; } @@ -121,37 +116,6 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway { return database; } - @Override - public PrivilegedDatabaseDto getDatabaseByInternalName(String internalName) throws DatabaseNotFoundException, - RemoteUnavailableException, MetadataServiceException { - final ResponseEntity<PrivilegedDatabaseDto[]> response; - final String url = "/api/database/"; - log.debug("find privileged database from url: {}", url); - try { - response = restTemplate.exchange(url, HttpMethod.GET, HttpEntity.EMPTY, PrivilegedDatabaseDto[].class); - } catch (ResourceAccessException | HttpServerErrorException e) { - log.error("Failed to find database with internal name {}: {}", internalName, e.getMessage()); - throw new RemoteUnavailableException("Failed to find database: " + e.getMessage(), e); - } - if (!response.getStatusCode().equals(HttpStatus.OK)) { - log.error("Failed to find database with internal name {}: service responded unsuccessful: {}", internalName, response.getStatusCode()); - throw new MetadataServiceException("Failed to find database: service responded unsuccessful: " + response.getStatusCode()); - } - /* body first, then headers next */ - if (response.getBody() == null || response.getBody().length != 1) { - log.error("Failed to find database with internal name {}: body is empty", internalName); - throw new DatabaseNotFoundException("Failed to find database: body is empty"); - } - final List<String> expectedHeaders = List.of("X-Username", "X-Password"); - if (!response.getHeaders().keySet().containsAll(expectedHeaders)) { - log.error("Failed to find all privileged database headers"); - log.debug("expected headers: {}", expectedHeaders); - log.debug("found headers: {}", response.getHeaders().keySet()); - throw new MetadataServiceException("Failed to find all privileged database headers"); - } - return response.getBody()[0]; - } - @Override public PrivilegedTableDto getTableById(Long databaseId, Long id) throws TableNotFoundException, RemoteUnavailableException, MetadataServiceException { @@ -259,34 +223,6 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway { return response.getBody(); } - @Override - public UUID getSystemUserId() throws RemoteUnavailableException, UserNotFoundException, - MetadataServiceException { - final ResponseEntity<UserBriefDto[]> response; - try { - response = restTemplate.exchange("/api/user?username=" + gatewayConfig.getSystemUsername(), HttpMethod.GET, HttpEntity.EMPTY, UserBriefDto[].class); - } catch (ResourceAccessException | HttpServerErrorException e) { - log.error("Failed to find user with username {}: {}", gatewayConfig.getSystemUsername(), e.getMessage()); - throw new RemoteUnavailableException("Failed to find user with username " + gatewayConfig.getSystemUsername() + ": " + e.getMessage(), e); - } catch (HttpClientErrorException.NotFound e) { - log.error("Failed to find user with username {}: not found: {}", gatewayConfig.getSystemUsername(), e.getMessage()); - throw new UserNotFoundException("Failed to find user with username " + gatewayConfig.getSystemUsername() + ": " + e.getMessage(), e); - } - if (!response.getStatusCode().equals(HttpStatus.OK)) { - log.error("Failed to find user with username {}: service responded unsuccessful: {}", gatewayConfig.getSystemUsername(), response.getStatusCode()); - throw new MetadataServiceException("Failed to find user with username " + gatewayConfig.getSystemUsername() + ": service responded unsuccessful: " + response.getStatusCode()); - } - if (response.getBody() == null) { - log.error("Failed to find user with username {}: body is empty", gatewayConfig.getSystemUsername()); - throw new MetadataServiceException("Failed to find user with username " + gatewayConfig.getSystemUsername() + ": body is empty"); - } - if (response.getBody().length != 1) { - log.error("Failed to find system user: expected exactly one result but got {}", response.getBody().length); - throw new MetadataServiceException("Failed to find system user: expected exactly one result but got " + response.getBody().length); - } - return response.getBody()[0].getId(); - } - @Override public PrivilegedUserDto getPrivilegedUserById(UUID userId) throws RemoteUnavailableException, UserNotFoundException, MetadataServiceException { diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java index 7a268f52487c55fed35ddd8576c78559d57792d1..ccb49288c5382cba306f3cc4cffe48ec139729b0 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java @@ -4,7 +4,6 @@ import at.tuwien.api.database.DatabaseDto; import at.tuwien.api.database.ViewColumnDto; import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.query.QueryDto; -import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.api.database.table.TableBriefDto; import at.tuwien.api.database.table.TableDto; import at.tuwien.api.database.table.TableHistoryDto; @@ -24,13 +23,7 @@ import at.tuwien.api.user.UserDto; import at.tuwien.config.QueryConfig; import at.tuwien.exception.QueryNotFoundException; import at.tuwien.exception.TableNotFoundException; -import net.sf.jsqlparser.JSQLParserException; -import net.sf.jsqlparser.parser.CCJSqlParserManager; -import net.sf.jsqlparser.schema.Column; -import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.select.*; import org.apache.hadoop.shaded.com.google.common.hash.Hashing; -import org.apache.hadoop.shaded.org.apache.commons.codec.binary.Hex; import org.apache.hadoop.shaded.org.apache.commons.io.FileUtils; import org.jetbrains.annotations.NotNull; import org.mapstruct.Mapper; @@ -40,15 +33,11 @@ import org.mapstruct.Mappings; import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.io.StringReader; -import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.sql.*; -import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeFormatterBuilder; import java.util.*; import java.util.stream.Collectors; @@ -210,161 +199,6 @@ public interface DataMapper { return view; } - /** - * Parse columns from a SQL statement of a known database. - * - * @param databaseId The database id. - * @param tables The list of tables. - * @param query The SQL statement. - * @return The list of columns. - * @throws JSQLParserException The table/view or column was not found in the database. - */ - default List<ColumnDto> parseColumns(Long databaseId, List<TableDto> tables, String query) throws JSQLParserException { - final List<ColumnDto> columns = new ArrayList<>(); - final CCJSqlParserManager parserRealSql = new CCJSqlParserManager(); - final net.sf.jsqlparser.statement.Statement statement = parserRealSql.parse(new StringReader(query)); - log.trace("parse columns from query: {}", query); - /* bi-directional mapping */ - tables.forEach(table -> table.getColumns() - .forEach(column -> column.setTable(table))); - /* check */ - if (!(statement instanceof Select selectStatement)) { - log.error("Query attempts to update the dataset, not a SELECT statement"); - throw new JSQLParserException("Query attempts to update the dataset"); - } - /* start parsing */ - final PlainSelect ps = (PlainSelect) selectStatement.getSelectBody(); - final List<SelectItem> clauses = ps.getSelectItems(); - log.trace("columns referenced in the from-clause: {}", clauses); - /* Parse all tables */ - final List<FromItem> fromItems = new ArrayList<>(fromItemToFromItems(ps.getFromItem())); - if (ps.getJoins() != null && !ps.getJoins().isEmpty()) { - log.trace("query contains join items: {}", ps.getJoins()); - for (net.sf.jsqlparser.statement.select.Join j : ps.getJoins()) { - if (j.getRightItem() != null) { - fromItems.add(j.getRightItem()); - } - } - } - final List<ColumnDto> allColumns = tables.stream() - .map(TableDto::getColumns) - .flatMap(List::stream) - .toList(); - log.trace("columns referenced in the from-clause and join-clause(s): {}", clauses); - /* Checking if all columns exist */ - for (SelectItem clause : clauses) { - final SelectExpressionItem item = (SelectExpressionItem) clause; - final Column column = (Column) item.getExpression(); - final String columnName = column.getColumnName().replace("`", ""); - final List<ColumnDto> filteredColumns = allColumns.stream() - .filter(c -> (c.getAlias() != null && c.getAlias().equals(columnName)) || c.getInternalName().equals(columnName)) - .toList(); - String tableOrView = null; - for (Table t : fromItems.stream().map(t -> (net.sf.jsqlparser.schema.Table) t).toList()) { - if (column.getTable() == null) { - /* column does not reference a specific table, find out */ - final List<String> filteredTables = filteredColumns.stream() - .map(c -> c.getTable().getInternalName()) - .filter(table -> fromItems.stream().map(f -> (Table) f).anyMatch(otherTable -> otherTable.getName().replace("`", "").equals(table))) - .toList(); - if (filteredTables.size() != 1) { - log.error("Failed to filter column {} to exactly one match: {}", columnName, filteredTables.stream().map(table -> table + "." + columnName).toList()); - throw new JSQLParserException("Failed to filter column " + columnName + " to exactly one match"); - } - if (tableMatches(t, filteredTables.get(0))) { - tableOrView = t.getName().replace("`", ""); - break; - } - } - /* column references a specific table */ - final String tableOrAlias = (t.getAlias() != null ? t.getAlias().getName() : column.getTable().getName()) - .replace("`", ""); - if (tableMatches(t, tableOrAlias)) { - tableOrView = t.getName().replace("`", ""); - break; - } - } - if (tableOrView == null) { - log.error("Failed to find table/view {} (with designator {})", column.getTable().getName(), column.getTable().getAlias()); - throw new JSQLParserException("Failed to find table/view " + column.getTable().getName() + " (with alias " + column.getTable().getAlias() + ")"); - } - final String finalTableOrView = tableOrView; - final List<ColumnDto> selectColumns = filteredColumns.stream() - .filter(c -> c.getTable().getInternalName().equals(finalTableOrView)) - .toList(); - final ColumnDto resultColumn; - if (selectColumns.size() != 1) { - if (filteredColumns.size() != 1) { - log.error("Failed to filter column {} to exactly one match: {}", columnName, selectColumns.stream().map(c -> c.getTable().getInternalName() + "." + c.getInternalName()).toList()); - throw new JSQLParserException("Failed to filter column " + columnName + " to exactly one match"); - } - resultColumn = filteredColumns.get(0); - } else { - resultColumn = selectColumns.get(0); - } - if (item.getAlias() != null) { - resultColumn.setAlias(item.getAlias().getName().replace("`", "")); - } - resultColumn.setDatabaseId(databaseId); - resultColumn.setTable(resultColumn.getTable()); - resultColumn.setTableId(resultColumn.getTable().getId()); - log.trace("found column with internal name {} and alias {}", resultColumn.getInternalName(), resultColumn.getAlias()); - columns.add(resultColumn); - } - return columns; - } - - default boolean tableMatches(net.sf.jsqlparser.schema.Table table, String tableOrDesignator) { - final String tableName = table.getName() - .trim() - .replace("`", ""); - if (table.getAlias() == null) { - /* table does not have designator */ - log.trace("table '{}' has no designator", tableName); - return tableName.equals(tableOrDesignator); - } - /* has designator */ - final String designator = table.getAlias() - .getName() - .trim() - .replace("`", ""); - log.trace("table '{}' has designator {}", tableName, designator); - return designator.equals(tableOrDesignator); - } - - default List<FromItem> fromItemToFromItems(FromItem data) throws JSQLParserException { - return fromItemToFromItems(data, 0); - } - - default List<FromItem> fromItemToFromItems(FromItem data, Integer level) throws JSQLParserException { - final List<FromItem> fromItems = new LinkedList<>(); - if (data instanceof net.sf.jsqlparser.schema.Table table) { - fromItems.add(data); - log.trace("from-item {} is of type table: level ~> {}", table.getName(), level); - return fromItems; - } - if (data instanceof SubJoin subJoin) { - log.trace("from-item is of type sub-join: level ~> {}", level); - for (Join join : subJoin.getJoinList()) { - final List<FromItem> tmp = fromItemToFromItems(join.getRightItem(), level + 1); - if (tmp == null) { - log.error("Failed to find right sub-join table: {}", join.getRightItem()); - throw new JSQLParserException("Failed to find right sub-join table"); - } - fromItems.addAll(tmp); - } - final List<FromItem> tmp = fromItemToFromItems(subJoin.getLeft(), level + 1); - if (tmp == null) { - log.error("Failed to find left sub-join table: {}", subJoin.getLeft()); - throw new JSQLParserException("Failed to find left sub-join table"); - } - fromItems.addAll(tmp); - return fromItems; - } - log.warn("unknown from-item {}", data); - return null; - } - default QueryDto resultSetToQueryDto(@NotNull ResultSet data) throws SQLException, QueryNotFoundException { /* note that next() is called outside this mapping function */ return QueryDto.builder() @@ -520,98 +354,6 @@ public interface DataMapper { return table; } - default Object dataColumnToObject(Object data, ColumnDto column) { - if (data == null) { - return null; - } - /* boolean encoding fix */ - if (column.getColumnType().equals(ColumnTypeDto.TINYINT) && column.getSize() == 1) { - column.setColumnType(ColumnTypeDto.BOOL); - } - switch (column.getColumnType()) { - case DATE -> { - final DateTimeFormatter formatter = new DateTimeFormatterBuilder() - .parseCaseInsensitive() /* case insensitive to parse JAN and FEB */ - .appendPattern("yyyy-MM-dd") - .toFormatter(Locale.ENGLISH); - final LocalDate date = LocalDate.parse(String.valueOf(data), formatter); - return date.atStartOfDay(ZoneId.of("UTC")) - .toInstant(); - } - case TIMESTAMP, DATETIME -> { - return Timestamp.valueOf(data.toString()) - .toInstant(); - } - case BINARY, VARBINARY, BIT -> { - return Long.parseLong(String.valueOf(data), 2); - } - case TEXT, CHAR, VARCHAR, TINYTEXT, MEDIUMTEXT, LONGTEXT, ENUM, SET -> { - return String.valueOf(data); - } - case BIGINT, SERIAL -> { - return new BigInteger(String.valueOf(data)); - } - case INT, SMALLINT, MEDIUMINT, TINYINT -> { - return Integer.parseInt(String.valueOf(data)); - } - case DECIMAL, FLOAT, DOUBLE -> { - return Double.valueOf(String.valueOf(data)); - } - case BOOL -> { - return Boolean.valueOf(String.valueOf(data)); - } - case TIME -> { - return String.valueOf(data); - } - case YEAR -> { - final String date = String.valueOf(data); - return Short.valueOf(date.substring(0, date.indexOf('-'))); - } - } - log.warn("column type {} is not known", column.getColumnType()); - throw new IllegalArgumentException("Column type not known"); - } - - default QueryResultDto resultListToQueryResultDto(List<ColumnDto> columns, ResultSet result) throws SQLException { - log.trace("mapping result list to query result, columns.size={}", columns.size()); - final List<Map<String, Object>> resultList = new LinkedList<>(); - while (result.next()) { - /* map the result set to the columns through the stored metadata in the metadata database */ - int[] idx = new int[]{1}; - final Map<String, Object> map = new HashMap<>(); - for (final ColumnDto column : columns) { - final String columnOrAlias; - if (column.getAlias() != null) { - log.debug("column {} has alias {}", column.getInternalName(), column.getAlias()); - columnOrAlias = column.getAlias(); - } else { - columnOrAlias = column.getInternalName(); - } - if (List.of(ColumnTypeDto.BLOB, ColumnTypeDto.TINYBLOB, ColumnTypeDto.MEDIUMBLOB, ColumnTypeDto.LONGBLOB).contains(column.getColumnType())) { - log.trace("column {} is of type {}", columnOrAlias, column.getColumnType().getType().toLowerCase()); - final Blob blob = result.getBlob(idx[0]++); - final String value = blob == null ? null : Hex.encodeHexString(blob.getBytes(1, (int) blob.length())).toUpperCase(); - map.put(columnOrAlias, value); - continue; - } - final Object object = dataColumnToObject(result.getObject(idx[0]++), column); - map.put(columnOrAlias, object); - } - resultList.add(map); - } - final int[] idx = new int[]{0}; - final List<Map<String, Integer>> headers = columns.stream() - .map(c -> (Map<String, Integer>) new LinkedHashMap<String, Integer>() {{ - put(c.getAlias() != null ? c.getAlias() : c.getInternalName(), idx[0]++); - }}) - .toList(); - log.trace("created ordered header list: {}", headers); - return QueryResultDto.builder() - .result(resultList) - .headers(headers) - .build(); - } - default void prepareStatementWithColumnTypeObject(PreparedStatement ps, ColumnTypeDto columnType, int idx, Object value) throws SQLException { switch (columnType) { case BLOB, TINYBLOB, MEDIUMBLOB, LONGBLOB: diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java index 62a5fada07dd427822fb6ef39e697ccee71c8cdc..99480719fac1157771d81ae09e3c5160f501af59 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java @@ -221,12 +221,6 @@ public interface MariaDbMapper { return statement; } - default String tableCreateDtoToCreateSequenceRawQuery(at.tuwien.api.database.table.internal.TableCreateDto data) { - final String statement = "CREATE SEQUENCE IF NOT EXISTS `" + tableCreateDtoToSequenceName(data) + "` NOCACHE"; - log.trace("mapped create sequence statement: {}", statement); - return statement; - } - default String filterToGetQueriesRawQuery(Boolean filterPersisted) { final StringBuilder statement = new StringBuilder("SELECT `id`, `created`, `created_by`, `query`, `query_hash`, `result_hash`, `result_number`, `is_persisted`, `executed` FROM `qs_queries`"); if (filterPersisted != null) { @@ -427,6 +421,12 @@ public interface MariaDbMapper { return statement.toString(); } + default String selectExistsTableOrViewRawQuery() { + final String statement = "SELECT IF((SELECT 1 FROM information_schema.TABLES WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?), 1, 0) AS `exists`"; + log.trace("mapped select exists table or view statement: {}", statement); + return statement; + } + default Long resultSetToNumber(ResultSet data) throws QueryMalformedException, SQLException { if (!data.next()) { throw new QueryMalformedException("Failed to map number"); @@ -434,38 +434,23 @@ public interface MariaDbMapper { return data.getLong(1); } - /** - * Selects the dataset page from a table/view. - * - * @param databaseName The database internal name. - * @param tableOrView The table/view internal name. - * @param columns The columns that should be contained in the result set. - * @param timestamp The moment in time the data should be returned in UTC timezone. - * @return The raw SQL query. - */ - default String selectDatasetRawQuery(String databaseName, String tableOrView, List<ColumnDto> columns, - Instant timestamp, Long size, Long page) { - final StringBuilder statement = new StringBuilder("SELECT ") - .append(String.join(",", columns.stream().map(c -> "`" + c.getInternalName() + "`").toList())); - statement.append(" FROM `") - .append(databaseName) - .append("`.`") - .append(tableOrView) - .append("`"); - if (timestamp != null) { - statement.append(" FOR SYSTEM_TIME AS OF TIMESTAMP '") - .append(mariaDbFormatter.format(timestamp)) - .append("'"); + default Boolean resultSetToBoolean(ResultSet data) throws QueryMalformedException, SQLException { + if (!data.next()) { + throw new QueryMalformedException("Failed to map boolean"); } - log.trace("pagination size/limit of {}", size); - statement.append(" LIMIT ") - .append(size); - log.trace("pagination page/offset of {}", page); - statement.append(" OFFSET ") - .append(page * size) - .append(";"); - log.trace("mapped select data query: {}", statement); - return statement.toString(); + return data.getBoolean(1); + } + + default List<Map<String, Object>> resultSetToList(ResultSet data, List<String> columns) throws SQLException { + final List<Map<String, Object>> list = new LinkedList<>(); + while (data.next()) { + final Map<String, Object> tuple = new HashMap<>(); + for (String column : columns) { + tuple.put(column, data.getString(column)); + } + list.add(tuple); + } + return list; } /** @@ -492,53 +477,6 @@ public interface MariaDbMapper { return "DROP TABLE `" + tableName + "`;"; } - default String tableOrViewToRawExportQuery(String databaseName, String tableOrView, List<String> columns, - Instant timestamp) { - final StringBuilder statement = new StringBuilder("(SELECT "); - int[] jdx = new int[]{0}; - columns.forEach(column -> { - statement.append(jdx[0] != 0 ? "," : "") - .append("`") - .append(column) - .append("`"); - jdx[0]++; - }); - statement.append(" FROM `") - .append(databaseName) - .append("`.`") - .append(tableOrView) - .append("`"); - if (timestamp != null) { - log.trace("export has timestamp present"); - statement.append(" FOR SYSTEM_TIME AS OF TIMESTAMP'") - .append(mariaDbFormatter.format(timestamp)) - .append("'"); - } - statement.append(") as tbl_alias"); - log.debug("mapped table/view export query: {}", statement); - return statement.toString(); - } - - default String subsetToRawTemporaryViewQuery(String viewName, String query) { - final StringBuilder statement = new StringBuilder("CREATE VIEW `") - .append(viewName) - .append("` AS (") - .append(query) - .append(");"); - log.debug("mapped temporary view query: {}", statement); - return statement.toString(); - } - - default String subsetToRawExportQuery(String viewName, Instant timestamp) { - final StringBuilder statement = new StringBuilder("(SELECT * FROM `") - .append(viewName) - .append("` FOR SYSTEM_TIME AS OF TIMESTAMP'") - .append(mariaDbFormatter.format(timestamp)) - .append("') as tbl"); - log.debug("mapped export query: {}", statement); - return statement.toString(); - } - default String temporaryTableToRawMergeQuery(String tmp, String table, List<String> columns) { final StringBuilder statement = new StringBuilder("INSERT INTO `") .append(table) diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MetadataMapper.java b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MetadataMapper.java index a585f2e98ad8d39b4c0c290ae9c48fc8840f7581..fb59360e9740914c0b1309b2546c3f55b9909c4d 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MetadataMapper.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MetadataMapper.java @@ -9,6 +9,7 @@ import at.tuwien.api.database.ViewColumnDto; import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.internal.PrivilegedViewDto; +import at.tuwien.api.database.query.QueryDto; import at.tuwien.api.database.table.TableBriefDto; import at.tuwien.api.database.table.TableDto; import at.tuwien.api.database.table.columns.ColumnDto; @@ -25,6 +26,10 @@ public interface MetadataMapper { org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(MetadataMapper.class); + default String queryDtoToViewName(QueryDto subset) { + return subset.getQueryHash(); + } + PrivilegedContainerDto containerDtoToPrivilegedContainerDto(ContainerDto data); DatabaseDto privilegedDatabaseDtoToDatabaseDto(PrivilegedDatabaseDto data); diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/SubsetService.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/SubsetService.java index 938da8820c829113193be4e5fd95d2e20e0c0029..4a3455fbc4e10f9632148fbe12e92f4298973f9d 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/SubsetService.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/SubsetService.java @@ -1,13 +1,9 @@ package at.tuwien.service; -import at.tuwien.ExportResourceDto; -import at.tuwien.api.SortTypeDto; import at.tuwien.api.container.internal.PrivilegedContainerDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.query.QueryDto; -import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.exception.*; -import jakarta.validation.constraints.NotNull; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; @@ -30,49 +26,34 @@ public interface SubsetService { QueryStoreCreateException; /** - * Creates a subset from the given statement at given time in the given database. + * Retrieve data from a subset in a database and optionally paginate with number of page and size of results. * - * @param database The database. - * @param statement The subset statement. - * @param timestamp The timestamp as of which the data is queried. If smaller than <now>, historic data is queried. - * @param userId The user id of the creating user. - * @param page The page number. Optional but requires size to be set too. - * @param size The page size. Optional but requires page to be set too. - * @param sortDirection The sort direction. - * @param sortColumn The column that is sorted. - * @return The query result. - * @throws QueryStoreInsertException The query store refused to insert the query. - * @throws SQLException The connection to the database could not be established. - * @throws QueryNotFoundException The query was not found for re-execution. - * @throws TableMalformedException The table is malformed. - * @throws UserNotFoundException The user was not found. - * @throws NotAllowedException The operation is not allowed. - * @throws RemoteUnavailableException The privileged database information could not be found in the Metadata Service. - * @throws DatabaseNotFoundException The database was not found in the Metadata Service. - * @throws MetadataServiceException The Metadata Service responded unexpected. + * @param database The database. + * @param subset The subset. + * @param page The page number. + * @param size Te result size. + * @return The data. + * @throws ViewMalformedException The view is malformed. + * @throws SQLException The connection to the database could not be established. + * @throws QueryMalformedException The mapped query produced a database error. + * @throws TableNotFoundException The database table is malformed. */ - QueryResultDto execute(PrivilegedDatabaseDto database, String statement, Instant timestamp, UUID userId, Long page, - Long size, SortTypeDto sortDirection, String sortColumn) - throws QueryStoreInsertException, SQLException, QueryNotFoundException, TableMalformedException, - UserNotFoundException, NotAllowedException, RemoteUnavailableException, DatabaseNotFoundException, - MetadataServiceException; + Dataset<Row> getData(PrivilegedDatabaseDto database, QueryDto subset, Long page, Long size) + throws ViewMalformedException, SQLException, QueryMalformedException, TableNotFoundException; /** - * Re-executes the query of a given subset in the given database. + * Creates a subset from the given statement at given time in the given database. * - * @param database The database. - * @param query The subset. - * @param page The page number. Optional but requires size to be set too. - * @param size The page size. Optional but requires page to be set too. - * @param sortDirection The sort direction. - * @param sortColumn The column that is sorted. - * @return The query result. - * @throws TableMalformedException The table is malformed. - * @throws SQLException The connection to the database could not be established. + * @param database The database. + * @param statement The subset statement. + * @param timestamp The timestamp as of which the data is queried. If smaller than <now>, historic data is queried. + * @param userId The user id of the creating user. + * @return The query id. + * @throws QueryStoreInsertException The query store refused to insert the query. + * @throws SQLException The connection to the database could not be established. */ - QueryResultDto reExecute(PrivilegedDatabaseDto database, QueryDto query, Long page, Long size, - SortTypeDto sortDirection, String sortColumn) throws TableMalformedException, - SQLException; + Long create(PrivilegedDatabaseDto database, String statement, Instant timestamp, UUID userId) + throws QueryStoreInsertException, SQLException; /** * Counts the subset row count of a query of a given subset in the given database. @@ -101,23 +82,6 @@ public interface SubsetService { List<QueryDto> findAll(PrivilegedDatabaseDto database, Boolean filterPersisted) throws SQLException, QueryNotFoundException, RemoteUnavailableException, DatabaseNotFoundException, MetadataServiceException; - /** - * Exports a subset by re-executing the query in a given database with given timestamp to a given s3key. - * - * @param database The database. - * @param query The query. - * @param timestamp The timestamp. - * @return The exported subset. - * @throws SQLException The connection to the database could not be established. - * @throws QueryMalformedException The mapped export query produced a database error. - * @throws StorageNotFoundException The exported subset was not found from the key provided by the sidecar in the Storage Service. - * @throws StorageUnavailableException The communication to the Storage Service failed. - * @throws RemoteUnavailableException The privileged database information could not be found in the Metadata Service. - */ - ExportResourceDto export(PrivilegedDatabaseDto database, QueryDto query, Instant timestamp) throws SQLException, - QueryMalformedException, StorageNotFoundException, StorageUnavailableException, RemoteUnavailableException, - ViewNotFoundException, MalformedException; - /** * Executes a subset query without saving it. * @@ -181,7 +145,4 @@ public interface SubsetService { * @throws QueryStoreGCException The query store failed to delete stale queries. */ void deleteStaleQueries(PrivilegedDatabaseDto database) throws SQLException, QueryStoreGCException; - - Dataset<Row> getData(@NotNull PrivilegedDatabaseDto database, String viewName, Instant timestamp) throws ViewNotFoundException, - QueryMalformedException; } diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java index c70d1b703f714f9201aa8ffb972763aca1c72691..dc0b2041f04dad9fb6fb5246b5ac6c098f2a1edf 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java @@ -1,14 +1,12 @@ package at.tuwien.service; -import at.tuwien.ExportResourceDto; +import at.tuwien.api.SortTypeDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.query.ImportDto; -import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.api.database.table.*; import at.tuwien.api.database.table.internal.PrivilegedTableDto; import at.tuwien.api.database.table.internal.TableCreateDto; import at.tuwien.exception.*; -import jakarta.validation.constraints.NotNull; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; @@ -78,20 +76,6 @@ public interface TableService { */ void delete(PrivilegedTableDto table) throws SQLException, QueryMalformedException; - /** - * Obtains data from a table with given table object at timestamp, loaded as page number and length size. - * - * @param table The table object. - * @param timestamp The timestamp. - * @param page The page number. - * @param size The page size/length. - * @return The data. - * @throws SQLException Failed to parse SQL query, contains invalid syntax. - * @throws TableMalformedException The table schema is malformed, likely due to a bug in the application. - */ - QueryResultDto getPaginatedData(PrivilegedTableDto table, Instant timestamp, Long page, Long size) - throws SQLException, TableMalformedException; - /** * Obtains the table history for a given table object. * @@ -168,28 +152,7 @@ public interface TableService { void updateTuple(PrivilegedTableDto table, TupleUpdateDto data) throws SQLException, QueryMalformedException, TableMalformedException; - /** - * Exports a table at given system-versioning time. - * - * @param table The table. - * @param timestamp The system-versioning time. - * @return The exported resource. - * @throws TableNotFoundException The table was not found in the data database. - * @throws QueryMalformedException The export query is malformed, likely due to a bug in the application. - * @throws StorageUnavailableException Failed to establish a connection with the Storage Service. - */ - ExportResourceDto exportDataset(PrivilegedTableDto table, Instant timestamp) throws TableNotFoundException, - QueryMalformedException, StorageUnavailableException, MalformedException; - - /** - * Get data from a given table at timestamp. - * - * @param table The table. - * @param timestamp The timestamp. - * @return The data. - * @throws TableNotFoundException The table was not found in the data database. - * @throws QueryMalformedException The export query is malformed, likely due to a bug in the application. - */ - Dataset<Row> getData(@NotNull PrivilegedTableDto table, Instant timestamp) throws TableNotFoundException, - QueryMalformedException; + Dataset<Row> getData(PrivilegedDatabaseDto database, String tableOrView, Instant timestamp, + Long page, Long size, SortTypeDto sortDirection, String sortColumn) + throws QueryMalformedException, TableNotFoundException; } diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/ViewService.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/ViewService.java index 26c04e401bb15945f1b438bd5af10beeccd470f7..ec7a723261372d1414f0590e74ef915bb62264f4 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/ViewService.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/ViewService.java @@ -1,16 +1,14 @@ package at.tuwien.service; -import at.tuwien.ExportResourceDto; import at.tuwien.api.database.ViewCreateDto; import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.internal.PrivilegedViewDto; -import at.tuwien.api.database.query.QueryResultDto; -import at.tuwien.api.database.table.internal.PrivilegedTableDto; -import at.tuwien.exception.*; -import jakarta.validation.constraints.NotNull; -import org.apache.spark.sql.Dataset; -import org.apache.spark.sql.Row; +import at.tuwien.api.database.query.QueryDto; +import at.tuwien.exception.DatabaseMalformedException; +import at.tuwien.exception.QueryMalformedException; +import at.tuwien.exception.ViewMalformedException; +import at.tuwien.exception.ViewNotFoundException; import java.sql.SQLException; import java.time.Instant; @@ -18,6 +16,9 @@ import java.util.List; public interface ViewService { + Boolean existsByName(PrivilegedDatabaseDto database, String name) throws SQLException, + QueryMalformedException; + /** * Gets the metadata schema for a given database. * @@ -30,6 +31,16 @@ public interface ViewService { List<ViewDto> getSchemas(PrivilegedDatabaseDto database) throws SQLException, DatabaseMalformedException, ViewNotFoundException; + /** + * Creates a view if not already exists. + * @param database + * @param subset + * @return + * @throws ViewMalformedException + * @throws SQLException + */ + ViewDto create(PrivilegedDatabaseDto database, QueryDto subset) throws ViewMalformedException, SQLException; + /** * Creates a view in the given data database. * @@ -41,28 +52,15 @@ public interface ViewService { ViewDto create(PrivilegedDatabaseDto database, ViewCreateDto data) throws SQLException, ViewMalformedException; - /** - * Get data from the given view at specific timestamp, paginated by page and size. - * - * @param view The view. - * @param timestamp The timestamp. - * @param page The page number. - * @param size The page size. - * @return The data, if successful. - * @throws SQLException The connection to the data database was unsuccessful. - * @throws ViewMalformedException The query is malformed and was rejected by the data database. - */ - QueryResultDto data(PrivilegedViewDto view, Instant timestamp, Long page, Long size) throws SQLException, - ViewMalformedException; - /** * Deletes a view. * - * @param view The view. + * @param database The database. + * @param viewName The view name. * @throws SQLException The connection to the data database was unsuccessful. * @throws ViewMalformedException The query is malformed and was rejected by the data database. */ - void delete(PrivilegedViewDto view) throws SQLException, ViewMalformedException; + void delete(PrivilegedDatabaseDto database, String viewName) throws SQLException, ViewMalformedException; /** * Counts tuples in a view at system-versioned timestamp. @@ -74,27 +72,4 @@ public interface ViewService { * @throws QueryMalformedException The query is malformed and was rejected by the data database. */ Long count(PrivilegedViewDto view, Instant timestamp) throws SQLException, QueryMalformedException; - - /** - * Exports view data into a dataset. - * - * @param view The view. - * @return The dataset. - * @throws QueryMalformedException The query is malformed and was rejected by the data database. - * @throws StorageUnavailableException Failed to establish a connection with the Storage Service. - * @throws ViewNotFoundException The view with given name was not found. - */ - ExportResourceDto exportDataset(PrivilegedViewDto view) throws QueryMalformedException, - StorageUnavailableException, ViewNotFoundException, MalformedException; - - /** - * Get data from a given view. - * - * @param view The view. - * @return The data. - * @throws ViewNotFoundException The view with given name was not found. - * @throws QueryMalformedException The query is malformed and was rejected by the data database. - */ - Dataset<Row> getData(@NotNull PrivilegedViewDto view) throws ViewNotFoundException, - QueryMalformedException; } diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/AccessServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/AccessServiceMariaDbImpl.java index 7ed5150095a1320c29cfd92ff9687eeab8ef57ee..1493f579fdb6cfc9e5429a27ea6e44314a5d8760 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/AccessServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/AccessServiceMariaDbImpl.java @@ -43,22 +43,22 @@ public class AccessServiceMariaDbImpl extends HibernateConnector implements Acce long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseCreateUserQuery(user.getUsername(), user.getPassword())) .execute(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); /* grant access */ final String grants = access != AccessTypeDto.READ ? grantDefaultWrite : grantDefaultRead; start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseGrantPrivilegesQuery(user.getUsername(), grants)) .execute(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); /* grant query store */ start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseGrantProcedureQuery(user.getUsername(), "store_query")) .execute(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); /* apply access rights */ start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseFlushPrivilegesQuery()); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -82,7 +82,7 @@ public class AccessServiceMariaDbImpl extends HibernateConnector implements Acce final long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseGrantPrivilegesQuery(user.getUsername(), grants)) .execute(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); /* apply access rights */ connection.prepareStatement(mariaDbMapper.databaseFlushPrivilegesQuery()); connection.commit(); @@ -106,12 +106,12 @@ public class AccessServiceMariaDbImpl extends HibernateConnector implements Acce long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseRevokePrivilegesQuery(user.getUsername())) .execute(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); /* apply access rights */ start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseFlushPrivilegesQuery()) .execute(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java index b2a9b0c8408953e0a694a1ae6d3e36c8ebfe485d..db446de2817b6f5499105856d5748202b1469b4b 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java @@ -40,7 +40,7 @@ public class DatabaseServiceMariaDbImpl extends HibernateConnector implements Da final long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseCreateDatabaseQuery(data.getInternalName())) .execute(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -76,7 +76,7 @@ public class DatabaseServiceMariaDbImpl extends HibernateConnector implements Da final long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseSetPasswordQuery(data.getUsername(), data.getPassword())) .execute(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/HibernateConnector.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/HibernateConnector.java index e2d085ae98c60b2ee0cc0b852fc9954b542d3413..b52d1c792ec25856209e33be2c5fa6dce4996f80 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/HibernateConnector.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/HibernateConnector.java @@ -2,26 +2,10 @@ package at.tuwien.service.impl; import at.tuwien.api.container.internal.PrivilegedContainerDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; -import at.tuwien.api.database.table.internal.PrivilegedTableDto; -import at.tuwien.config.S3Config; -import at.tuwien.exception.QueryMalformedException; -import at.tuwien.exception.TableNotFoundException; import com.mchange.v2.c3p0.ComboPooledDataSource; -import jakarta.validation.constraints.NotNull; import lombok.extern.log4j.Log4j2; -import org.apache.spark.SparkConf; -import org.apache.spark.sql.Dataset; -import org.apache.spark.sql.Row; -import org.apache.spark.sql.SparkSession; -import org.apache.spark.sql.catalyst.ExtendedAnalysisException; -import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Service; -import java.time.Instant; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; - @Log4j2 @Service public abstract class HibernateConnector { @@ -45,23 +29,6 @@ public abstract class HibernateConnector { return getPrivilegedDataSource(database.getContainer(), database.getInternalName()); } - public Map<String, String> getPrivilegedDatabaseOptions(PrivilegedTableDto table) { - return new HashMap<>() {{ - put("url", url(table.getDatabase().getContainer(), table.getDatabase().getInternalName())); - put("dbtable", table.getInternalName()); - put("user", table.getDatabase().getContainer().getUsername()); - put("password", table.getDatabase().getContainer().getPassword()); - }}; - } - - public String getHibernateUrl(PrivilegedContainerDto container, String databaseName) { - final StringBuilder sb = new StringBuilder(url(container, databaseName)) - .append("?currentSchema=") - .append(databaseName); - log.trace("mapped container to hibernate url: {}", sb.toString()); - return sb.toString(); - } - public String getSparkUrl(PrivilegedContainerDto container, String databaseName) { final StringBuilder sb = new StringBuilder(url(container, databaseName)) .append("?sessionVariables=sql_mode='ANSI_QUOTES'"); diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/QueueServiceRabbitMqImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/QueueServiceRabbitMqImpl.java index 797de6567445ea6acdc45c656d8910f68084ac8b..aff85137870749a600d1e4c76ef317a978c6c54e 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/QueueServiceRabbitMqImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/QueueServiceRabbitMqImpl.java @@ -52,7 +52,7 @@ public class QueueServiceRabbitMqImpl extends HibernateConnector implements Queu } final long start = System.currentTimeMillis(); preparedStatement.executeUpdate(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); log.trace("successfully inserted tuple"); amqpDataAccessCounter.increment(); } finally { diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java index 1aba3c6b9942386f171c1a4fe029658667a633a1..370d86e2881fbea3abd8254693e80b605d32662e 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java @@ -55,7 +55,7 @@ public class SchemaServiceMariaDbImpl extends HibernateConnector implements Sche statement1.setString(2, tableName); log.trace("1={}, 2={}", database.getInternalName(), tableName); TableDto table = dataMapper.schemaResultSetToTable(metadataMapper.privilegedDatabaseDtoToDatabaseDto(database), statement1.executeQuery()); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); /* obtain columns metadata */ start = System.currentTimeMillis(); final PreparedStatement statement2 = connection.prepareStatement(mariaDbMapper.databaseTableColumnsSelectRawQuery()); @@ -63,7 +63,7 @@ public class SchemaServiceMariaDbImpl extends HibernateConnector implements Sche statement2.setString(2, tableName); log.trace("1={}, 2={}", database.getInternalName(), tableName); final ResultSet resultSet2 = statement2.executeQuery(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); while (resultSet2.next()) { table = dataMapper.resultSetToTable(resultSet2, table, queryConfig); } @@ -74,7 +74,7 @@ public class SchemaServiceMariaDbImpl extends HibernateConnector implements Sche statement3.setString(2, tableName); log.trace("1={}, 2={}", database.getInternalName(), tableName); final ResultSet resultSet3 = statement3.executeQuery(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); while (resultSet3.next()) { final String clause = resultSet3.getString(1); table.getConstraints() @@ -89,7 +89,7 @@ public class SchemaServiceMariaDbImpl extends HibernateConnector implements Sche statement4.setString(2, tableName); log.trace("1={}, 2={}", database.getInternalName(), tableName); final ResultSet resultSet4 = statement4.executeQuery(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); while (resultSet4.next()) { table = dataMapper.resultSetToConstraint(resultSet4, table); for (UniqueDto uk : table.getConstraints().getUniques()) { @@ -136,7 +136,7 @@ public class SchemaServiceMariaDbImpl extends HibernateConnector implements Sche statement1.setString(2, viewName); log.trace("1={}, 2={}", database.getInternalName(), viewName); final ResultSet resultSet1 = statement1.executeQuery(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); if (!resultSet1.next()) { throw new ViewNotFoundException("Failed to find view in the information schema"); } @@ -152,7 +152,7 @@ public class SchemaServiceMariaDbImpl extends HibernateConnector implements Sche statement2.setString(2, viewName); log.trace("1={}, 2={}", database.getInternalName(), viewName); final ResultSet resultSet2 = statement2.executeQuery(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); TableDto tmp = TableDto.builder() .columns(new LinkedList<>()) .build(); diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java index 8c5cc6d601a4165d4abc22c1a9ab1e0e94766656..1e1e78603ba219e0f929a65e40efad6557f6f1ae 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java @@ -1,13 +1,8 @@ package at.tuwien.service.impl; -import at.tuwien.ExportResourceDto; -import at.tuwien.api.SortTypeDto; import at.tuwien.api.container.internal.PrivilegedContainerDto; -import at.tuwien.api.database.ViewColumnDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.query.QueryDto; -import at.tuwien.api.database.query.QueryResultDto; -import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.identifier.IdentifierDto; import at.tuwien.api.identifier.IdentifierTypeDto; import at.tuwien.exception.*; @@ -15,56 +10,42 @@ import at.tuwien.gateway.MetadataServiceGateway; import at.tuwien.mapper.DataMapper; import at.tuwien.mapper.MariaDbMapper; import at.tuwien.mapper.MetadataMapper; -import at.tuwien.service.SchemaService; -import at.tuwien.service.StorageService; import at.tuwien.service.SubsetService; +import at.tuwien.service.TableService; +import at.tuwien.service.ViewService; import com.mchange.v2.c3p0.ComboPooledDataSource; -import io.micrometer.core.instrument.Counter; -import jakarta.validation.constraints.NotNull; import lombok.extern.log4j.Log4j2; -import net.sf.jsqlparser.JSQLParserException; -import org.apache.commons.lang3.RandomUtils; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; -import org.apache.spark.sql.SparkSession; -import org.apache.spark.sql.catalyst.ExtendedAnalysisException; -import org.sparkproject.guava.hash.Hashing; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.sql.*; import java.time.Instant; import java.util.LinkedList; import java.util.List; -import java.util.Properties; import java.util.UUID; @Log4j2 @Service public class SubsetServiceMariaDbImpl extends HibernateConnector implements SubsetService { - private final Counter httpDataAccessCounter; private final DataMapper dataMapper; - private final SparkSession sparkSession; + private final ViewService viewService; + private final TableService tableService; private final MariaDbMapper mariaDbMapper; - private final SchemaService schemaService; private final MetadataMapper metadataMapper; - private final StorageService storageService; private final MetadataServiceGateway metadataServiceGateway; @Autowired - public SubsetServiceMariaDbImpl(Counter httpDataAccessCounter, DataMapper dataMapper, SparkSession sparkSession, - MariaDbMapper mariaDbMapper, SchemaService schemaService, - MetadataMapper metadataMapper, StorageService storageService, + public SubsetServiceMariaDbImpl(DataMapper dataMapper, ViewService viewService, TableService tableService, + MariaDbMapper mariaDbMapper, MetadataMapper metadataMapper, MetadataServiceGateway metadataServiceGateway) { - this.httpDataAccessCounter = httpDataAccessCounter; this.dataMapper = dataMapper; - this.sparkSession = sparkSession; + this.viewService = viewService; + this.tableService = tableService; this.mariaDbMapper = mariaDbMapper; - this.schemaService = schemaService; this.metadataMapper = metadataMapper; - this.storageService = storageService; this.metadataServiceGateway = metadataServiceGateway; } @@ -78,23 +59,23 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.queryStoreCreateSequenceRawQuery()) .execute(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.queryStoreCreateTableRawQuery()) .execute(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.queryStoreCreateHashTableProcedureRawQuery()) .execute(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.queryStoreCreateStoreQueryProcedureRawQuery()) .execute(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.queryStoreCreateInternalStoreQueryProcedureRawQuery()) .execute(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -107,32 +88,21 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs } @Override - public QueryResultDto execute(PrivilegedDatabaseDto database, String statement, Instant timestamp, - UUID userId, Long page, Long size, SortTypeDto sortDirection, String sortColumn) - throws QueryStoreInsertException, SQLException, QueryNotFoundException, TableMalformedException, - UserNotFoundException, NotAllowedException, RemoteUnavailableException, DatabaseNotFoundException, - MetadataServiceException { - final Long queryId = storeQuery(database, statement, timestamp, userId); - final QueryDto query = findById(database, queryId); - httpDataAccessCounter.increment(); - return reExecute(database, query, page, size, sortDirection, sortColumn); + public Dataset<Row> getData(PrivilegedDatabaseDto database, QueryDto subset, Long page, Long size) + throws ViewMalformedException, SQLException, QueryMalformedException, TableNotFoundException { + if (!viewService.existsByName(database, metadataMapper.queryDtoToViewName(subset))) { + log.warn("Missing internal view {} for subset with id {}: create it from subset query", metadataMapper.queryDtoToViewName(subset), subset.getId()); + viewService.create(database, subset); + } else { + log.debug("internal view {} for subset with id {} exists", metadataMapper.queryDtoToViewName(subset), subset.getId()); + } + return tableService.getData(database, metadataMapper.queryDtoToViewName(subset), subset.getExecution(), page, size, null, null); } @Override - public QueryResultDto reExecute(PrivilegedDatabaseDto database, QueryDto query, Long page, Long size, - SortTypeDto sortDirection, String sortColumn) throws TableMalformedException, - SQLException { - final List<ColumnDto> columns; - try { - columns = dataMapper.parseColumns(database.getId(), database.getTables(), query.getQuery()); - } catch (JSQLParserException e) { - log.error("Failed to map/parse columns: {}", e.getMessage()); - throw new TableMalformedException("Failed to map/parse columns: " + e.getMessage(), e); - } - final String statement = mariaDbMapper.selectRawSelectQuery(query.getQuery(), query.getExecution(), page, size); - final QueryResultDto dto = executeNonPersistent(database, statement, columns); - dto.setId(query.getId()); - return dto; + public Long create(PrivilegedDatabaseDto database, String statement, Instant timestamp, UUID userId) + throws QueryStoreInsertException, SQLException { + return storeQuery(database, statement, timestamp, userId); } @Override @@ -155,7 +125,7 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs log.trace("filter persisted only {}", filterPersisted); } final ResultSet resultSet = statement.executeQuery(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); final List<QueryDto> queries = new LinkedList<>(); while (resultSet.next()) { final QueryDto query = dataMapper.resultSetToQueryDto(resultSet); @@ -175,70 +145,6 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs } } - @Override - public ExportResourceDto export(PrivilegedDatabaseDto database, QueryDto query, Instant timestamp) - throws SQLException, QueryMalformedException, StorageNotFoundException, StorageUnavailableException, - RemoteUnavailableException, ViewNotFoundException, MalformedException { - final String viewName = "ex_" + Hashing.sha512() - .hashString(new String(RandomUtils.nextBytes(256), Charset.defaultCharset()), Charset.defaultCharset()) - .toString() - .substring(0, 60); - final ExportResourceDto export; - final ComboPooledDataSource dataSource = getPrivilegedDataSource(database); - final Connection connection = dataSource.getConnection(); - try { - /* export to data database sidecar */ - long start = System.currentTimeMillis(); - connection.prepareStatement(mariaDbMapper.subsetToRawTemporaryViewQuery(viewName, query.getQuery())) - .executeUpdate(); - log.debug("executed create view statement in {} ms", System.currentTimeMillis() - start); - start = System.currentTimeMillis(); - final List<String> columns = schemaService.inspectView(database, viewName) - .getColumns() - .stream() - .map(ViewColumnDto::getInternalName) - .toList(); - log.debug("executed inspect view columns statement in {} ms", System.currentTimeMillis() - start); - start = System.currentTimeMillis(); - final Dataset<Row> dataset = getData(database, viewName, timestamp) - .selectExpr(columns.toArray(new String[0])); - export = storageService.transformDataset(dataset); - log.debug("executed extract statement in {} ms", System.currentTimeMillis() - start); - start = System.currentTimeMillis(); - connection.prepareStatement(mariaDbMapper.dropViewRawQuery(viewName)) - .executeUpdate(); - log.debug("executed drop view statement in {} ms", System.currentTimeMillis() - start); - connection.commit(); - } catch (SQLException e) { - connection.rollback(); - log.error("Failed to execute query: {}", e.getMessage()); - throw new QueryMalformedException("Failed to execute query: " + e.getMessage(), e); - } finally { - dataSource.close(); - } - httpDataAccessCounter.increment(); - return export; - } - - public QueryResultDto executeNonPersistent(PrivilegedDatabaseDto database, String statement, - List<ColumnDto> columns) throws SQLException, TableMalformedException { - final ComboPooledDataSource dataSource = getPrivilegedDataSource(database); - final Connection connection = dataSource.getConnection(); - try { - final long start = System.currentTimeMillis(); - final PreparedStatement preparedStatement = connection.prepareStatement(statement); - final ResultSet resultSet = preparedStatement.executeQuery(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); - httpDataAccessCounter.increment(); - return dataMapper.resultListToQueryResultDto(columns, resultSet); - } catch (SQLException e) { - log.error("Failed to execute and map time-versioned query: {}", e.getMessage()); - throw new TableMalformedException("Failed to execute and map time-versioned query: " + e.getMessage(), e); - } finally { - dataSource.close(); - } - } - @Override public Long executeCountNonPersistent(PrivilegedDatabaseDto database, String statement, Instant timestamp) throws SQLException, QueryMalformedException, TableMalformedException { @@ -248,8 +154,7 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs final long start = System.currentTimeMillis(); final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.countRawSelectQuery(statement, timestamp)) .executeQuery(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); - httpDataAccessCounter.increment(); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); return mariaDbMapper.resultSetToNumber(resultSet); } catch (SQLException e) { log.error("Failed to map object: {}", e.getMessage()); @@ -261,7 +166,7 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs @Override public QueryDto findById(PrivilegedDatabaseDto database, Long queryId) throws QueryNotFoundException, SQLException, - RemoteUnavailableException, UserNotFoundException, DatabaseNotFoundException, MetadataServiceException { + RemoteUnavailableException, DatabaseNotFoundException, MetadataServiceException { final ComboPooledDataSource dataSource = getPrivilegedDataSource(database); final Connection connection = dataSource.getConnection(); try { @@ -269,7 +174,7 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs final PreparedStatement preparedStatement = connection.prepareStatement(mariaDbMapper.queryStoreFindQueryRawQuery()); preparedStatement.setLong(1, queryId); final ResultSet resultSet = preparedStatement.executeQuery(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); if (!resultSet.next()) { throw new QueryNotFoundException("Failed to find query"); } @@ -306,7 +211,7 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs callableStatement.setTimestamp(3, Timestamp.from(timestamp)); callableStatement.registerOutParameter(4, Types.BIGINT); callableStatement.executeUpdate(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); queryId = callableStatement.getLong(4); callableStatement.close(); log.info("Stored query with id {} in database with name {}", queryId, database.getInternalName()); @@ -333,7 +238,7 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs preparedStatement.setBoolean(1, persist); preparedStatement.setLong(2, queryId); preparedStatement.executeUpdate(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); } catch (SQLException e) { log.error("Failed to (un-)persist query: {}", e.getMessage()); throw new QueryStorePersistException("Failed to (un-)persist query", e); @@ -351,7 +256,7 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs final long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.queryStoreDeleteStaleQueriesRawQuery()) .executeUpdate(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); } catch (SQLException e) { log.error("Failed to delete stale queries: {}", e.getMessage()); throw new QueryStoreGCException("Failed to delete stale queries: " + e.getMessage(), e); @@ -360,27 +265,4 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs } } - @Override - public Dataset<Row> getData(@NotNull PrivilegedDatabaseDto database, String viewName, Instant timestamp) - throws ViewNotFoundException, QueryMalformedException { - log.debug("get data from view: {}", viewName); - try { - final Properties properties = new Properties(); - properties.setProperty("user", database.getContainer().getUsername()); - properties.setProperty("password", database.getContainer().getPassword()); - return sparkSession.read() - .jdbc(getSparkUrl(database.getContainer(), database.getInternalName()), - mariaDbMapper.subsetToRawExportQuery(viewName, timestamp), properties); - } catch (Exception e) { - if (e instanceof ExtendedAnalysisException exception) { - if (exception.getSimpleMessage().contains("TABLE_OR_VIEW_NOT_FOUND")) { - log.error("Failed to find temporary view {}: {}", viewName, exception.getSimpleMessage()); - throw new ViewNotFoundException("Failed to find temporary view " + viewName + ": " + exception.getSimpleMessage()) /* remove throwable on purpose, clutters the output */; - } - } - log.error("Failed to find get data from view: {}", e.getMessage()); - throw new QueryMalformedException("Failed to find get data from view: " + e.getMessage(), e); - } - } - } diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java index 0eea223f7e450ad54efba1cd28063b116ea9afe9..4e7aa7dcfafb614e05928749f08a699d0ba34942 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java @@ -1,9 +1,8 @@ package at.tuwien.service.impl; -import at.tuwien.ExportResourceDto; +import at.tuwien.api.SortTypeDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.query.ImportDto; -import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.api.database.table.*; import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.database.table.columns.ColumnStatisticDto; @@ -18,8 +17,6 @@ import at.tuwien.service.StorageService; import at.tuwien.service.TableService; import at.tuwien.utils.MariaDbUtil; import com.mchange.v2.c3p0.ComboPooledDataSource; -import io.micrometer.core.instrument.Counter; -import jakarta.validation.constraints.NotNull; import lombok.extern.log4j.Log4j2; import org.apache.spark.sql.*; import org.apache.spark.sql.catalyst.ExtendedAnalysisException; @@ -37,7 +34,6 @@ import java.util.*; @Service public class TableServiceMariaDbImpl extends HibernateConnector implements TableService { - private final Counter httpDataAccessCounter; private final DataMapper dataMapper; private final SparkSession sparkSession; private final MariaDbMapper mariaDbMapper; @@ -45,10 +41,8 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table private final StorageService storageService; @Autowired - public TableServiceMariaDbImpl(Counter httpDataAccessCounter, DataMapper dataMapper, SparkSession sparkSession, - MariaDbMapper mariaDbMapper, SchemaService schemaService, - StorageService storageService) { - this.httpDataAccessCounter = httpDataAccessCounter; + public TableServiceMariaDbImpl(DataMapper dataMapper, SparkSession sparkSession, MariaDbMapper mariaDbMapper, + SchemaService schemaService, StorageService storageService) { this.dataMapper = dataMapper; this.sparkSession = sparkSession; this.mariaDbMapper = mariaDbMapper; @@ -68,7 +62,7 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table final PreparedStatement statement = connection.prepareStatement(mariaDbMapper.databaseTablesSelectRawQuery()); statement.setString(1, database.getInternalName()); final ResultSet resultSet1 = statement.executeQuery(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); while (resultSet1.next()) { final String tableName = resultSet1.getString(1); if (database.getTables().stream().anyMatch(t -> t.getInternalName().equals(tableName))) { @@ -106,7 +100,7 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table } else { final ResultSet resultSet = connection.prepareStatement(query) .executeQuery(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); statistic = dataMapper.resultSetToTableStatistic(resultSet); final TableDto tmpTable = schemaService.inspectTable(table.getDatabase(), table.getInternalName()); statistic.setAvgRowLength(tmpTable.getAvgRowLength()); @@ -147,7 +141,7 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table final long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.tableCreateDtoToCreateTableRawQuery(data)) .execute(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -176,7 +170,7 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table final long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.dropTableRawQuery(tableName)) .execute(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -188,37 +182,6 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table log.info("Deleted table with name {}", tableName); } - @Override - public QueryResultDto getPaginatedData(PrivilegedTableDto table, Instant timestamp, Long page, Long size) throws SQLException, - TableMalformedException { - final ComboPooledDataSource dataSource = getPrivilegedDataSource(table.getDatabase()); - final Connection connection = dataSource.getConnection(); - final QueryResultDto queryResult; - try { - /* find table data */ - long start = System.currentTimeMillis(); - final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.selectDatasetRawQuery( - table.getDatabase().getInternalName(), table.getInternalName(), table.getColumns(), - timestamp, size, page)) - .executeQuery(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); - start = System.currentTimeMillis(); - connection.commit(); - queryResult = dataMapper.resultListToQueryResultDto(table.getColumns(), resultSet); - log.debug("mapped result in {} ms", System.currentTimeMillis() - start); - httpDataAccessCounter.increment(); - } catch (SQLException e) { - connection.rollback(); - log.error("Failed to find data from table {}.{}: {}", table.getDatabase().getInternalName(), table.getInternalName(), e.getMessage()); - throw new TableMalformedException("Failed to find data from table " + table.getDatabase().getInternalName() + "." + table.getInternalName() + ": " + e.getMessage(), e); - } finally { - dataSource.close(); - } - log.info("Find data from table {}.{}", table.getDatabase().getInternalName(), table.getInternalName()); - queryResult.setId(table.getId()); - return queryResult; - } - @Override public List<TableHistoryDto> history(PrivilegedTableDto table, Long size) throws SQLException, TableNotFoundException { @@ -231,7 +194,7 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.selectHistoryRawQuery( table.getDatabase().getInternalName(), table.getInternalName(), size)) .executeQuery(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); history = dataMapper.resultSetToTableHistory(resultSet); connection.commit(); } catch (SQLException e) { @@ -257,7 +220,7 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.selectCountRawQuery( table.getDatabase().getInternalName(), table.getInternalName(), timestamp)) .executeQuery(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); queryResult = mariaDbMapper.resultSetToNumber(resultSet); connection.commit(); } catch (SQLException e) { @@ -338,7 +301,7 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table } final long start = System.currentTimeMillis(); statement.executeUpdate(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -382,7 +345,7 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table } final long start = System.currentTimeMillis(); statement.executeUpdate(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -418,7 +381,7 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table } final long start = System.currentTimeMillis(); statement.executeUpdate(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -442,34 +405,24 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table } @Override - public ExportResourceDto exportDataset(PrivilegedTableDto table, Instant timestamp) throws TableNotFoundException, - QueryMalformedException, StorageUnavailableException, MalformedException { - final Dataset<Row> dataset = getData(table, timestamp); - httpDataAccessCounter.increment(); - return storageService.transformDataset(dataset); - } - - @Override - public Dataset<Row> getData(@NotNull PrivilegedTableDto table, Instant timestamp) throws TableNotFoundException, - QueryMalformedException { + public Dataset<Row> getData(PrivilegedDatabaseDto database, String tableOrView, Instant timestamp, + Long page, Long size, SortTypeDto sortDirection, String sortColumn) + throws QueryMalformedException, TableNotFoundException { try { final Properties properties = new Properties(); - properties.setProperty("user", table.getDatabase().getContainer().getUsername()); - properties.setProperty("password", table.getDatabase().getContainer().getPassword()); + properties.setProperty("user", database.getContainer().getUsername()); + properties.setProperty("password", database.getContainer().getPassword()); return sparkSession.read() - .jdbc(getSparkUrl(table.getDatabase().getContainer(), table.getDatabase().getInternalName()), - mariaDbMapper.tableOrViewToRawExportQuery(table.getDatabase().getInternalName(), - table.getInternalName(), table.getColumns().stream() - .map(ColumnDto::getInternalName).toList(), timestamp), properties); + .jdbc(getSparkUrl(database.getContainer(), database.getInternalName()), tableOrView, properties); } catch (Exception e) { if (e instanceof ExtendedAnalysisException exception) { if (exception.getSimpleMessage().contains("TABLE_OR_VIEW_NOT_FOUND")) { - log.error("Failed to find table {}: {}", table.getInternalName(), exception.getSimpleMessage()); - throw new TableNotFoundException("Failed to find table " + table.getInternalName() + ": " + exception.getSimpleMessage()) /* remove throwable on purpose, clutters the output */; + log.error("Failed to find named reference: {}", exception.getSimpleMessage()); + throw new TableNotFoundException("Failed to find named reference: " + exception.getSimpleMessage()) /* remove throwable on purpose, clutters the output */; } } - log.error("Failed to export dataset: {}", e.getMessage()); - throw new QueryMalformedException("Failed to export dataset: " + e.getMessage(), e); + log.error("Failed to find get data from query statement: {}", e.getMessage()); + throw new QueryMalformedException("Failed to find get data from query statement: " + e.getMessage(), e); } } diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java index 7ca776ff8a37987aaf640012d665036f695bf058..a4cb031066c90d11c236eddb142e815779412e48 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java @@ -1,30 +1,23 @@ package at.tuwien.service.impl; -import at.tuwien.ExportResourceDto; -import at.tuwien.api.database.ViewColumnDto; import at.tuwien.api.database.ViewCreateDto; import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.internal.PrivilegedViewDto; -import at.tuwien.api.database.query.QueryResultDto; -import at.tuwien.api.database.table.columns.ColumnDto; +import at.tuwien.api.database.query.QueryDto; import at.tuwien.config.QueryConfig; -import at.tuwien.exception.*; +import at.tuwien.exception.DatabaseMalformedException; +import at.tuwien.exception.QueryMalformedException; +import at.tuwien.exception.ViewMalformedException; +import at.tuwien.exception.ViewNotFoundException; import at.tuwien.mapper.DataMapper; import at.tuwien.mapper.MariaDbMapper; import at.tuwien.mapper.MetadataMapper; import at.tuwien.service.SchemaService; -import at.tuwien.service.StorageService; import at.tuwien.service.ViewService; import com.google.common.hash.Hashing; import com.mchange.v2.c3p0.ComboPooledDataSource; -import io.micrometer.core.instrument.Counter; -import jakarta.validation.constraints.NotNull; import lombok.extern.log4j.Log4j2; -import org.apache.spark.sql.Dataset; -import org.apache.spark.sql.Row; -import org.apache.spark.sql.SparkSession; -import org.apache.spark.sql.catalyst.ExtendedAnalysisException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -36,36 +29,51 @@ import java.sql.SQLException; import java.time.Instant; import java.util.LinkedList; import java.util.List; -import java.util.Properties; @Log4j2 @Service public class ViewServiceMariaDbImpl extends HibernateConnector implements ViewService { - private final Counter httpDataAccessCounter; private final DataMapper dataMapper; private final QueryConfig queryConfig; - private final SparkSession sparkSession; - private final MariaDbMapper mariaDbMapper; private final SchemaService schemaService; - private final StorageService storageService; + private final MariaDbMapper mariaDbMapper; private final MetadataMapper metadataMapper; @Autowired - public ViewServiceMariaDbImpl(Counter httpDataAccessCounter, DataMapper dataMapper, - QueryConfig queryConfig, SparkSession sparkSession, MariaDbMapper mariaDbMapper, - SchemaService schemaService, StorageService storageService, - MetadataMapper metadataMapper) { - this.httpDataAccessCounter = httpDataAccessCounter; + public ViewServiceMariaDbImpl(DataMapper dataMapper, QueryConfig queryConfig, SchemaService schemaService, + MariaDbMapper mariaDbMapper, MetadataMapper metadataMapper) { this.dataMapper = dataMapper; this.queryConfig = queryConfig; - this.sparkSession = sparkSession; - this.mariaDbMapper = mariaDbMapper; this.schemaService = schemaService; - this.storageService = storageService; + this.mariaDbMapper = mariaDbMapper; this.metadataMapper = metadataMapper; } + @Override + public Boolean existsByName(PrivilegedDatabaseDto database, String name) throws SQLException, + QueryMalformedException { + final ComboPooledDataSource dataSource = getPrivilegedDataSource(database); + final Connection connection = dataSource.getConnection(); + final Boolean queryResult; + try { + /* find view data */ + final long start = System.currentTimeMillis(); + final PreparedStatement statement = connection.prepareStatement(mariaDbMapper.selectExistsTableOrViewRawQuery()); + statement.setString(1, database.getInternalName()); + statement.setString(2, name); + final ResultSet resultSet = statement.executeQuery(); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + queryResult = mariaDbMapper.resultSetToBoolean(resultSet); + } catch (SQLException e) { + log.error("Failed to prepare statement {}", e.getMessage()); + throw new QueryMalformedException("Failed to prepare statement: " + e.getMessage(), e); + } finally { + dataSource.close(); + } + return queryResult; + } + @Override public List<ViewDto> getSchemas(PrivilegedDatabaseDto database) throws SQLException, DatabaseMalformedException, ViewNotFoundException { @@ -78,9 +86,13 @@ public class ViewServiceMariaDbImpl extends HibernateConnector implements ViewSe statement.setString(1, database.getInternalName()); final long start = System.currentTimeMillis(); final ResultSet resultSet1 = statement.executeQuery(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); while (resultSet1.next()) { final String viewName = resultSet1.getString(1); + if (viewName.length() == 64) { + log.trace("view {}.{} seems to be a subset view (name length = 64), skip.", database.getInternalName(), viewName); + continue; + } if (database.getViews().stream().anyMatch(v -> v.getInternalName().equals(viewName))) { log.trace("view {}.{} already known to metadata database, skip.", database.getInternalName(), viewName); continue; @@ -101,6 +113,17 @@ public class ViewServiceMariaDbImpl extends HibernateConnector implements ViewSe return views; } + @Override + public ViewDto create(PrivilegedDatabaseDto database, QueryDto subset) throws ViewMalformedException, + SQLException { + final ViewCreateDto data = ViewCreateDto.builder() + .name(metadataMapper.queryDtoToViewName(subset)) + .query(subset.getQuery()) + .isPublic(false) + .build(); + return create(database, data); + } + @Override public ViewDto create(PrivilegedDatabaseDto database, ViewCreateDto data) throws SQLException, ViewMalformedException { @@ -127,7 +150,7 @@ public class ViewServiceMariaDbImpl extends HibernateConnector implements ViewSe final long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.viewCreateRawQuery(view.getInternalName(), data.getQuery())) .execute(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); /* select view columns */ final PreparedStatement statement2 = connection.prepareStatement(mariaDbMapper.databaseTableColumnsSelectRawQuery()); statement2.setString(1, database.getInternalName()); @@ -149,47 +172,15 @@ public class ViewServiceMariaDbImpl extends HibernateConnector implements ViewSe } @Override - public QueryResultDto data(PrivilegedViewDto view, Instant timestamp, Long page, Long size) throws SQLException, - ViewMalformedException { - final ComboPooledDataSource dataSource = getPrivilegedDataSource(view.getDatabase()); - final Connection connection = dataSource.getConnection(); - final QueryResultDto queryResult; - try { - /* find table data */ - final List<ColumnDto> mappedColumns = view.getColumns() - .stream() - .map(metadataMapper::viewColumnDtoToColumnDto) - .toList(); - final long start = System.currentTimeMillis(); - final ResultSet resultSet = connection.prepareStatement( - mariaDbMapper.selectDatasetRawQuery(view.getDatabase().getInternalName(), - view.getInternalName(), mappedColumns, timestamp, size, page)) - .executeQuery(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); - queryResult = dataMapper.resultListToQueryResultDto(mappedColumns, resultSet); - queryResult.setId(view.getId()); - connection.commit(); - httpDataAccessCounter.increment(); - } catch (SQLException e) { - log.error("Failed to map object: {}", e.getMessage()); - throw new ViewMalformedException("Failed to map object: " + e.getMessage(), e); - } finally { - dataSource.close(); - } - log.info("Find data from view {}.{}", view.getDatabase().getInternalName(), view.getInternalName()); - return queryResult; - } - - @Override - public void delete(PrivilegedViewDto view) throws SQLException, ViewMalformedException { - final ComboPooledDataSource dataSource = getPrivilegedDataSource(view.getDatabase()); + public void delete(PrivilegedDatabaseDto database, String viewName) throws SQLException, ViewMalformedException { + final ComboPooledDataSource dataSource = getPrivilegedDataSource(database); final Connection connection = dataSource.getConnection(); try { /* drop view if exists */ final long start = System.currentTimeMillis(); - connection.prepareStatement(mariaDbMapper.dropViewRawQuery(view.getInternalName())) + connection.prepareStatement(mariaDbMapper.dropViewRawQuery(viewName)) .execute(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -198,7 +189,7 @@ public class ViewServiceMariaDbImpl extends HibernateConnector implements ViewSe } finally { dataSource.close(); } - log.info("Deleted view {}.{}", view.getDatabase().getInternalName(), view.getInternalName()); + log.info("Deleted view {}.{}", database.getInternalName(), viewName); } @@ -214,7 +205,7 @@ public class ViewServiceMariaDbImpl extends HibernateConnector implements ViewSe final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.selectCountRawQuery( view.getDatabase().getInternalName(), view.getInternalName(), timestamp)) .executeQuery(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace("executed statement in {} ms", System.currentTimeMillis() - start); queryResult = mariaDbMapper.resultSetToNumber(resultSet); connection.commit(); } catch (SQLException e) { @@ -228,36 +219,4 @@ public class ViewServiceMariaDbImpl extends HibernateConnector implements ViewSe return queryResult; } - @Override - public ExportResourceDto exportDataset(PrivilegedViewDto view) throws QueryMalformedException, - StorageUnavailableException, ViewNotFoundException, MalformedException { - final Dataset<Row> dataset = getData(view); - httpDataAccessCounter.increment(); - return storageService.transformDataset(dataset); - } - - @Override - public Dataset<Row> getData(@NotNull PrivilegedViewDto view) throws ViewNotFoundException, - QueryMalformedException { - try { - final Properties properties = new Properties(); - properties.setProperty("user", view.getDatabase().getContainer().getUsername()); - properties.setProperty("password", view.getDatabase().getContainer().getPassword()); - return sparkSession.read() - .jdbc(getSparkUrl(view.getDatabase().getContainer(), view.getDatabase().getInternalName()), - mariaDbMapper.tableOrViewToRawExportQuery(view.getDatabase().getInternalName(), - view.getInternalName(), view.getColumns().stream() - .map(ViewColumnDto::getInternalName).toList(), Instant.now()), properties); - } catch (Exception e) { - if (e instanceof ExtendedAnalysisException exception) { - if (exception.getSimpleMessage().contains("TABLE_OR_VIEW_NOT_FOUND")) { - log.error("Failed to find view {}: {}", view.getInternalName(), exception.getSimpleMessage()); - throw new ViewNotFoundException("Failed to find view " + view.getInternalName() + ": " + exception.getSimpleMessage()) /* remove throwable on purpose, clutters the output */; - } - } - log.error("Failed to export dataset: {}", e.getMessage()); - throw new QueryMalformedException("Failed to export dataset: " + e.getMessage(), e); - } - } - } diff --git a/dbrepo-metadata-service/api/pom.xml b/dbrepo-metadata-service/api/pom.xml index 9196e2d228a12234adee7a5cbf0eb9a51da8adf6..42dec6711548912643643c870cbb45733b26086b 100644 --- a/dbrepo-metadata-service/api/pom.xml +++ b/dbrepo-metadata-service/api/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.5.2</version> + <version>1.5.3</version> </parent> <artifactId>dbrepo-metadata-service-api</artifactId> <name>dbrepo-metadata-service-api</name> - <version>1.5.2</version> + <version>1.5.3</version> <dependencies> <dependency> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service-entities</artifactId> - <version>1.5.2</version> + <version>1.5.3</version> <scope>compile</scope> </dependency> </dependencies> diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewCreateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewCreateDto.java index 583b5f0d81aab8f8af7ca71efcd743ac8a079b27..4041292b51a34a65183d05391cbad0c52f0b38e8 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewCreateDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewCreateDto.java @@ -19,7 +19,7 @@ import lombok.extern.jackson.Jacksonized; public class ViewCreateDto { @NotBlank - @Size(min = 1, max = 64) + @Size(min = 1, max = 63) @Schema(example = "Air Quality") private String name; diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/QueryResultDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/QueryResultDto.java deleted file mode 100644 index 90f2d1a6ce9a8a7127d3ea754d6542ed8ef88c88..0000000000000000000000000000000000000000 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/QueryResultDto.java +++ /dev/null @@ -1,29 +0,0 @@ -package at.tuwien.api.database.query; - -import lombok.*; - -import jakarta.validation.constraints.NotNull; -import lombok.extern.jackson.Jacksonized; - -import java.util.List; -import java.util.Map; - -@Getter -@Setter -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Jacksonized -@ToString -public class QueryResultDto { - - @NotNull - private List<Map<String, Object>> result; - - @NotNull - private List<Map<String, Integer>> headers; - - @NotNull - private Long id; - -} diff --git a/dbrepo-metadata-service/entities/pom.xml b/dbrepo-metadata-service/entities/pom.xml index c308f0163b8da4f65b01efcfbedce90d7a0fb9c1..f7f575f633895caf1f4bda5909201aa85929bbd9 100644 --- a/dbrepo-metadata-service/entities/pom.xml +++ b/dbrepo-metadata-service/entities/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.5.2</version> + <version>1.5.3</version> </parent> <artifactId>dbrepo-metadata-service-entities</artifactId> <name>dbrepo-metadata-service-entity</name> - <version>1.5.2</version> + <version>1.5.3</version> <dependencies/> diff --git a/dbrepo-metadata-service/oai/pom.xml b/dbrepo-metadata-service/oai/pom.xml index fddf87ecb4127be0539b63697cba01d0ffa59d61..d08e19730e41123974e19ad7dfaaed6597953b87 100644 --- a/dbrepo-metadata-service/oai/pom.xml +++ b/dbrepo-metadata-service/oai/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.5.2</version> + <version>1.5.3</version> </parent> <artifactId>dbrepo-metadata-service-oai</artifactId> <name>dbrepo-metadata-service-oai</name> - <version>1.5.2</version> + <version>1.5.3</version> <dependencies/> diff --git a/dbrepo-metadata-service/pom.xml b/dbrepo-metadata-service/pom.xml index 56ab43349a657baf2cdc5b8bd84f7d1fc19e72f2..025be479bb5244d470259fd2963ad4a63c4f155b 100644 --- a/dbrepo-metadata-service/pom.xml +++ b/dbrepo-metadata-service/pom.xml @@ -5,13 +5,13 @@ <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> - <version>3.1.12</version> + <version>3.3.5</version> </parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> <name>dbrepo-metadata-service</name> - <version>1.5.2</version> + <version>1.5.3</version> <description>Service that manages the metadata</description> @@ -38,11 +38,11 @@ <properties> <java.version>17</java.version> - <spring-cloud.version>4.0.2</spring-cloud.version> + <spring-cloud.version>4.1.4</spring-cloud.version> <mapstruct.version>1.5.5.Final</mapstruct.version> <rabbitmq.version>5.20.0</rabbitmq.version> <jackson-datatype.version>2.15.0</jackson-datatype.version> - <commons-io.version>2.15.0</commons-io.version> + <commons-io.version>2.17.0</commons-io.version> <commons-validator.version>1.8.0</commons-validator.version> <guava.version>33.0.0-jre</guava.version> <jacoco.version>0.8.12</jacoco.version> @@ -55,6 +55,7 @@ <keycloak.version>21.0.2</keycloak.version> <springdoc-openapi.version>2.3.0</springdoc-openapi.version> <testcontainers.version>1.19.1</testcontainers.version> + <jackson.version>2.15.2</jackson.version> <keycloak-testcontainer.version>3.2.0</keycloak-testcontainer.version> <aws-s3.version>2.25.23</aws-s3.version> <jackson.version>2.15.2</jackson.version> diff --git a/dbrepo-metadata-service/report/pom.xml b/dbrepo-metadata-service/report/pom.xml index 95ea8b8b975a11e5851dbde6e60de8e01a8f20f5..f49b7a292a92b5e840df5bbd1b9a0ecdf0287a33 100644 --- a/dbrepo-metadata-service/report/pom.xml +++ b/dbrepo-metadata-service/report/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.5.2</version> + <version>1.5.3</version> </parent> <artifactId>dbrepo-metadata-service-report</artifactId> <name>dbrepo-metadata-service-report</name> - <version>1.5.2</version> + <version>1.5.3</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/repositories/pom.xml b/dbrepo-metadata-service/repositories/pom.xml index 816f71a1cb2390a56ecf35eb3682ed29e34d0372..a6d7bcc2819ad65086b356bb17e2b1523242b011 100644 --- a/dbrepo-metadata-service/repositories/pom.xml +++ b/dbrepo-metadata-service/repositories/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.5.2</version> + <version>1.5.3</version> </parent> <artifactId>dbrepo-metadata-service-repositories</artifactId> <name>dbrepo-metadata-service-repositories</name> - <version>1.5.2</version> + <version>1.5.3</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/rest-service/pom.xml b/dbrepo-metadata-service/rest-service/pom.xml index 613d4c4d4a6bd2db151b037fc8933013a370e9bd..0be7176e7a50681f12a906b68ff250684b8704a6 100644 --- a/dbrepo-metadata-service/rest-service/pom.xml +++ b/dbrepo-metadata-service/rest-service/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.5.2</version> + <version>1.5.3</version> </parent> <artifactId>dbrepo-metadata-service-rest-service</artifactId> <name>dbrepo-metadata-service-rest</name> - <version>1.5.2</version> + <version>1.5.3</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/rest-service/src/main/resources/application.yml b/dbrepo-metadata-service/rest-service/src/main/resources/application.yml index 2d79e7cfae29b68515a6f008fd1aaae2c53f0461..290864eea961100236eea2764297d01251c1ccbc 100644 --- a/dbrepo-metadata-service/rest-service/src/main/resources/application.yml +++ b/dbrepo-metadata-service/rest-service/src/main/resources/application.yml @@ -48,21 +48,6 @@ logging: at.tuwien.: "${LOG_LEVEL:info}" org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug dbrepo: - repository-name: "${REPOSITORY_NAME:Database Repository}" - base-url: "${BASE_URL:http://localhost}" - admin-email: "${ADMIN_EMAIL:noreply@example.com}" - deleted-record: "${DELETED_RECORD:persistent}" - granularity: "${GRANULARITY:YYYY-MM-DDThh:mm:ssZ}" - exchangeName: "${BROKER_EXCHANGE_NAME:dbrepo}" - queueName: "${BROKER_QUEUE_NAME:dbrepo}" - connectionTimeout: "${SPARQL_CONNECTION_TIMEOUT:10000}" - s3: - accessKeyId: "${S3_ACCESS_KEY_ID:seaweedfsadmin}" - secretAccessKey: "${S3_SECRET_ACCESS_KEY:seaweedfsadmin}" - bucket: "${S3_BUCKET:dbrepo}" - system: - username: "${SYSTEM_USERNAME:admin}" - password: "${SYSTEM_PASSWORD:admin}" endpoints: analyseService: "${ANALYSE_SERVICE_ENDPOINT:http://analyse-service:8080}" searchService: "${SEARCH_SERVICE_ENDPOINT:http://search-service:8080}" @@ -72,6 +57,13 @@ dbrepo: storageService: "${S3_ENDPOINT:http://storage-service:9000}" rorService: "${ROR_ENDPOINT:https://api.ror.org}" crossRefService: "${CROSSREF_ENDPOINT:http://data.crossref.org}" + s3: + accessKeyId: "${S3_ACCESS_KEY_ID:seaweedfsadmin}" + secretAccessKey: "${S3_SECRET_ACCESS_KEY:seaweedfsadmin}" + bucket: "${S3_BUCKET:dbrepo}" + system: + username: "${SYSTEM_USERNAME:admin}" + password: "${SYSTEM_PASSWORD:admin}" pid: base: "${BASE_URL:http://localhost}/pid/" jwt: @@ -82,3 +74,11 @@ dbrepo: client: "${AUTH_SERVICE_CLIENT:dbrepo-client}" clientSecret: "${AUTH_SERVICE_CLIENT_SECRET:MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}" website: "${BASE_URL:http://localhost}" + repository-name: "${REPOSITORY_NAME:Database Repository}" + base-url: "${BASE_URL:http://localhost}" + admin-email: "${ADMIN_EMAIL:noreply@example.com}" + deleted-record: "${DELETED_RECORD:persistent}" + granularity: "${GRANULARITY:YYYY-MM-DDThh:mm:ssZ}" + exchangeName: "${BROKER_EXCHANGE_NAME:dbrepo}" + queueName: "${BROKER_QUEUE_NAME:dbrepo}" + connectionTimeout: "${SPARQL_CONNECTION_TIMEOUT:10000}" diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java index c84990098596b159be2aa65459638ba0b498c7ee..108801e53f24c25c9f783dbfa9f9a3ea0fde5107 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java @@ -217,7 +217,7 @@ public class MetadataMapperUnitTest extends AbstractUnitTest { final TableDto table0 = response.getTables().get(0); assertEquals(TABLE_1_ID, table0.getId()); assertEquals(TABLE_1_NAME, table0.getName()); - assertEquals(TABLE_1_INTERNALNAME, table0.getInternalName()); + assertEquals(TABLE_1_INTERNAL_NAME, table0.getInternalName()); assertEquals(TABLE_1_DESCRIPTION, table0.getDescription()); assertEquals(DATABASE_1_ID, table0.getTdbid()); assertEquals(USER_1_ID, table0.getCreatedBy()); diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/AuthenticationPrivilegedIntegrationMvcTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/AuthenticationPrivilegedIntegrationMvcTest.java index 6a01ae6fec9e06d679fc848af0b697fcfbeba3df..22e921f53466d2f6f12aa775cde4af20c9a67be9 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/AuthenticationPrivilegedIntegrationMvcTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/AuthenticationPrivilegedIntegrationMvcTest.java @@ -166,7 +166,7 @@ public class AuthenticationPrivilegedIntegrationMvcTest extends AbstractUnitTest .andExpect(header().string("X-Port", "" + CONTAINER_1_PORT)) .andExpect(header().string("X-Type", IMAGE_1_JDBC)) .andExpect(header().string("X-Database", DATABASE_1_INTERNALNAME)) - .andExpect(header().string("X-Table", TABLE_1_INTERNALNAME)) + .andExpect(header().string("X-Table", TABLE_1_INTERNAL_NAME)) .andExpect(header().string("Access-Control-Expose-Headers", "X-Username X-Password X-Host X-Port X-Type X-Database X-Table")) .andExpect(status().isOk()); } @@ -184,7 +184,7 @@ public class AuthenticationPrivilegedIntegrationMvcTest extends AbstractUnitTest .andExpect(header().string("X-Port", "" + CONTAINER_1_PORT)) .andExpect(header().string("X-Type", IMAGE_1_JDBC)) .andExpect(header().string("X-Database", DATABASE_1_INTERNALNAME)) - .andExpect(header().string("X-Table", TABLE_1_INTERNALNAME)) + .andExpect(header().string("X-Table", TABLE_1_INTERNAL_NAME)) .andExpect(header().string("Access-Control-Expose-Headers", "X-Username X-Password X-Host X-Port X-Type X-Database X-Table")) .andExpect(status().isOk()); } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java index 551a6c350a95e1c9a22fb55d72e04530386cb522..01fc883bc8668b8c163527913b23d1206af302a6 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java @@ -107,7 +107,7 @@ public class TableServiceUnitTest extends AbstractUnitTest { /* test */ assertThrows(DatabaseNotFoundException.class, () -> { - tableService.findByName(DATABASE_3_ID, TABLE_1_INTERNALNAME); + tableService.findByName(DATABASE_3_ID, TABLE_1_INTERNAL_NAME); }); } diff --git a/dbrepo-metadata-service/services/pom.xml b/dbrepo-metadata-service/services/pom.xml index d98e575eb94e6893b67125b2898fcca4a097a151..de48899cbe6955abdca5e830048ff51099d88878 100644 --- a/dbrepo-metadata-service/services/pom.xml +++ b/dbrepo-metadata-service/services/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.5.2</version> + <version>1.5.3</version> </parent> <artifactId>dbrepo-metadata-service-services</artifactId> <name>dbrepo-metadata-service-services</name> - <version>1.5.2</version> + <version>1.5.3</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/test/pom.xml b/dbrepo-metadata-service/test/pom.xml index dcccbef8f8083ac032d5f4c14618e3661e4efb86..49cff9ddcb8c8c301d9f0e87adcb16dc61fbcab0 100644 --- a/dbrepo-metadata-service/test/pom.xml +++ b/dbrepo-metadata-service/test/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.5.2</version> + <version>1.5.3</version> </parent> <artifactId>dbrepo-metadata-service-test</artifactId> <name>dbrepo-metadata-service-test</name> - <version>1.5.2</version> + <version>1.5.3</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java index 8e613cfa7cad69c2de42d96ccacee6957e5f7939..b674e7252a5d3422ad7512e57c90a6c26b6e5b2d 100644 --- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java +++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java @@ -122,6 +122,7 @@ public abstract class AbstractUnitTest extends BaseTest { TABLE_8_PRIVILEGED_DTO.setDatabase(DATABASE_3_PRIVILEGED_DTO); VIEW_5.setDatabase(DATABASE_3); VIEW_5.setColumns(VIEW_5_COLUMNS); + VIEW_5_DTO.setColumns(VIEW_5_COLUMNS_DTO); IDENTIFIER_6.setDatabase(DATABASE_3); /* DATABASE 4 */ DATABASE_4.setSubsets(new LinkedList<>()); diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java index 4586f68d4f9c2d809bb568c0c5e878e86ca345d8..f685e5fcb929c6bfe3f8bc76b1fa51042d911eb6 100644 --- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java +++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java @@ -20,7 +20,6 @@ import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.internal.PrivilegedViewDto; import at.tuwien.api.database.query.QueryBriefDto; import at.tuwien.api.database.query.QueryDto; -import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.api.database.table.TableBriefDto; import at.tuwien.api.database.table.TableCreateDto; import at.tuwien.api.database.table.TableDto; @@ -1417,11 +1416,11 @@ public abstract class BaseTest { public final static Long TABLE_1_ID = 1L; public final static String TABLE_1_NAME = "Weather AUS"; - public final static String TABLE_1_INTERNALNAME = "weather_aus"; + public final static String TABLE_1_INTERNAL_NAME = "weather_aus"; public final static Boolean TABLE_1_VERSIONED = true; public final static Boolean TABLE_1_PROCESSED_CONSTRAINTS = true; public final static String TABLE_1_DESCRIPTION = "Weather in Australia"; - public final static String TABLE_1_QUEUE_NAME = TABLE_1_INTERNALNAME; + public final static String TABLE_1_QUEUE_NAME = TABLE_1_INTERNAL_NAME; public final static String TABLE_1_ROUTING_KEY = "dbrepo\\." + DATABASE_1_ID + "\\." + TABLE_1_ID; public final static Long TABLE_1_DATABASE_ID = DATABASE_1_ID; public final static Long TABLE_1_AVG_ROW_LENGTH = 3L; @@ -1436,7 +1435,7 @@ public abstract class BaseTest { .tdbid(DATABASE_1_ID) .database(null) /* DATABASE_1_PRIVILEGED_DTO */ .created(TABLE_1_CREATED) - .internalName(TABLE_1_INTERNALNAME) + .internalName(TABLE_1_INTERNAL_NAME) .isVersioned(TABLE_1_VERSIONED) .description(TABLE_1_DESCRIPTION) .name(TABLE_1_NAME) @@ -1459,7 +1458,7 @@ public abstract class BaseTest { .tdbid(DATABASE_1_ID) .database(null /* DATABASE_1 */) .created(TABLE_1_CREATED) - .internalName(TABLE_1_INTERNALNAME) + .internalName(TABLE_1_INTERNAL_NAME) .isVersioned(TABLE_1_VERSIONED) .description(TABLE_1_DESCRIPTION) .name(TABLE_1_NAME) @@ -1482,7 +1481,7 @@ public abstract class BaseTest { .id(TABLE_1_ID) .tdbid(DATABASE_1_ID) .created(TABLE_1_CREATED) - .internalName(TABLE_1_INTERNALNAME) + .internalName(TABLE_1_INTERNAL_NAME) .isVersioned(TABLE_1_VERSIONED) .description(TABLE_1_DESCRIPTION) .name(TABLE_1_NAME) @@ -1574,7 +1573,7 @@ public abstract class BaseTest { public final static TableBriefDto TABLE_1_BRIEF_DTO = TableBriefDto.builder() .id(TABLE_1_ID) - .internalName(TABLE_1_INTERNALNAME) + .internalName(TABLE_1_INTERNAL_NAME) .isVersioned(TABLE_1_VERSIONED) .description(TABLE_1_DESCRIPTION) .name(TABLE_1_NAME) @@ -1582,38 +1581,29 @@ public abstract class BaseTest { .build(); public final static Long TABLE_1_DATA_COUNT = 3L; - public final static QueryResultDto TABLE_1_DATA_DTO = QueryResultDto.builder() - .headers(new LinkedList<>(List.of(new HashMap<>() {{ - put("id", 0); - put("date", 1); - put("location", 2); - put("mintemp", 3); - put("rainfall", 4); - }}))) - .result(new LinkedList<>(List.of( - new HashMap<>() {{ - put("id", BigInteger.valueOf(1L)); - put("date", LocalDate.of(2008, 12, 1).atStartOfDay().toInstant(ZoneOffset.UTC)); - put("location", "Albury"); - put("mintemp", 13.4); - put("rainfall", 0.6); - }}, - new HashMap<>() {{ - put("id", BigInteger.valueOf(2L)); - put("date", LocalDate.of(2008, 12, 2).atStartOfDay().toInstant(ZoneOffset.UTC)); - put("location", "Albury"); - put("mintemp", 7.4); - put("rainfall", 0); - }}, - new HashMap<>() {{ - put("id", BigInteger.valueOf(3L)); - put("date", LocalDate.of(2008, 12, 3).atStartOfDay().toInstant(ZoneOffset.UTC)); - put("location", "Albury"); - put("mintemp", 12.9); - put("rainfall", 0); - }} - ))) - .build(); + public final static List<Map<String, Object>> TABLE_1_DATA_DTO = new LinkedList<>(List.of( + new HashMap<>() {{ + put("id", BigInteger.valueOf(1L)); + put("date", LocalDate.of(2008, 12, 1).atStartOfDay().toInstant(ZoneOffset.UTC)); + put("location", "Albury"); + put("mintemp", 13.4); + put("rainfall", 0.6); + }}, + new HashMap<>() {{ + put("id", BigInteger.valueOf(2L)); + put("date", LocalDate.of(2008, 12, 2).atStartOfDay().toInstant(ZoneOffset.UTC)); + put("location", "Albury"); + put("mintemp", 7.4); + put("rainfall", 0); + }}, + new HashMap<>() {{ + put("id", BigInteger.valueOf(3L)); + put("date", LocalDate.of(2008, 12, 3).atStartOfDay().toInstant(ZoneOffset.UTC)); + put("location", "Albury"); + put("mintemp", 12.9); + put("rainfall", 0); + }} + )); public final static Long TABLE_2_ID = 2L; public final static String TABLE_2_NAME = "Weather Location"; @@ -2432,44 +2422,38 @@ public abstract class BaseTest { .build()); public final static Long TABLE_8_DATA_COUNT = 6L; - public final static QueryResultDto TABLE_8_DATA_DTO = QueryResultDto.builder() - .headers(new LinkedList<>(List.of(new HashMap<>() {{ - put(COLUMN_8_1_INTERNAL_NAME, 0); - put(COLUMN_8_2_INTERNAL_NAME, 1); - }}))) - .result(new LinkedList<>(List.of( - new HashMap<>() {{ - put(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(1L)); - put(COLUMN_8_2_INTERNAL_NAME, 11.2); - put(COLUMN_8_3_INTERNAL_NAME, null); - }}, - new HashMap<>() {{ - put(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(2L)); - put(COLUMN_8_2_INTERNAL_NAME, 11.3); - put(COLUMN_8_3_INTERNAL_NAME, null); - }}, - new HashMap<>() {{ - put(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(3L)); - put(COLUMN_8_2_INTERNAL_NAME, 11.4); - put(COLUMN_8_3_INTERNAL_NAME, null); - }}, - new HashMap<>() {{ - put(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(4L)); - put(COLUMN_8_2_INTERNAL_NAME, 11.9); - put(COLUMN_8_3_INTERNAL_NAME, null); - }}, - new HashMap<>() {{ - put(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(5L)); - put(COLUMN_8_2_INTERNAL_NAME, 12.3); - put(COLUMN_8_3_INTERNAL_NAME, null); - }}, - new HashMap<>() {{ - put(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(6L)); - put(COLUMN_8_2_INTERNAL_NAME, 23.1); - put(COLUMN_8_3_INTERNAL_NAME, null); - }} - ))) - .build(); + public final static List<Map<String, Object>> TABLE_8_DATA_DTO = new LinkedList<>(List.of( + new HashMap<>() {{ + put(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(1L)); + put(COLUMN_8_2_INTERNAL_NAME, 11.2); + put(COLUMN_8_3_INTERNAL_NAME, null); + }}, + new HashMap<>() {{ + put(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(2L)); + put(COLUMN_8_2_INTERNAL_NAME, 11.3); + put(COLUMN_8_3_INTERNAL_NAME, null); + }}, + new HashMap<>() {{ + put(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(3L)); + put(COLUMN_8_2_INTERNAL_NAME, 11.4); + put(COLUMN_8_3_INTERNAL_NAME, null); + }}, + new HashMap<>() {{ + put(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(4L)); + put(COLUMN_8_2_INTERNAL_NAME, 11.9); + put(COLUMN_8_3_INTERNAL_NAME, null); + }}, + new HashMap<>() {{ + put(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(5L)); + put(COLUMN_8_2_INTERNAL_NAME, 12.3); + put(COLUMN_8_3_INTERNAL_NAME, null); + }}, + new HashMap<>() {{ + put(COLUMN_8_1_INTERNAL_NAME, BigInteger.valueOf(6L)); + put(COLUMN_8_2_INTERNAL_NAME, 23.1); + put(COLUMN_8_3_INTERNAL_NAME, null); + }} + )); public final static TableStatisticDto TABLE_8_STATISTIC_DTO = TableStatisticDto.builder() .columns(new HashMap<>() {{ @@ -2637,11 +2621,6 @@ public abstract class BaseTest { put("value", 23.1); }}); - public final static QueryResultDto QUERY_4_RESULT_DTO = QueryResultDto.builder() - .id(QUERY_4_RESULT_ID) - .result(QUERY_4_RESULT_RESULT) - .build(); - public final static QueryDto QUERY_4_DTO = QueryDto.builder() .id(QUERY_4_ID) .databaseId(QUERY_4_DATABASE_ID) @@ -2687,20 +2666,14 @@ public abstract class BaseTest { .createdBy(QUERY_5_CREATED_BY) .build(); - public final static QueryResultDto QUERY_5_RESULT_DTO = QueryResultDto.builder() - .headers(new LinkedList<>(List.of(new HashMap<>() {{ - put("id", 0); - put("value", 1); - }}))) - .result(new LinkedList<>(List.of( - Map.of("id", BigInteger.valueOf(1L), "value", 11.2), - Map.of("id", BigInteger.valueOf(2L), "value", 11.3), - Map.of("id", BigInteger.valueOf(3L), "value", 11.4), - Map.of("id", BigInteger.valueOf(4L), "value", 11.9), - Map.of("id", BigInteger.valueOf(5L), "value", 12.3), - Map.of("id", BigInteger.valueOf(6L), "value", 23.1) - ))) - .build(); + public final static List<Map<String, Object>> QUERY_5_RESULT_DTO = new LinkedList<>(List.of( + Map.of("id", BigInteger.valueOf(1L), "value", 11.2), + Map.of("id", BigInteger.valueOf(2L), "value", 11.3), + Map.of("id", BigInteger.valueOf(3L), "value", 11.4), + Map.of("id", BigInteger.valueOf(4L), "value", 11.9), + Map.of("id", BigInteger.valueOf(5L), "value", 12.3), + Map.of("id", BigInteger.valueOf(6L), "value", 23.1) + )); public final static Long QUERY_6_ID = 6L; public final static String QUERY_6_STATEMENT = "SELECT `location` FROM `weather_aus` WHERE `id` = 1"; @@ -4721,30 +4694,23 @@ public abstract class BaseTest { .build(); public final static Long VIEW_1_DATA_COUNT = 3L; - public final static QueryResultDto VIEW_1_DATA_DTO = QueryResultDto.builder() - .headers(new LinkedList<>(List.of(new HashMap<>() {{ - put("location", 0); - put("lat", 1); - put("lng", 2); - }}))) - .result(new LinkedList<>(List.of( - new HashMap<>() {{ - put("location", "Albury"); - put("lat", -36.0653583); - put("lng", 146.9112214); - }}, - new HashMap<>() {{ - put("location", "Sydney"); - put("lat", -33.847927); - put("lng", 150.6517942); - }}, - new HashMap<>() {{ - put("location", "Vienna"); - put("lat", null); - put("lng", null); - }} - ))) - .build(); + public final static List<Map<String, Object>> VIEW_1_DATA_DTO = new LinkedList<>(List.of( + new HashMap<>() {{ + put("location", "Albury"); + put("lat", -36.0653583); + put("lng", 146.9112214); + }}, + new HashMap<>() {{ + put("location", "Sydney"); + put("lat", -33.847927); + put("lng", 150.6517942); + }}, + new HashMap<>() {{ + put("location", "Vienna"); + put("lat", null); + put("lng", null); + }} + )); public final static List<ViewColumn> VIEW_1_COLUMNS = List.of( ViewColumn.builder() @@ -5490,7 +5456,7 @@ public abstract class BaseTest { .query(VIEW_5_QUERY) .queryHash(VIEW_5_QUERY_HASH) .createdBy(USER_1_ID) - .columns(null) + .columns(new LinkedList<>()) .build(); public final static List<ViewColumn> VIEW_5_COLUMNS = List.of( @@ -5530,6 +5496,40 @@ public abstract class BaseTest { .view(VIEW_5) .build()); + public final static List<ViewColumnDto> VIEW_5_COLUMNS_DTO = List.of( + ViewColumnDto.builder() + .id(29L) + .ordinalPosition(0) + .name("location") + .internalName("location") + .ordinalPosition(0) + .columnType(ColumnTypeDto.VARCHAR) + .size(255L) + .isNullAllowed(false) + .build(), + ViewColumnDto.builder() + .id(30L) + .ordinalPosition(1) + .name("lat") + .internalName("lat") + .ordinalPosition(1) + .columnType(ColumnTypeDto.DECIMAL) + .size(10L) + .d(0L) + .isNullAllowed(true) + .build(), + ViewColumnDto.builder() + .id(31L) + .ordinalPosition(2) + .name("lng") + .internalName("lng") + .ordinalPosition(2) + .columnType(ColumnTypeDto.DECIMAL) + .size(10L) + .d(0L) + .isNullAllowed(true) + .build()); + public final static Long QUERY_1_RESULT_ID = 1L; public final static List<Map<String, Object>> QUERY_1_RESULT_RESULT = List.of( new HashMap<>() {{ @@ -5542,11 +5542,6 @@ public abstract class BaseTest { put("lng", 150.6517942); }}); - public final static QueryResultDto QUERY_1_RESULT_DTO = QueryResultDto.builder() - .id(QUERY_1_RESULT_ID) - .result(QUERY_1_RESULT_RESULT) - .build(); - public final static String LICENSE_1_IDENTIFIER = "MIT"; public final static String LICENSE_1_URI = "https://opensource.org/license/mit/"; diff --git a/dbrepo-search-service/Pipfile b/dbrepo-search-service/Pipfile index e081ac7bb356a4097aab28b71e44ac86d03e01e0..da6b40dab3378995f966d33c3e97c033e3c5a7a4 100644 --- a/dbrepo-search-service/Pipfile +++ b/dbrepo-search-service/Pipfile @@ -18,7 +18,7 @@ jwt = "~=1.3" testcontainers-opensearch = "*" pytest = "*" rdflib = "*" -dbrepo = {path = "./lib/dbrepo-1.5.2.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.5.3.tar.gz"} gunicorn = "*" [dev-packages] diff --git a/dbrepo-search-service/Pipfile.lock b/dbrepo-search-service/Pipfile.lock index 9ccdcd7ec5ff19ad05b520e1a9665847497e0dc7..06ddaceeac0ca61d3fef64dad1ec5f17cfe00e02 100644 --- a/dbrepo-search-service/Pipfile.lock +++ b/dbrepo-search-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "5f8f989adc3210e3d07474d3a6c1d5a8bc7352195b75ef07feaf135d9388c60c" + "sha256": "40b8d9185eb1297e855ab83a2b899ac611b661afbdf4dfb5c1fc97ca1bb61f23" }, "pipfile-spec": 6, "requires": { @@ -26,85 +26,85 @@ }, "aiohttp": { "hashes": [ - "sha256:0411777249f25d11bd2964a230b3ffafcbed6cd65d0f2b132bc2b8f5b8c347c7", - "sha256:0a97d657f6cf8782a830bb476c13f7d777cfcab8428ac49dde15c22babceb361", - "sha256:0b5a5009b0159a8f707879dc102b139466d8ec6db05103ec1520394fdd8ea02c", - "sha256:0bcb7f6976dc0b6b56efde13294862adf68dd48854111b422a336fa729a82ea6", - "sha256:14624d96f0d69cf451deed3173079a68c322279be6030208b045ab77e1e8d550", - "sha256:15c4e489942d987d5dac0ba39e5772dcbed4cc9ae3710d1025d5ba95e4a5349c", - "sha256:176f8bb8931da0613bb0ed16326d01330066bb1e172dd97e1e02b1c27383277b", - "sha256:17af09d963fa1acd7e4c280e9354aeafd9e3d47eaa4a6bfbd2171ad7da49f0c5", - "sha256:1a8b13b9950d8b2f8f58b6e5842c4b842b5887e2c32e3f4644d6642f1659a530", - "sha256:202f40fb686e5f93908eee0c75d1e6fbe50a43e9bd4909bf3bf4a56b560ca180", - "sha256:21cbe97839b009826a61b143d3ca4964c8590d7aed33d6118125e5b71691ca46", - "sha256:27935716f8d62c1c73010428db310fd10136002cfc6d52b0ba7bdfa752d26066", - "sha256:282e0a7ddd36ebc411f156aeaa0491e8fe7f030e2a95da532cf0c84b0b70bc66", - "sha256:28f29bce89c3b401a53d6fd4bee401ee943083bf2bdc12ef297c1d63155070b0", - "sha256:2ac9fd83096df36728da8e2f4488ac3b5602238f602706606f3702f07a13a409", - "sha256:30f9f89ae625d412043f12ca3771b2ccec227cc93b93bb1f994db6e1af40a7d3", - "sha256:317251b9c9a2f1a9ff9cd093775b34c6861d1d7df9439ce3d32a88c275c995cd", - "sha256:31de2f10f63f96cc19e04bd2df9549559beadd0b2ee2da24a17e7ed877ca8c60", - "sha256:36df00e0541f264ce42d62280281541a47474dfda500bc5b7f24f70a7f87be7a", - "sha256:39625703540feb50b6b7f938b3856d1f4886d2e585d88274e62b1bd273fae09b", - "sha256:3f5461c77649358610fb9694e790956b4238ac5d9e697a17f63619c096469afe", - "sha256:4313f3bc901255b22f01663eeeae167468264fdae0d32c25fc631d5d6e15b502", - "sha256:442356e8924fe1a121f8c87866b0ecdc785757fd28924b17c20493961b3d6697", - "sha256:44cb1a1326a0264480a789e6100dc3e07122eb8cd1ad6b784a3d47d13ed1d89c", - "sha256:44d323aa80a867cb6db6bebb4bbec677c6478e38128847f2c6b0f70eae984d72", - "sha256:499368eb904566fbdf1a3836a1532000ef1308f34a1bcbf36e6351904cced771", - "sha256:4b01d9cfcb616eeb6d40f02e66bebfe7b06d9f2ef81641fdd50b8dd981166e0b", - "sha256:5720ebbc7a1b46c33a42d489d25d36c64c419f52159485e55589fbec648ea49a", - "sha256:5cc5e0d069c56645446c45a4b5010d4b33ac6c5ebfd369a791b5f097e46a3c08", - "sha256:618b18c3a2360ac940a5503da14fa4f880c5b9bc315ec20a830357bcc62e6bae", - "sha256:6435a66957cdba1a0b16f368bde03ce9c79c57306b39510da6ae5312a1a5b2c1", - "sha256:647ec5bee7e4ec9f1034ab48173b5fa970d9a991e565549b965e93331f1328fe", - "sha256:6e1e9e447856e9b7b3d38e1316ae9a8c92e7536ef48373de758ea055edfd5db5", - "sha256:6ef1550bb5f55f71b97a6a395286db07f7f2c01c8890e613556df9a51da91e8d", - "sha256:6ffa45cc55b18d4ac1396d1ddb029f139b1d3480f1594130e62bceadf2e1a838", - "sha256:77f31cebd8c27a36af6c7346055ac564946e562080ee1a838da724585c67474f", - "sha256:7a3b5b2c012d70c63d9d13c57ed1603709a4d9d7d473e4a9dfece0e4ea3d5f51", - "sha256:7a7ddf981a0b953ade1c2379052d47ccda2f58ab678fca0671c7c7ca2f67aac2", - "sha256:84de955314aa5e8d469b00b14d6d714b008087a0222b0f743e7ffac34ef56aff", - "sha256:8dcfd14c712aa9dd18049280bfb2f95700ff6a8bde645e09f17c3ed3f05a0130", - "sha256:928f92f80e2e8d6567b87d3316c1fd9860ccfe36e87a9a7f5237d4cda8baa1ba", - "sha256:9384b07cfd3045b37b05ed002d1c255db02fb96506ad65f0f9b776b762a7572e", - "sha256:96726839a42429318017e67a42cca75d4f0d5248a809b3cc2e125445edd7d50d", - "sha256:96bbec47beb131bbf4bae05d8ef99ad9e5738f12717cfbbf16648b78b0232e87", - "sha256:9bcf97b971289be69638d8b1b616f7e557e1342debc7fc86cf89d3f08960e411", - "sha256:a0cf4d814689e58f57ecd5d8c523e6538417ca2e72ff52c007c64065cef50fb2", - "sha256:a7c6147c6306f537cff59409609508a1d2eff81199f0302dd456bb9e7ea50c39", - "sha256:a9266644064779840feec0e34f10a89b3ff1d2d6b751fe90017abcad1864fa7c", - "sha256:afbe85b50ade42ddff5669947afde9e8a610e64d2c80be046d67ec4368e555fa", - "sha256:afcda759a69c6a8be3aae764ec6733155aa4a5ad9aad4f398b52ba4037942fe3", - "sha256:b2fab23003c4bb2249729a7290a76c1dda38c438300fdf97d4e42bf78b19c810", - "sha256:bd3f711f4c99da0091ced41dccdc1bcf8be0281dc314d6d9c6b6cf5df66f37a9", - "sha256:be0c7c98e38a1e3ad7a6ff64af8b6d6db34bf5a41b1478e24c3c74d9e7f8ed42", - "sha256:c1f2d7fd583fc79c240094b3e7237d88493814d4b300d013a42726c35a734bc9", - "sha256:c5bba6b83fde4ca233cfda04cbd4685ab88696b0c8eaf76f7148969eab5e248a", - "sha256:c6beeac698671baa558e82fa160be9761cf0eb25861943f4689ecf9000f8ebd0", - "sha256:c7333e7239415076d1418dbfb7fa4df48f3a5b00f8fdf854fca549080455bc14", - "sha256:c8a02f74ae419e3955af60f570d83187423e42e672a6433c5e292f1d23619269", - "sha256:c9c23e62f3545c2216100603614f9e019e41b9403c47dd85b8e7e5015bf1bde0", - "sha256:cca505829cdab58c2495ff418c96092d225a1bbd486f79017f6de915580d3c44", - "sha256:d3108f0ad5c6b6d78eec5273219a5bbd884b4aacec17883ceefaac988850ce6e", - "sha256:d4b8a1b6c7a68c73191f2ebd3bf66f7ce02f9c374e309bdb68ba886bbbf1b938", - "sha256:d6e274661c74195708fc4380a4ef64298926c5a50bb10fbae3d01627d7a075b7", - "sha256:db2914de2559809fdbcf3e48f41b17a493b58cb7988d3e211f6b63126c55fe82", - "sha256:e738aabff3586091221044b7a584865ddc4d6120346d12e28e788307cd731043", - "sha256:e7f6173302f8a329ca5d1ee592af9e628d3ade87816e9958dcf7cdae2841def7", - "sha256:e9d036a9a41fc78e8a3f10a86c2fc1098fca8fab8715ba9eb999ce4788d35df0", - "sha256:ea142255d4901b03f89cb6a94411ecec117786a76fc9ab043af8f51dd50b5313", - "sha256:ebd3e6b0c7d4954cca59d241970011f8d3327633d555051c430bd09ff49dc494", - "sha256:ec656680fc53a13f849c71afd0c84a55c536206d524cbc831cde80abbe80489e", - "sha256:ec8df0ff5a911c6d21957a9182402aad7bf060eaeffd77c9ea1c16aecab5adbf", - "sha256:ed95d66745f53e129e935ad726167d3a6cb18c5d33df3165974d54742c373868", - "sha256:ef2c9499b7bd1e24e473dc1a85de55d72fd084eea3d8bdeec7ee0720decb54fa", - "sha256:f5252ba8b43906f206048fa569debf2cd0da0316e8d5b4d25abe53307f573941", - "sha256:f737fef6e117856400afee4f17774cdea392b28ecf058833f5eca368a18cf1bf", - "sha256:fc726c3fa8f606d07bd2b500e5dc4c0fd664c59be7788a16b9e34352c50b6b6b" + "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0", + "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769", + "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5", + "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59", + "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf", + "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985", + "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50", + "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299", + "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d", + "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab", + "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542", + "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b", + "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b", + "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838", + "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683", + "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df", + "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d", + "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91", + "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9", + "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be", + "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c", + "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219", + "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4", + "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf", + "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f", + "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199", + "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1", + "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60", + "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77", + "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf", + "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079", + "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4", + "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46", + "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8", + "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c", + "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d", + "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33", + "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34", + "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82", + "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b", + "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c", + "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836", + "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69", + "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39", + "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f", + "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32", + "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc", + "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52", + "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816", + "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1", + "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec", + "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487", + "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0", + "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767", + "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5", + "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6", + "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9", + "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f", + "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138", + "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e", + "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf", + "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109", + "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408", + "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6", + "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d", + "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99", + "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4", + "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74", + "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc", + "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d", + "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5", + "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a", + "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01", + "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f", + "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e", + "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3" ], "markers": "python_version >= '3.9'", - "version": "==3.11.9" + "version": "==3.11.10" }, "aiosignal": { "hashes": [ @@ -345,7 +345,6 @@ "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b", "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc", "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543", - "sha256:60eb32934076fa07e4316b7b2742fa52cbb190b42c2df2863dbc4230a0a9b385", "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c", "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591", "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede", @@ -353,7 +352,6 @@ "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f", "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123", "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c", - "sha256:9abcc2e083cbe8dde89124a47e5e53ec38751f0d7dfd36801008f316a127d7ba", "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c", "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285", "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd", @@ -375,9 +373,9 @@ }, "dbrepo": { "hashes": [ - "sha256:292c2631816ca3dbdbd243e4c006c4bd39d512f5ae7e4b10070102c85ec58a10" + "sha256:b746668ca7830897aa9ab7660c2b6cf420a6cde09afb87665f9fa9cb4d6a2314" ], - "path": "./lib/dbrepo-1.5.2.tar.gz" + "path": "./lib/dbrepo-1.5.3.tar.gz" }, "docker": { "hashes": [ @@ -860,64 +858,64 @@ }, "numpy": { "hashes": [ - "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe", - "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0", - "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48", - "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a", - "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564", - "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958", - "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17", - "sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0", - "sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee", - "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b", - "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4", - "sha256:3522b0dfe983a575e6a9ab3a4a4dfe156c3e428468ff08ce582b9bb6bd1d71d4", - "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6", - "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4", - "sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d", - "sha256:4f2015dfe437dfebbfce7c85c7b53d81ba49e71ba7eadbf1df40c915af75979f", - "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f", - "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f", - "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56", - "sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9", - "sha256:6a4825252fcc430a182ac4dee5a505053d262c807f8a924603d411f6718b88fd", - "sha256:72dcc4a35a8515d83e76b58fdf8113a5c969ccd505c8a946759b24e3182d1f23", - "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed", - "sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a", - "sha256:78574ac2d1a4a02421f25da9559850d59457bac82f2b8d7a44fe83a64f770098", - "sha256:825656d0743699c529c5943554d223c021ff0494ff1442152ce887ef4f7561a1", - "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512", - "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f", - "sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09", - "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f", - "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc", - "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8", - "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0", - "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761", - "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef", - "sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5", - "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e", - "sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b", - "sha256:c006b607a865b07cd981ccb218a04fc86b600411d83d6fc261357f1c0966755d", - "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43", - "sha256:c7662f0e3673fe4e832fe07b65c50342ea27d989f92c80355658c7f888fcc83c", - "sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41", - "sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff", - "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408", - "sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2", - "sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9", - "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57", - "sha256:e14e26956e6f1696070788252dcdff11b4aca4c3e8bd166e0df1bb8f315a67cb", - "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9", - "sha256:e711e02f49e176a01d0349d82cb5f05ba4db7d5e7e0defd026328e5cfb3226d3", - "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a", - "sha256:ecc76a9ba2911d8d37ac01de72834d8849e55473457558e12995f4cd53e778e0", - "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e", - "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598", - "sha256:fa2d1337dc61c8dc417fbccf20f6d1e139896a30721b7f1e832b2bb6ef4eb6c4" + "sha256:0557eebc699c1c34cccdd8c3778c9294e8196df27d713706895edc6f57d29608", + "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef", + "sha256:0da8495970f6b101ddd0c38ace92edea30e7e12b9a926b57f5fabb1ecc25bb90", + "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae", + "sha256:122fd2fcfafdefc889c64ad99c228d5a1f9692c3a83f56c292618a59aa60ae83", + "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0", + "sha256:16757cf28621e43e252c560d25b15f18a2f11da94fea344bf26c599b9cf54b73", + "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671", + "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69", + "sha256:1e25507d85da11ff5066269d0bd25d06e0a0f2e908415534f3e603d2a78e4ffa", + "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066", + "sha256:3579eaeb5e07f3ded59298ce22b65f877a86ba8e9fe701f5576c99bb17c283da", + "sha256:36b2b43146f646642b425dd2027730f99bac962618ec2052932157e213a040e9", + "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e", + "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3", + "sha256:3f2f5cddeaa4424a0a118924b988746db6ffa8565e5829b1841a8a3bd73eb59a", + "sha256:40deb10198bbaa531509aad0cd2f9fadb26c8b94070831e2208e7df543562b74", + "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3", + "sha256:4723a50e1523e1de4fccd1b9a6dcea750c2102461e9a02b2ac55ffeae09a4410", + "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72", + "sha256:4e58666988605e251d42c2818c7d3d8991555381be26399303053b58a5bbf30d", + "sha256:54dc1d6d66f8d37843ed281773c7174f03bf7ad826523f73435deb88ba60d2d4", + "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038", + "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e", + "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13", + "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d", + "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95", + "sha256:7fe4bb0695fe986a9e4deec3b6857003b4cfe5c5e4aac0b95f6a658c14635e31", + "sha256:7fe8f3583e0607ad4e43a954e35c1748b553bfe9fdac8635c02058023277d1b3", + "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03", + "sha256:9874bc2ff574c40ab7a5cbb7464bf9b045d617e36754a7bc93f933d52bd9ffc6", + "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2", + "sha256:a222d764352c773aa5ebde02dd84dba3279c81c6db2e482d62a3fa54e5ece69b", + "sha256:a50aeff71d0f97b6450d33940c7181b08be1441c6c193e678211bff11aa725e7", + "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab", + "sha256:a62eb442011776e4036af5c8b1a00b706c5bc02dc15eb5344b0c750428c94219", + "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571", + "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d", + "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1", + "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca", + "sha256:b30042fe92dbd79f1ba7f6898fada10bdaad1847c44f2dff9a16147e00a93661", + "sha256:b606b1aaf802e6468c2608c65ff7ece53eae1a6874b3765f69b8ceb20c5fa78e", + "sha256:b6207dc8fb3c8cb5668e885cef9ec7f70189bec4e276f0ff70d5aa078d32c88e", + "sha256:c2aed8fcf8abc3020d6a9ccb31dbc9e7d7819c56a348cc88fd44be269b37427e", + "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a", + "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3", + "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881", + "sha256:df12a1f99b99f569a7c2ae59aa2d31724e8d835fc7f33e14f4792e3071d11221", + "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742", + "sha256:e12c6c1ce84628c52d6367863773f7c8c8241be554e8b79686e91a43f1733773", + "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e", + "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529", + "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67", + "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c", + "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367" ], "markers": "python_version == '3.11'", - "version": "==2.1.3" + "version": "==2.2.0" }, "opensearch-py": { "hashes": [ @@ -1361,120 +1359,120 @@ }, "rpds-py": { "hashes": [ - "sha256:0545928bdf53dfdfcab284468212efefb8a6608ca3b6910c7fb2e5ed8bdc2dc0", - "sha256:05fdeae9010533e47715c37df83264df0122584e40d691d50cf3607c060952a3", - "sha256:09a1f000c5f6e08b298275bae00921e9fbbf2a35dae0a86db2821c058c2201a9", - "sha256:0a53592cdf98cec3dfcdb24ffec8a4797e7656b65700099af43ec7df023b6de4", - "sha256:0f057a0c546c42964836b209d8de9ea1a4f4b0432006c6343cbe633d8ca14571", - "sha256:0f9eb37d3a60b262a98ab51ee899cac039de9ca0ce68dcf1a6518a09719020b0", - "sha256:102be79c4cc47a4aeb5912401185c404cd2601c15a7163bbecff7f1bfe20b669", - "sha256:128cbaed7ba26116820bcb992405d6a13ea18c8fca1b8c4f59906d858e91e979", - "sha256:149b4d875ef9b12a8f5e303e86a32a58f8ef627e57ec97a7d0e4be819069d141", - "sha256:153248f48d6f90a295a502f53ec544a3ffbd21b0bb32f5dca39c4b93a764d6a2", - "sha256:157a023bded0618a1eea54979fe2e0f9309e9ddc818ef4b8fc3b884ff38fedd5", - "sha256:15fa4ca658f8ad22645d3531682b17e5580832efbfa87304c3e62214c79c1e8a", - "sha256:198067aa6f3d942ff5d0d655bb1e91b59ae85279d47590682cba2834ac1b97d2", - "sha256:1c40e02cc4f3e18fd39344edb10eebe04bd11cfd13119606b5771e5ea51630d3", - "sha256:1ded65691a1d3fd7d2aa89d2c91aa51f941601bb2ce099739909034d957fef4b", - "sha256:201650b309c419143775c15209c620627de3c09a27c7fb58375325aec5cce260", - "sha256:2143c3aed85992604d758bbe67da839fb4aab3dd2e1c6dddab5b3ca7162b34a2", - "sha256:2177e59c033bf0d1bf7de1ced561205963583caf3242c6c700a723034bfb5f8e", - "sha256:2ea23f1525d4f64286dbe0947c929d45c3ffe963b2dbed1d3844a2e4938bda42", - "sha256:31264187fc934ff1024a4f56775f33c9252d3f4f3e27ec07d1995a26b52702c3", - "sha256:36ce951800ed2acc6772fd9f42150f29d567f0423989748052fdb39d9e2b5795", - "sha256:3aaa22487477de9618ce3b37f99fbe81219ba96f3c2ca84f576f0ab451b83aba", - "sha256:3e7e99e2af59c56c59b6c964d612511b8203480d39d1ef83edc56f2cb42a3f5d", - "sha256:413a30a99d8683dace3765885920ed27ab662efbb6c98d81db76c397ad1ffd71", - "sha256:447ae1104fb32197b9262f772d565d38e834cc2e9edd89350b37b88fed636e70", - "sha256:4659b2e4a5008715099e216050f5c6976e5a4329482664411789968b82e3f17d", - "sha256:48ee97c7c6027fd423058675b5a39d0b5f7a1648250b671563d5c9f74ff13ff0", - "sha256:4ba6c66fbc6015b2f99e7176fec41793cecb00c4cc357cad038dff85e6ac42ab", - "sha256:4c8dc7331e8cbb1c0ea2bcb550adb1777365944ffd125c69aa1117fdef4887f5", - "sha256:50e4b5d291105f7063259fe0125b1af902fb34499444d7c5c521dd8328b00939", - "sha256:542eb246d5be31b5e0a9c8ddb9539416f9b31f58f75bd4ee328bff2b5c58d6fd", - "sha256:55d371b9d8b0c2a68a50413a8cb01c3c3ce1ea4f768bf77b66669a9a486e101e", - "sha256:580ccbf11f02f948add4cb641843030a89f1463d7c0740cbfc9aca91e9dc34b3", - "sha256:5dbff9402c2bdf00bf0df9905694b3c292a3847c725651938a72f554351a5fcb", - "sha256:5f941fb86195f97be7f6efe04a21b223f05dfe4d1dfb159999e2f8d101e44cc4", - "sha256:608c84699b2db09c6a8743845b1a3dad36fae53eaaecb241d45b13dff74405fb", - "sha256:626b9feb01bff049a5aec4804f0c58db12585778b4902e5376a95b01f80a7a16", - "sha256:66f4f48a89cdd30ab3a47335df81c76e9a63799d0d84b29c0618371c66fa37b0", - "sha256:6c8e97e19aa7b0b0d801a159f932ce4435f1049c8c38e2bb372bb5bee559ce50", - "sha256:72407065ad459db9f3d052ea8c51e02534f02533fc61e51cbab3bd94166f086c", - "sha256:734783dd7da58f76222f458346ddebdb3621686a1a2a667db5049caf0c9956b9", - "sha256:76eaa4c087a061a2c8a0a92536405069878a8f530c00e84a9eaf332e70f5561f", - "sha256:776a06cb5720556a549829896a49acebb5bdd96c7bba100191a994053546975a", - "sha256:7839b7528faa4d134c183b1f2dd1ee4dc2ca2f899f4f0cfdf00fc04c255262a7", - "sha256:8080467df22feca0fc9c46567001777c6fbc2b4a2683a7137420896051874ca1", - "sha256:85060e96953647871957d41707adb8d7bff4e977042fd0deb4fc1881b98dd2fe", - "sha256:8954b9ffe60f479a0c0ba40987db2546c735ab02a725ea7fd89342152d4d821d", - "sha256:8a603155db408f773637f9e3a712c6e3cbc521aaa8fa2b99f9ba6106c59a2496", - "sha256:8bd9ec1db79a664f4cbb12878693b73416f4d2cb425d3e27eccc1bdfbdc826ef", - "sha256:8c0c324879d483504b07f7b18eb1b50567c434263bbe4866ecce33056162668a", - "sha256:8ce729f1dc8a4a190c34b69f75377bddc004079b2963ab722ab91fafe040be6d", - "sha256:8ec41049c90d204a6561238a9ad6c7263ebb7009d9759c98b58078d9d2fec9ba", - "sha256:959ae04ed30cde606f3a0320f0a1f4167a107e685ef5209cce28c5080590bd31", - "sha256:96559e05bdf938b2048353e10a7920b98f853cefe4482c2064a718d7d0a50bd7", - "sha256:96b3759d8ab2323324e0a92b2f44834f9d88089b8d1ab6f533b61f4be3411cef", - "sha256:97c5ffe47ccf92d8b17e10f8a5ce28d015aa1196edc3359684cf31504eae6a14", - "sha256:9d5b925156a746dc1f5f52376fdd1fbdd3f6ffe1fcd6f5e06f77ca79abb940a3", - "sha256:9dae4eb9b5534e09ba6c6ab496a757e5e394b7e7b08767d25ca37e8d36491114", - "sha256:a083221b6a4ecdef38a60c95d8d3223d99449cb4da2544e9644958dc16664eb9", - "sha256:a0ed14a4162c2c2b21a162c9fcf90057e3e7da18cd171ab344c1e1664f75090e", - "sha256:a18aedc032d6468b73ebbe4437129cb30d54fe543cde2f23671ecad76c3aea24", - "sha256:a451dba533be77454ebcffc85189108fc05f279100835ac76e7989edacb89156", - "sha256:aa2ba0176037c915d8660a4e46581d645e2c22b5373e466bc8640a794d45861a", - "sha256:ab27dd4edd84b13309f268ffcdfc07aef8339135ffab7b6d43f16884307a2a48", - "sha256:ab784621d3e2a41916e21f13a483602cc989fd45fff637634b9231ba43d4383b", - "sha256:b07fa9e634234e84096adfa4be3828c8f26e238679c122824b2b3d7131bec578", - "sha256:b09209cdfcacf5eba9cf80367130532e6c02e695252e1f64d3cfcc2356e6e19f", - "sha256:babec324e8654a59122aaa66936a9a483faa03276db9792f51332475c2dddc4a", - "sha256:bca4428c4a957b78ded3e6e62884ab03f029dce8fa8d34818da0f80f61332b49", - "sha256:c0467838c90435b80793cde486a318fc916ee57f2af54e4b10c72b20cbdcbaa9", - "sha256:c2a214bf5b79bd39a9de1c991353aaaacafda83ba1374178309e92be8e67d411", - "sha256:c3029f481b31f329b1fdb4ec4b56935d82210ddd9c6f86ea5a87c06f1e97b161", - "sha256:c6f3fd617db422c9d4e12cb8d84c984fe07d6d9cb0950cbf117f3bccc6268d05", - "sha256:c783e4ed68200f4e03c125690d23158b1c49c4b186d458a18debc109bbdc3c2e", - "sha256:c8502a02ae3ae67084f5a0bf5a8253b19fa7a887f824e41e016cdb0ac532a06f", - "sha256:c88535f83f7391cf3a45af990237e3939a6fdfbedaed2571633bfdd0bceb36b0", - "sha256:c9ce6b83597d45bec44a2690857ede62fc98223772135f8a7fa90884eb726501", - "sha256:ca4657e9fd0b1b5376942d403d634ce188f79064f0873aa853ab05b10185ceec", - "sha256:d0ff8d5b13ce2357fa8b33a0a2e3775aa71df5bf7c8ba060634c9d15ab12f357", - "sha256:d280b4bf09f719b89fd9aab3b71067acc0d0449b7d1eba99a2ade4939cef8296", - "sha256:d3777c446bb1c5fcd82dc3f8776e1a146cd91e80cc1892f8634575ace438d22f", - "sha256:d7833ef6f5d6cb634f296abfd93452fb3eb44c4e9a6ae95c1021eab704c1cee2", - "sha256:d8306f27418361b788e3fca9f47dec125457f80122e7e31ba7ff5cdba98343f8", - "sha256:d962e2e89b3a95e3597a34b8c93ced1e98958502c5b8096c9fd69deff279f561", - "sha256:dbe428d0ac6eacaf05402adbaf137f59ad6063848182d1ff294f95ce0f24005b", - "sha256:e4f91d702b9ce1388660b3d4a28aa552614a1399e93f718ed0dacd68f23b3d32", - "sha256:e69acdbc132c9592c8dc393af85e38e206ca847c7019a953ff625191c3a12312", - "sha256:e8056adcefa2dcb67e8bc91ea5eee26df66e8b297a8cd6ff0903f85c70908fa0", - "sha256:e9ac7280bd045f472b50306d7efeee051b69e3a2dd1b90f46bd7e86e63b1efa2", - "sha256:eb013aa01b404219f28dc973d9e6310fd4db216d7299253dd355629952e0564e", - "sha256:ec1ccc2a9f764cd632fb8ab28fdde166250df54fc8d97315a4a6948dc5367639", - "sha256:ef7282d8a14b60dd515e47060638687710b1d518f4b5e961caad43fb3a3606f9", - "sha256:ef92b1fbe6aa2e7885eb90853cc016b1fc95439a8cc8da6d526880e9e2148695", - "sha256:efb2ad60ca8637d5f9f653f9a9a8d73964059972b6b95036be77e028bffc68a3", - "sha256:effcae2152afe7937a28376dbabb25c770ef99ed4e16a4ffeb8e6a4f7c4f06aa", - "sha256:f2d1b58a0c3a73f0361759642e80260a6d28eee6501b40fe25b82af33ef83f21", - "sha256:f57e2d0f8022783426121b586d7c842ea40ea832a29e28ca36c881b54c74fb28", - "sha256:f5cae9b415ea8a6a563566dbf46650222eccc5971c7daa16fbee63aef92ae543", - "sha256:f76c6f319e57007ad52e671ec741d801324760a377e3d4992c9bb8200333ebac", - "sha256:f91bfc39f7a64168e08ab831fa497ec5438c1d6c6e2f9e12848d95ad11ac8523", - "sha256:fdaee3947eaaa52dae3ceb9d9f66329e13d8bae35682b1e5dd54612938693934", - "sha256:fe3f245c2f39a5692d9123c174bc48f6f9fe3e96407e67c6d04541a767d99e72", - "sha256:ffae97d28ea4f2c613a751d087b75a97fb78311b38cc2e9a2f4587e473ace167" + "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518", + "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059", + "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61", + "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5", + "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9", + "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543", + "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2", + "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a", + "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d", + "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56", + "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d", + "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd", + "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b", + "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4", + "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99", + "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d", + "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd", + "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe", + "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1", + "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e", + "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f", + "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3", + "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca", + "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d", + "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e", + "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc", + "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea", + "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38", + "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b", + "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c", + "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff", + "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723", + "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e", + "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493", + "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6", + "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83", + "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091", + "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1", + "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627", + "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1", + "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728", + "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16", + "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c", + "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45", + "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7", + "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a", + "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730", + "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967", + "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25", + "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24", + "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055", + "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d", + "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0", + "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e", + "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7", + "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c", + "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f", + "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd", + "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652", + "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8", + "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11", + "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333", + "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96", + "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64", + "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b", + "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e", + "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c", + "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9", + "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec", + "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb", + "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37", + "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad", + "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9", + "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c", + "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf", + "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4", + "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f", + "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d", + "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09", + "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d", + "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566", + "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74", + "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338", + "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15", + "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c", + "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648", + "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84", + "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3", + "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123", + "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520", + "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831", + "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e", + "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf", + "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b", + "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2", + "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3", + "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130", + "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b", + "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de", + "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5", + "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d", + "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00", + "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e" ], "markers": "python_version >= '3.9'", - "version": "==0.22.1" + "version": "==0.22.3" }, "six": { "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", + "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" + "version": "==1.17.0" }, "sqlalchemy": { "hashes": [ @@ -1893,72 +1891,72 @@ }, "coverage": { "hashes": [ - "sha256:093896e530c38c8e9c996901858ac63f3d4171268db2c9c8b373a228f459bbc5", - "sha256:09b9f848b28081e7b975a3626e9081574a7b9196cde26604540582da60235fdf", - "sha256:0b0c69f4f724c64dfbfe79f5dfb503b42fe6127b8d479b2677f2b227478db2eb", - "sha256:13618bed0c38acc418896005732e565b317aa9e98d855a0e9f211a7ffc2d6638", - "sha256:13690e923a3932e4fad4c0ebfb9cb5988e03d9dcb4c5150b5fcbf58fd8bddfc4", - "sha256:177f01eeaa3aee4a5ffb0d1439c5952b53d5010f86e9d2667963e632e30082cc", - "sha256:193e3bffca48ad74b8c764fb4492dd875038a2f9925530cb094db92bb5e47bed", - "sha256:1defe91d41ce1bd44b40fabf071e6a01a5aa14de4a31b986aa9dfd1b3e3e414a", - "sha256:1f188a2402f8359cf0c4b1fe89eea40dc13b52e7b4fd4812450da9fcd210181d", - "sha256:202a2d645c5a46b84992f55b0a3affe4f0ba6b4c611abec32ee88358db4bb649", - "sha256:24eda3a24a38157eee639ca9afe45eefa8d2420d49468819ac5f88b10de84f4c", - "sha256:2e4e0f60cb4bd7396108823548e82fdab72d4d8a65e58e2c19bbbc2f1e2bfa4b", - "sha256:379c111d3558272a2cae3d8e57e6b6e6f4fe652905692d54bad5ea0ca37c5ad4", - "sha256:37cda8712145917105e07aab96388ae76e787270ec04bcb9d5cc786d7cbb8443", - "sha256:38c51297b35b3ed91670e1e4efb702b790002e3245a28c76e627478aa3c10d83", - "sha256:3985b9be361d8fb6b2d1adc9924d01dec575a1d7453a14cccd73225cb79243ee", - "sha256:3988665ee376abce49613701336544041f2117de7b7fbfe91b93d8ff8b151c8e", - "sha256:3ac47fa29d8d41059ea3df65bd3ade92f97ee4910ed638e87075b8e8ce69599e", - "sha256:3b4b4299dd0d2c67caaaf286d58aef5e75b125b95615dda4542561a5a566a1e3", - "sha256:3ea8bb1ab9558374c0ab591783808511d135a833c3ca64a18ec927f20c4030f0", - "sha256:3fe47da3e4fda5f1abb5709c156eca207eacf8007304ce3019eb001e7a7204cb", - "sha256:428ac484592f780e8cd7b6b14eb568f7c85460c92e2a37cb0c0e5186e1a0d076", - "sha256:44e6c85bbdc809383b509d732b06419fb4544dca29ebe18480379633623baafb", - "sha256:4674f0daa1823c295845b6a740d98a840d7a1c11df00d1fd62614545c1583787", - "sha256:4be32da0c3827ac9132bb488d331cb32e8d9638dd41a0557c5569d57cf22c9c1", - "sha256:4db3ed6a907b555e57cc2e6f14dc3a4c2458cdad8919e40b5357ab9b6db6c43e", - "sha256:5c52a036535d12590c32c49209e79cabaad9f9ad8aa4cbd875b68c4d67a9cbce", - "sha256:629a1ba2115dce8bf75a5cce9f2486ae483cb89c0145795603d6554bdc83e801", - "sha256:62a66ff235e4c2e37ed3b6104d8b478d767ff73838d1222132a7a026aa548764", - "sha256:63068a11171e4276f6ece913bde059e77c713b48c3a848814a6537f35afb8365", - "sha256:63c19702db10ad79151a059d2d6336fe0c470f2e18d0d4d1a57f7f9713875dcf", - "sha256:644ec81edec0f4ad17d51c838a7d01e42811054543b76d4ba2c5d6af741ce2a6", - "sha256:6535d996f6537ecb298b4e287a855f37deaf64ff007162ec0afb9ab8ba3b8b71", - "sha256:6f4548c5ead23ad13fb7a2c8ea541357474ec13c2b736feb02e19a3085fac002", - "sha256:716a78a342679cd1177bc8c2fe957e0ab91405bd43a17094324845200b2fddf4", - "sha256:74610105ebd6f33d7c10f8907afed696e79c59e3043c5f20eaa3a46fddf33b4c", - "sha256:768939f7c4353c0fac2f7c37897e10b1414b571fd85dd9fc49e6a87e37a2e0d8", - "sha256:86cffe9c6dfcfe22e28027069725c7f57f4b868a3f86e81d1c62462764dc46d4", - "sha256:8aae5aea53cbfe024919715eca696b1a3201886ce83790537d1c3668459c7146", - "sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc", - "sha256:912e95017ff51dc3d7b6e2be158dedc889d9a5cc3382445589ce554f1a34c0ea", - "sha256:9a7b8ac36fd688c8361cbc7bf1cb5866977ece6e0b17c34aa0df58bda4fa18a4", - "sha256:9e89d5c8509fbd6c03d0dd1972925b22f50db0792ce06324ba069f10787429ad", - "sha256:ae270e79f7e169ccfe23284ff5ea2d52a6f401dc01b337efb54b3783e2ce3f28", - "sha256:b07c25d52b1c16ce5de088046cd2432b30f9ad5e224ff17c8f496d9cb7d1d451", - "sha256:b39e6011cd06822eb964d038d5dff5da5d98652b81f5ecd439277b32361a3a50", - "sha256:bd55f8fc8fa494958772a2a7302b0354ab16e0b9272b3c3d83cdb5bec5bd1779", - "sha256:c15b32a7aca8038ed7644f854bf17b663bc38e1671b5d6f43f9a2b2bd0c46f63", - "sha256:c1b4474beee02ede1eef86c25ad4600a424fe36cff01a6103cb4533c6bf0169e", - "sha256:c79c0685f142ca53256722a384540832420dff4ab15fec1863d7e5bc8691bdcc", - "sha256:c9ebfb2507751f7196995142f057d1324afdab56db1d9743aab7f50289abd022", - "sha256:d7ad66e8e50225ebf4236368cc43c37f59d5e6728f15f6e258c8639fa0dd8e6d", - "sha256:d82ab6816c3277dc962cfcdc85b1efa0e5f50fb2c449432deaf2398a2928ab94", - "sha256:d9fd2547e6decdbf985d579cf3fc78e4c1d662b9b0ff7cc7862baaab71c9cc5b", - "sha256:de38add67a0af869b0d79c525d3e4588ac1ffa92f39116dbe0ed9753f26eba7d", - "sha256:e19122296822deafce89a0c5e8685704c067ae65d45e79718c92df7b3ec3d331", - "sha256:e44961e36cb13c495806d4cac67640ac2866cb99044e210895b506c26ee63d3a", - "sha256:e4c81ed2820b9023a9a90717020315e63b17b18c274a332e3b6437d7ff70abe0", - "sha256:e683e6ecc587643f8cde8f5da6768e9d165cd31edf39ee90ed7034f9ca0eefee", - "sha256:f39e2f3530ed1626c66e7493be7a8423b023ca852aacdc91fb30162c350d2a92", - "sha256:f56f49b2553d7dd85fd86e029515a221e5c1f8cb3d9c38b470bc38bde7b8445a", - "sha256:fb9fc32399dca861584d96eccd6c980b69bbcd7c228d06fb74fe53e007aa8ef9" + "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4", + "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c", + "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f", + "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b", + "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6", + "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae", + "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692", + "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4", + "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4", + "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717", + "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d", + "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198", + "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1", + "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3", + "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb", + "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d", + "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08", + "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf", + "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b", + "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710", + "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c", + "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae", + "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077", + "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00", + "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb", + "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664", + "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014", + "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9", + "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6", + "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e", + "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9", + "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa", + "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611", + "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b", + "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a", + "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8", + "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030", + "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678", + "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015", + "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902", + "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97", + "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845", + "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419", + "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464", + "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be", + "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9", + "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7", + "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be", + "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1", + "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba", + "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5", + "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073", + "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4", + "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a", + "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a", + "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3", + "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599", + "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0", + "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b", + "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec", + "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1", + "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==7.6.8" + "version": "==7.6.9" }, "idna": { "hashes": [ diff --git a/dbrepo-search-service/init/Pipfile.lock b/dbrepo-search-service/init/Pipfile.lock index c08493b2f96cd43463da5e7886036514911b5ad1..9f92191fbaffa2a291ee912f33ad482124a68fa2 100644 --- a/dbrepo-search-service/init/Pipfile.lock +++ b/dbrepo-search-service/init/Pipfile.lock @@ -26,85 +26,85 @@ }, "aiohttp": { "hashes": [ - "sha256:0411777249f25d11bd2964a230b3ffafcbed6cd65d0f2b132bc2b8f5b8c347c7", - "sha256:0a97d657f6cf8782a830bb476c13f7d777cfcab8428ac49dde15c22babceb361", - "sha256:0b5a5009b0159a8f707879dc102b139466d8ec6db05103ec1520394fdd8ea02c", - "sha256:0bcb7f6976dc0b6b56efde13294862adf68dd48854111b422a336fa729a82ea6", - "sha256:14624d96f0d69cf451deed3173079a68c322279be6030208b045ab77e1e8d550", - "sha256:15c4e489942d987d5dac0ba39e5772dcbed4cc9ae3710d1025d5ba95e4a5349c", - "sha256:176f8bb8931da0613bb0ed16326d01330066bb1e172dd97e1e02b1c27383277b", - "sha256:17af09d963fa1acd7e4c280e9354aeafd9e3d47eaa4a6bfbd2171ad7da49f0c5", - "sha256:1a8b13b9950d8b2f8f58b6e5842c4b842b5887e2c32e3f4644d6642f1659a530", - "sha256:202f40fb686e5f93908eee0c75d1e6fbe50a43e9bd4909bf3bf4a56b560ca180", - "sha256:21cbe97839b009826a61b143d3ca4964c8590d7aed33d6118125e5b71691ca46", - "sha256:27935716f8d62c1c73010428db310fd10136002cfc6d52b0ba7bdfa752d26066", - "sha256:282e0a7ddd36ebc411f156aeaa0491e8fe7f030e2a95da532cf0c84b0b70bc66", - "sha256:28f29bce89c3b401a53d6fd4bee401ee943083bf2bdc12ef297c1d63155070b0", - "sha256:2ac9fd83096df36728da8e2f4488ac3b5602238f602706606f3702f07a13a409", - "sha256:30f9f89ae625d412043f12ca3771b2ccec227cc93b93bb1f994db6e1af40a7d3", - "sha256:317251b9c9a2f1a9ff9cd093775b34c6861d1d7df9439ce3d32a88c275c995cd", - "sha256:31de2f10f63f96cc19e04bd2df9549559beadd0b2ee2da24a17e7ed877ca8c60", - "sha256:36df00e0541f264ce42d62280281541a47474dfda500bc5b7f24f70a7f87be7a", - "sha256:39625703540feb50b6b7f938b3856d1f4886d2e585d88274e62b1bd273fae09b", - "sha256:3f5461c77649358610fb9694e790956b4238ac5d9e697a17f63619c096469afe", - "sha256:4313f3bc901255b22f01663eeeae167468264fdae0d32c25fc631d5d6e15b502", - "sha256:442356e8924fe1a121f8c87866b0ecdc785757fd28924b17c20493961b3d6697", - "sha256:44cb1a1326a0264480a789e6100dc3e07122eb8cd1ad6b784a3d47d13ed1d89c", - "sha256:44d323aa80a867cb6db6bebb4bbec677c6478e38128847f2c6b0f70eae984d72", - "sha256:499368eb904566fbdf1a3836a1532000ef1308f34a1bcbf36e6351904cced771", - "sha256:4b01d9cfcb616eeb6d40f02e66bebfe7b06d9f2ef81641fdd50b8dd981166e0b", - "sha256:5720ebbc7a1b46c33a42d489d25d36c64c419f52159485e55589fbec648ea49a", - "sha256:5cc5e0d069c56645446c45a4b5010d4b33ac6c5ebfd369a791b5f097e46a3c08", - "sha256:618b18c3a2360ac940a5503da14fa4f880c5b9bc315ec20a830357bcc62e6bae", - "sha256:6435a66957cdba1a0b16f368bde03ce9c79c57306b39510da6ae5312a1a5b2c1", - "sha256:647ec5bee7e4ec9f1034ab48173b5fa970d9a991e565549b965e93331f1328fe", - "sha256:6e1e9e447856e9b7b3d38e1316ae9a8c92e7536ef48373de758ea055edfd5db5", - "sha256:6ef1550bb5f55f71b97a6a395286db07f7f2c01c8890e613556df9a51da91e8d", - "sha256:6ffa45cc55b18d4ac1396d1ddb029f139b1d3480f1594130e62bceadf2e1a838", - "sha256:77f31cebd8c27a36af6c7346055ac564946e562080ee1a838da724585c67474f", - "sha256:7a3b5b2c012d70c63d9d13c57ed1603709a4d9d7d473e4a9dfece0e4ea3d5f51", - "sha256:7a7ddf981a0b953ade1c2379052d47ccda2f58ab678fca0671c7c7ca2f67aac2", - "sha256:84de955314aa5e8d469b00b14d6d714b008087a0222b0f743e7ffac34ef56aff", - "sha256:8dcfd14c712aa9dd18049280bfb2f95700ff6a8bde645e09f17c3ed3f05a0130", - "sha256:928f92f80e2e8d6567b87d3316c1fd9860ccfe36e87a9a7f5237d4cda8baa1ba", - "sha256:9384b07cfd3045b37b05ed002d1c255db02fb96506ad65f0f9b776b762a7572e", - "sha256:96726839a42429318017e67a42cca75d4f0d5248a809b3cc2e125445edd7d50d", - "sha256:96bbec47beb131bbf4bae05d8ef99ad9e5738f12717cfbbf16648b78b0232e87", - "sha256:9bcf97b971289be69638d8b1b616f7e557e1342debc7fc86cf89d3f08960e411", - "sha256:a0cf4d814689e58f57ecd5d8c523e6538417ca2e72ff52c007c64065cef50fb2", - "sha256:a7c6147c6306f537cff59409609508a1d2eff81199f0302dd456bb9e7ea50c39", - "sha256:a9266644064779840feec0e34f10a89b3ff1d2d6b751fe90017abcad1864fa7c", - "sha256:afbe85b50ade42ddff5669947afde9e8a610e64d2c80be046d67ec4368e555fa", - "sha256:afcda759a69c6a8be3aae764ec6733155aa4a5ad9aad4f398b52ba4037942fe3", - "sha256:b2fab23003c4bb2249729a7290a76c1dda38c438300fdf97d4e42bf78b19c810", - "sha256:bd3f711f4c99da0091ced41dccdc1bcf8be0281dc314d6d9c6b6cf5df66f37a9", - "sha256:be0c7c98e38a1e3ad7a6ff64af8b6d6db34bf5a41b1478e24c3c74d9e7f8ed42", - "sha256:c1f2d7fd583fc79c240094b3e7237d88493814d4b300d013a42726c35a734bc9", - "sha256:c5bba6b83fde4ca233cfda04cbd4685ab88696b0c8eaf76f7148969eab5e248a", - "sha256:c6beeac698671baa558e82fa160be9761cf0eb25861943f4689ecf9000f8ebd0", - "sha256:c7333e7239415076d1418dbfb7fa4df48f3a5b00f8fdf854fca549080455bc14", - "sha256:c8a02f74ae419e3955af60f570d83187423e42e672a6433c5e292f1d23619269", - "sha256:c9c23e62f3545c2216100603614f9e019e41b9403c47dd85b8e7e5015bf1bde0", - "sha256:cca505829cdab58c2495ff418c96092d225a1bbd486f79017f6de915580d3c44", - "sha256:d3108f0ad5c6b6d78eec5273219a5bbd884b4aacec17883ceefaac988850ce6e", - "sha256:d4b8a1b6c7a68c73191f2ebd3bf66f7ce02f9c374e309bdb68ba886bbbf1b938", - "sha256:d6e274661c74195708fc4380a4ef64298926c5a50bb10fbae3d01627d7a075b7", - "sha256:db2914de2559809fdbcf3e48f41b17a493b58cb7988d3e211f6b63126c55fe82", - "sha256:e738aabff3586091221044b7a584865ddc4d6120346d12e28e788307cd731043", - "sha256:e7f6173302f8a329ca5d1ee592af9e628d3ade87816e9958dcf7cdae2841def7", - "sha256:e9d036a9a41fc78e8a3f10a86c2fc1098fca8fab8715ba9eb999ce4788d35df0", - "sha256:ea142255d4901b03f89cb6a94411ecec117786a76fc9ab043af8f51dd50b5313", - "sha256:ebd3e6b0c7d4954cca59d241970011f8d3327633d555051c430bd09ff49dc494", - "sha256:ec656680fc53a13f849c71afd0c84a55c536206d524cbc831cde80abbe80489e", - "sha256:ec8df0ff5a911c6d21957a9182402aad7bf060eaeffd77c9ea1c16aecab5adbf", - "sha256:ed95d66745f53e129e935ad726167d3a6cb18c5d33df3165974d54742c373868", - "sha256:ef2c9499b7bd1e24e473dc1a85de55d72fd084eea3d8bdeec7ee0720decb54fa", - "sha256:f5252ba8b43906f206048fa569debf2cd0da0316e8d5b4d25abe53307f573941", - "sha256:f737fef6e117856400afee4f17774cdea392b28ecf058833f5eca368a18cf1bf", - "sha256:fc726c3fa8f606d07bd2b500e5dc4c0fd664c59be7788a16b9e34352c50b6b6b" + "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0", + "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769", + "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5", + "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59", + "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf", + "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985", + "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50", + "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299", + "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d", + "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab", + "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542", + "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b", + "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b", + "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838", + "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683", + "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df", + "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d", + "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91", + "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9", + "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be", + "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c", + "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219", + "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4", + "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf", + "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f", + "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199", + "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1", + "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60", + "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77", + "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf", + "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079", + "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4", + "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46", + "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8", + "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c", + "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d", + "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33", + "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34", + "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82", + "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b", + "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c", + "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836", + "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69", + "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39", + "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f", + "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32", + "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc", + "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52", + "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816", + "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1", + "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec", + "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487", + "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0", + "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767", + "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5", + "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6", + "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9", + "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f", + "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138", + "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e", + "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf", + "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109", + "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408", + "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6", + "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d", + "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99", + "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4", + "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74", + "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc", + "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d", + "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5", + "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a", + "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01", + "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f", + "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e", + "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3" ], "markers": "python_version >= '3.9'", - "version": "==3.11.9" + "version": "==3.11.10" }, "aiosignal": { "hashes": [ @@ -593,64 +593,64 @@ }, "numpy": { "hashes": [ - "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe", - "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0", - "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48", - "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a", - "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564", - "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958", - "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17", - "sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0", - "sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee", - "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b", - "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4", - "sha256:3522b0dfe983a575e6a9ab3a4a4dfe156c3e428468ff08ce582b9bb6bd1d71d4", - "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6", - "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4", - "sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d", - "sha256:4f2015dfe437dfebbfce7c85c7b53d81ba49e71ba7eadbf1df40c915af75979f", - "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f", - "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f", - "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56", - "sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9", - "sha256:6a4825252fcc430a182ac4dee5a505053d262c807f8a924603d411f6718b88fd", - "sha256:72dcc4a35a8515d83e76b58fdf8113a5c969ccd505c8a946759b24e3182d1f23", - "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed", - "sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a", - "sha256:78574ac2d1a4a02421f25da9559850d59457bac82f2b8d7a44fe83a64f770098", - "sha256:825656d0743699c529c5943554d223c021ff0494ff1442152ce887ef4f7561a1", - "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512", - "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f", - "sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09", - "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f", - "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc", - "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8", - "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0", - "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761", - "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef", - "sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5", - "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e", - "sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b", - "sha256:c006b607a865b07cd981ccb218a04fc86b600411d83d6fc261357f1c0966755d", - "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43", - "sha256:c7662f0e3673fe4e832fe07b65c50342ea27d989f92c80355658c7f888fcc83c", - "sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41", - "sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff", - "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408", - "sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2", - "sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9", - "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57", - "sha256:e14e26956e6f1696070788252dcdff11b4aca4c3e8bd166e0df1bb8f315a67cb", - "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9", - "sha256:e711e02f49e176a01d0349d82cb5f05ba4db7d5e7e0defd026328e5cfb3226d3", - "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a", - "sha256:ecc76a9ba2911d8d37ac01de72834d8849e55473457558e12995f4cd53e778e0", - "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e", - "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598", - "sha256:fa2d1337dc61c8dc417fbccf20f6d1e139896a30721b7f1e832b2bb6ef4eb6c4" + "sha256:0557eebc699c1c34cccdd8c3778c9294e8196df27d713706895edc6f57d29608", + "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef", + "sha256:0da8495970f6b101ddd0c38ace92edea30e7e12b9a926b57f5fabb1ecc25bb90", + "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae", + "sha256:122fd2fcfafdefc889c64ad99c228d5a1f9692c3a83f56c292618a59aa60ae83", + "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0", + "sha256:16757cf28621e43e252c560d25b15f18a2f11da94fea344bf26c599b9cf54b73", + "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671", + "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69", + "sha256:1e25507d85da11ff5066269d0bd25d06e0a0f2e908415534f3e603d2a78e4ffa", + "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066", + "sha256:3579eaeb5e07f3ded59298ce22b65f877a86ba8e9fe701f5576c99bb17c283da", + "sha256:36b2b43146f646642b425dd2027730f99bac962618ec2052932157e213a040e9", + "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e", + "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3", + "sha256:3f2f5cddeaa4424a0a118924b988746db6ffa8565e5829b1841a8a3bd73eb59a", + "sha256:40deb10198bbaa531509aad0cd2f9fadb26c8b94070831e2208e7df543562b74", + "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3", + "sha256:4723a50e1523e1de4fccd1b9a6dcea750c2102461e9a02b2ac55ffeae09a4410", + "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72", + "sha256:4e58666988605e251d42c2818c7d3d8991555381be26399303053b58a5bbf30d", + "sha256:54dc1d6d66f8d37843ed281773c7174f03bf7ad826523f73435deb88ba60d2d4", + "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038", + "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e", + "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13", + "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d", + "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95", + "sha256:7fe4bb0695fe986a9e4deec3b6857003b4cfe5c5e4aac0b95f6a658c14635e31", + "sha256:7fe8f3583e0607ad4e43a954e35c1748b553bfe9fdac8635c02058023277d1b3", + "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03", + "sha256:9874bc2ff574c40ab7a5cbb7464bf9b045d617e36754a7bc93f933d52bd9ffc6", + "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2", + "sha256:a222d764352c773aa5ebde02dd84dba3279c81c6db2e482d62a3fa54e5ece69b", + "sha256:a50aeff71d0f97b6450d33940c7181b08be1441c6c193e678211bff11aa725e7", + "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab", + "sha256:a62eb442011776e4036af5c8b1a00b706c5bc02dc15eb5344b0c750428c94219", + "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571", + "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d", + "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1", + "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca", + "sha256:b30042fe92dbd79f1ba7f6898fada10bdaad1847c44f2dff9a16147e00a93661", + "sha256:b606b1aaf802e6468c2608c65ff7ece53eae1a6874b3765f69b8ceb20c5fa78e", + "sha256:b6207dc8fb3c8cb5668e885cef9ec7f70189bec4e276f0ff70d5aa078d32c88e", + "sha256:c2aed8fcf8abc3020d6a9ccb31dbc9e7d7819c56a348cc88fd44be269b37427e", + "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a", + "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3", + "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881", + "sha256:df12a1f99b99f569a7c2ae59aa2d31724e8d835fc7f33e14f4792e3071d11221", + "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742", + "sha256:e12c6c1ce84628c52d6367863773f7c8c8241be554e8b79686e91a43f1733773", + "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e", + "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529", + "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67", + "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c", + "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367" ], "markers": "python_version == '3.11'", - "version": "==2.1.3" + "version": "==2.2.0" }, "opensearch-py": { "hashes": [ @@ -995,11 +995,11 @@ }, "six": { "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", + "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" + "version": "==1.17.0" }, "testcontainers-core": { "hashes": [ @@ -1227,72 +1227,72 @@ "develop": { "coverage": { "hashes": [ - "sha256:093896e530c38c8e9c996901858ac63f3d4171268db2c9c8b373a228f459bbc5", - "sha256:09b9f848b28081e7b975a3626e9081574a7b9196cde26604540582da60235fdf", - "sha256:0b0c69f4f724c64dfbfe79f5dfb503b42fe6127b8d479b2677f2b227478db2eb", - "sha256:13618bed0c38acc418896005732e565b317aa9e98d855a0e9f211a7ffc2d6638", - "sha256:13690e923a3932e4fad4c0ebfb9cb5988e03d9dcb4c5150b5fcbf58fd8bddfc4", - "sha256:177f01eeaa3aee4a5ffb0d1439c5952b53d5010f86e9d2667963e632e30082cc", - "sha256:193e3bffca48ad74b8c764fb4492dd875038a2f9925530cb094db92bb5e47bed", - "sha256:1defe91d41ce1bd44b40fabf071e6a01a5aa14de4a31b986aa9dfd1b3e3e414a", - "sha256:1f188a2402f8359cf0c4b1fe89eea40dc13b52e7b4fd4812450da9fcd210181d", - "sha256:202a2d645c5a46b84992f55b0a3affe4f0ba6b4c611abec32ee88358db4bb649", - "sha256:24eda3a24a38157eee639ca9afe45eefa8d2420d49468819ac5f88b10de84f4c", - "sha256:2e4e0f60cb4bd7396108823548e82fdab72d4d8a65e58e2c19bbbc2f1e2bfa4b", - "sha256:379c111d3558272a2cae3d8e57e6b6e6f4fe652905692d54bad5ea0ca37c5ad4", - "sha256:37cda8712145917105e07aab96388ae76e787270ec04bcb9d5cc786d7cbb8443", - "sha256:38c51297b35b3ed91670e1e4efb702b790002e3245a28c76e627478aa3c10d83", - "sha256:3985b9be361d8fb6b2d1adc9924d01dec575a1d7453a14cccd73225cb79243ee", - "sha256:3988665ee376abce49613701336544041f2117de7b7fbfe91b93d8ff8b151c8e", - "sha256:3ac47fa29d8d41059ea3df65bd3ade92f97ee4910ed638e87075b8e8ce69599e", - "sha256:3b4b4299dd0d2c67caaaf286d58aef5e75b125b95615dda4542561a5a566a1e3", - "sha256:3ea8bb1ab9558374c0ab591783808511d135a833c3ca64a18ec927f20c4030f0", - "sha256:3fe47da3e4fda5f1abb5709c156eca207eacf8007304ce3019eb001e7a7204cb", - "sha256:428ac484592f780e8cd7b6b14eb568f7c85460c92e2a37cb0c0e5186e1a0d076", - "sha256:44e6c85bbdc809383b509d732b06419fb4544dca29ebe18480379633623baafb", - "sha256:4674f0daa1823c295845b6a740d98a840d7a1c11df00d1fd62614545c1583787", - "sha256:4be32da0c3827ac9132bb488d331cb32e8d9638dd41a0557c5569d57cf22c9c1", - "sha256:4db3ed6a907b555e57cc2e6f14dc3a4c2458cdad8919e40b5357ab9b6db6c43e", - "sha256:5c52a036535d12590c32c49209e79cabaad9f9ad8aa4cbd875b68c4d67a9cbce", - "sha256:629a1ba2115dce8bf75a5cce9f2486ae483cb89c0145795603d6554bdc83e801", - "sha256:62a66ff235e4c2e37ed3b6104d8b478d767ff73838d1222132a7a026aa548764", - "sha256:63068a11171e4276f6ece913bde059e77c713b48c3a848814a6537f35afb8365", - "sha256:63c19702db10ad79151a059d2d6336fe0c470f2e18d0d4d1a57f7f9713875dcf", - "sha256:644ec81edec0f4ad17d51c838a7d01e42811054543b76d4ba2c5d6af741ce2a6", - "sha256:6535d996f6537ecb298b4e287a855f37deaf64ff007162ec0afb9ab8ba3b8b71", - "sha256:6f4548c5ead23ad13fb7a2c8ea541357474ec13c2b736feb02e19a3085fac002", - "sha256:716a78a342679cd1177bc8c2fe957e0ab91405bd43a17094324845200b2fddf4", - "sha256:74610105ebd6f33d7c10f8907afed696e79c59e3043c5f20eaa3a46fddf33b4c", - "sha256:768939f7c4353c0fac2f7c37897e10b1414b571fd85dd9fc49e6a87e37a2e0d8", - "sha256:86cffe9c6dfcfe22e28027069725c7f57f4b868a3f86e81d1c62462764dc46d4", - "sha256:8aae5aea53cbfe024919715eca696b1a3201886ce83790537d1c3668459c7146", - "sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc", - "sha256:912e95017ff51dc3d7b6e2be158dedc889d9a5cc3382445589ce554f1a34c0ea", - "sha256:9a7b8ac36fd688c8361cbc7bf1cb5866977ece6e0b17c34aa0df58bda4fa18a4", - "sha256:9e89d5c8509fbd6c03d0dd1972925b22f50db0792ce06324ba069f10787429ad", - "sha256:ae270e79f7e169ccfe23284ff5ea2d52a6f401dc01b337efb54b3783e2ce3f28", - "sha256:b07c25d52b1c16ce5de088046cd2432b30f9ad5e224ff17c8f496d9cb7d1d451", - "sha256:b39e6011cd06822eb964d038d5dff5da5d98652b81f5ecd439277b32361a3a50", - "sha256:bd55f8fc8fa494958772a2a7302b0354ab16e0b9272b3c3d83cdb5bec5bd1779", - "sha256:c15b32a7aca8038ed7644f854bf17b663bc38e1671b5d6f43f9a2b2bd0c46f63", - "sha256:c1b4474beee02ede1eef86c25ad4600a424fe36cff01a6103cb4533c6bf0169e", - "sha256:c79c0685f142ca53256722a384540832420dff4ab15fec1863d7e5bc8691bdcc", - "sha256:c9ebfb2507751f7196995142f057d1324afdab56db1d9743aab7f50289abd022", - "sha256:d7ad66e8e50225ebf4236368cc43c37f59d5e6728f15f6e258c8639fa0dd8e6d", - "sha256:d82ab6816c3277dc962cfcdc85b1efa0e5f50fb2c449432deaf2398a2928ab94", - "sha256:d9fd2547e6decdbf985d579cf3fc78e4c1d662b9b0ff7cc7862baaab71c9cc5b", - "sha256:de38add67a0af869b0d79c525d3e4588ac1ffa92f39116dbe0ed9753f26eba7d", - "sha256:e19122296822deafce89a0c5e8685704c067ae65d45e79718c92df7b3ec3d331", - "sha256:e44961e36cb13c495806d4cac67640ac2866cb99044e210895b506c26ee63d3a", - "sha256:e4c81ed2820b9023a9a90717020315e63b17b18c274a332e3b6437d7ff70abe0", - "sha256:e683e6ecc587643f8cde8f5da6768e9d165cd31edf39ee90ed7034f9ca0eefee", - "sha256:f39e2f3530ed1626c66e7493be7a8423b023ca852aacdc91fb30162c350d2a92", - "sha256:f56f49b2553d7dd85fd86e029515a221e5c1f8cb3d9c38b470bc38bde7b8445a", - "sha256:fb9fc32399dca861584d96eccd6c980b69bbcd7c228d06fb74fe53e007aa8ef9" + "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4", + "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c", + "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f", + "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b", + "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6", + "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae", + "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692", + "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4", + "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4", + "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717", + "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d", + "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198", + "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1", + "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3", + "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb", + "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d", + "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08", + "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf", + "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b", + "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710", + "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c", + "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae", + "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077", + "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00", + "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb", + "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664", + "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014", + "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9", + "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6", + "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e", + "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9", + "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa", + "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611", + "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b", + "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a", + "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8", + "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030", + "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678", + "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015", + "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902", + "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97", + "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845", + "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419", + "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464", + "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be", + "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9", + "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7", + "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be", + "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1", + "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba", + "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5", + "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073", + "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4", + "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a", + "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a", + "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3", + "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599", + "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0", + "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b", + "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec", + "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1", + "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==7.6.8" + "version": "==7.6.9" }, "iniconfig": { "hashes": [ diff --git a/dbrepo-search-service/init/lib/dbrepo-1.5.3.tar.gz b/dbrepo-search-service/init/lib/dbrepo-1.5.3.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..2bb796d8fece2d97c3b2168248ff493dfa24a549 Binary files /dev/null and b/dbrepo-search-service/init/lib/dbrepo-1.5.3.tar.gz differ diff --git a/dbrepo-search-service/lib/dbrepo-1.5.3.tar.gz b/dbrepo-search-service/lib/dbrepo-1.5.3.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..2bb796d8fece2d97c3b2168248ff493dfa24a549 Binary files /dev/null and b/dbrepo-search-service/lib/dbrepo-1.5.3.tar.gz differ diff --git a/dbrepo-ui/components/subset/Results.vue b/dbrepo-ui/components/subset/Results.vue index 4ba414309c5009bdf88914150b6c1afe11e9a65e..ba063dcf5d575071d851da73bfcd0b9da80b5fed 100644 --- a/dbrepo-ui/components/subset/Results.vue +++ b/dbrepo-ui/components/subset/Results.vue @@ -171,10 +171,10 @@ export default { } }, mapResults (data) { - this.result.headers = data.headers.map((h) => { + this.result.headers = data.headers.map((header) => { return { - title: Object.keys(h)[0], - value: Object.keys(h)[0], + title: header, + value: header, sortable: false } }) diff --git a/dbrepo-ui/composables/query-service.ts b/dbrepo-ui/composables/query-service.ts index b3c21c605344db722259df375d7eba98404c65de..119915de2785763d549bdf3bf2d97379811f8fed 100644 --- a/dbrepo-ui/composables/query-service.ts +++ b/dbrepo-ui/composables/query-service.ts @@ -84,7 +84,12 @@ export const useQueryService = (): any => { axios.post<QueryResultDto>(`/api/database/${databaseId}/subset`, data, {params: mapFilter(timestamp, page, size), timeout: 600_000}) .then((response) => { console.info('Executed query with id', response.data.id, ' in database with id', databaseId) - resolve(response.data) + const result: QueryResultDto = { + id: 1, + headers: [], + result: response.data + } + resolve(result) }) .catch((error) => { console.error('Failed to execute query', error) @@ -100,7 +105,12 @@ export const useQueryService = (): any => { axios.get<QueryResultDto>(`/api/database/${databaseId}/subset/${queryId}/data`, { params: mapFilter(null, page, size) }) .then((response) => { console.info('Re-executed query in database with id', databaseId) - resolve(response.data) + const result: QueryResultDto = { + id: Number(response.headers['x-id']), + headers: response.headers['x-headers'] ? response.headers['x-headers'].split(',') : [], + result: response.data + } + resolve(result) }) .catch((error) => { console.error('Failed to re-execute query', error) diff --git a/dbrepo-ui/composables/table-service.ts b/dbrepo-ui/composables/table-service.ts index 3d87e68d4febed8b825a56b1aada946bd6b0f4d5..102d5dfe58d24d937165b6524070f8b3eef1f3f2 100644 --- a/dbrepo-ui/composables/table-service.ts +++ b/dbrepo-ui/composables/table-service.ts @@ -74,7 +74,12 @@ export const useTableService = (): any => { axios.get<QueryResultDto>(`/api/database/${databaseId}/table/${tableId}/data`, { params: mapFilter(timestamp, page, size) }) .then((response) => { console.info('Got data for table with id', tableId, 'in database with id', databaseId) - resolve(response.data) + const result: QueryResultDto = { + id: tableId, + headers: response.headers['x-headers'] ? response.headers['x-headers'].split(',') : [], + result: response.data + } + resolve(result) }) .catch((error) => { console.error('Failed to get data', error) diff --git a/dbrepo-ui/composables/view-service.ts b/dbrepo-ui/composables/view-service.ts index 5b3a25a149813ddf30f622fcb3d51fccb31f6730..0c17c353ef4b8faed5b28a5ee367806911de7db4 100644 --- a/dbrepo-ui/composables/view-service.ts +++ b/dbrepo-ui/composables/view-service.ts @@ -41,7 +41,12 @@ export const useViewService = (): any => { axios.get<QueryResultDto>(`/api/database/${databaseId}/view/${viewId}/data`, { params: {page, size} }) .then((response) => { console.info('Re-executed view with id', viewId, 'in database with id', databaseId) - resolve(response.data) + const result: QueryResultDto = { + id: viewId, + headers: response.headers['x-headers'] ? response.headers['x-headers'].split(',') : [], + result: response.data + } + resolve(result) }) .catch((error) => { console.error('Failed to re-execute view', error) diff --git a/dbrepo-ui/dto/index.ts b/dbrepo-ui/dto/index.ts index ba4c41304209a08200b99de17077eed49d63e357..c068862f67ed7a64062fd5d8bd7e958b24dc12aa 100644 --- a/dbrepo-ui/dto/index.ts +++ b/dbrepo-ui/dto/index.ts @@ -537,7 +537,7 @@ interface ImportCsv { interface QueryResultDto { id: number | null; result: any; - headers: any; + headers: string[]; } interface TableHistoryDto { diff --git a/dbrepo-ui/locales/en-US.json b/dbrepo-ui/locales/en-US.json index 8b6807bdbf24edd94b08087ef538d499e47784eb..3317a3ff2a02027d30da4efe416deaed97183cfc 100644 --- a/dbrepo-ui/locales/en-US.json +++ b/dbrepo-ui/locales/en-US.json @@ -312,8 +312,8 @@ "size": { "title": "Size" }, - "result-rows": { - "title": "Rows" + "rows": { + "title": "Result Rows" }, "owner": { "title": "Owner" diff --git a/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/data.vue b/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/data.vue index d4d707fab871efd1773884d8eb5b23f720fba410..3ac8f40d645b44449f5607b9f3b031d06fa463d6 100644 --- a/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/data.vue +++ b/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/data.vue @@ -148,7 +148,7 @@ export default { const url = URL.createObjectURL(data) const link = document.createElement('a') link.href = url - link.download = 'table.csv' + link.download = 'subset.csv' document.body.appendChild(link) link.click() }) diff --git a/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/info.vue index 0d59b1ed25e405db59c50e3f492d9122f9fbf5ae..b9ed74a04287e3f8ecb76b88309399b31d234cd4 100644 --- a/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/info.vue +++ b/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/info.vue @@ -66,7 +66,7 @@ <pre>{{ $t('pages.subset.hash.prefix') }}:{{ result_hash }}</pre> </v-list-item> <v-list-item - :title="$t('pages.subset.result-rows.title')" + :title="$t('pages.subset.rows.title')" density="compact"> {{ subset.result_number }} </v-list-item> diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue index e109a7db3e2bb35926c5a8f87d700185286d4d53..1fb012598afa50820c8cf7aa79b4abee6bf408df 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue @@ -41,7 +41,7 @@ {{ sizeToHumanLabel(table.data_length) }} </v-list-item> <v-list-item - :title="$t('pages.table.result-rows.title')"> + :title="$t('pages.table.rows.title')"> {{ table.num_rows }} </v-list-item> <v-list-item diff --git a/dbrepo-upload-service/pom.xml b/dbrepo-upload-service/pom.xml index 9684d60454c1fecdeb0de0c3c88ffc2170a9e5f9..ba4567da8db9d4a61d03fdceb3e08aea29f558a7 100644 --- a/dbrepo-upload-service/pom.xml +++ b/dbrepo-upload-service/pom.xml @@ -5,13 +5,13 @@ <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> - <version>3.1.12</version> + <version>3.3.5</version> </parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-upload-service</artifactId> <name>dbrepo-upload-service</name> - <version>1.5.2</version> + <version>1.5.3</version> <url>https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/</url> <developers> @@ -24,11 +24,11 @@ <properties> <java.version>17</java.version> - <spring-cloud.version>4.0.2</spring-cloud.version> + <spring-cloud.version>4.1.4</spring-cloud.version> <mapstruct.version>1.5.5.Final</mapstruct.version> <rabbitmq.version>5.20.0</rabbitmq.version> <jackson-datatype.version>2.15.0</jackson-datatype.version> - <commons-io.version>2.15.0</commons-io.version> + <commons-io.version>2.17.0</commons-io.version> <commons-validator.version>1.8.0</commons-validator.version> <guava.version>33.0.0-jre</guava.version> <jacoco.version>0.8.12</jacoco.version> diff --git a/dbrepo-upload-service/src/main/resources/application.yml b/dbrepo-upload-service/src/main/resources/application.yml index 2d79e7cfae29b68515a6f008fd1aaae2c53f0461..e0285aa736a747004d99d90da05a0259ba0500a4 100644 --- a/dbrepo-upload-service/src/main/resources/application.yml +++ b/dbrepo-upload-service/src/main/resources/application.yml @@ -2,11 +2,6 @@ application: title: DBRepo version: '@project.version@' spring: - datasource: - url: "jdbc:mariadb://${METADATA_HOST:metadata-db}:${METADATA_PORT:3306}/${METADATA_DB:dbrepo}${METADATA_JDBC_EXTRA_ARGS}" - driver-class-name: org.mariadb.jdbc.Driver - username: "${METADATA_USERNAME:root}" - password: "${METADATA_DB_PASSWORD:dbrepo}" jpa: show-sql: false open-in-view: false @@ -16,13 +11,7 @@ spring: jdbc: time_zone: UTC application: - name: metadata-service - rabbitmq: - host: "${BROKER_HOST:broker-service}" - virtual-host: "${BROKER_VIRTUALHOST:dbrepo}" - username: "${BROKER_USERNAME:admin}" - password: "${BROKER_PASSWORD:admin}" - port: ${BROKER_PORT:5672} + name: upload-service main: banner-mode: off management: @@ -47,38 +36,3 @@ logging: root: warn at.tuwien.: "${LOG_LEVEL:info}" org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -dbrepo: - repository-name: "${REPOSITORY_NAME:Database Repository}" - base-url: "${BASE_URL:http://localhost}" - admin-email: "${ADMIN_EMAIL:noreply@example.com}" - deleted-record: "${DELETED_RECORD:persistent}" - granularity: "${GRANULARITY:YYYY-MM-DDThh:mm:ssZ}" - exchangeName: "${BROKER_EXCHANGE_NAME:dbrepo}" - queueName: "${BROKER_QUEUE_NAME:dbrepo}" - connectionTimeout: "${SPARQL_CONNECTION_TIMEOUT:10000}" - s3: - accessKeyId: "${S3_ACCESS_KEY_ID:seaweedfsadmin}" - secretAccessKey: "${S3_SECRET_ACCESS_KEY:seaweedfsadmin}" - bucket: "${S3_BUCKET:dbrepo}" - system: - username: "${SYSTEM_USERNAME:admin}" - password: "${SYSTEM_PASSWORD:admin}" - endpoints: - analyseService: "${ANALYSE_SERVICE_ENDPOINT:http://analyse-service:8080}" - searchService: "${SEARCH_SERVICE_ENDPOINT:http://search-service:8080}" - dataService: "${DATA_SERVICE_ENDPOINT:http://data-service:8080}" - brokerService: "${BROKER_SERVICE_ENDPOINT:http://broker-service:15672}" - authService: "${AUTH_SERVICE_ENDPOINT:http://auth-service:8080}" - storageService: "${S3_ENDPOINT:http://storage-service:9000}" - rorService: "${ROR_ENDPOINT:https://api.ror.org}" - crossRefService: "${CROSSREF_ENDPOINT:http://data.crossref.org}" - pid: - base: "${BASE_URL:http://localhost}/pid/" - jwt: - public_key: "${JWT_PUBKEY:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB}" - keycloak: - username: "${AUTH_SERVICE_ADMIN:admin}" - password: "${AUTH_SERVICE_ADMIN_PASSWORD:admin}" - client: "${AUTH_SERVICE_CLIENT:dbrepo-client}" - clientSecret: "${AUTH_SERVICE_CLIENT_SECRET:MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}" - website: "${BASE_URL:http://localhost}" diff --git a/dbrepo-upload-service/src/test/resources/application.properties b/dbrepo-upload-service/src/test/resources/application.properties index 088fec498b6cd74aba161d18ec30ad500e18bd4c..cb41084578e2b476f1d550d6f890234cbea64180 100644 --- a/dbrepo-upload-service/src/test/resources/application.properties +++ b/dbrepo-upload-service/src/test/resources/application.properties @@ -4,15 +4,8 @@ spring.profiles.active=local,junit # disable discovery spring.cloud.discovery.enabled=false -# internal datasource -spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE;INIT=CREATE SCHEMA IF NOT EXISTS DBREPO;NON_KEYWORDS=value -spring.datasource.driverClassName=org.h2.Driver -spring.datasource.username=sa -spring.datasource.password=password -spring.jpa.database-platform=org.hibernate.dialect.H2Dialect -spring.sql.init.mode=always -spring.sql.init.schema-locations=classpath*:init/schema.sql -spring.jpa.hibernate.ddl-auto=create +# disable datasource +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration # logging logging.level.root=error diff --git a/helm/dbrepo/Chart.yaml b/helm/dbrepo/Chart.yaml index abb0c1821abb5ac68d0a92bc6eb7913cf0b5a409..89ba2eec9345f118411d76ffcfd72a655fd1e6e7 100644 --- a/helm/dbrepo/Chart.yaml +++ b/helm/dbrepo/Chart.yaml @@ -7,8 +7,8 @@ description: Helm Chart for installing DBRepo sources: - https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services type: application -version: "1.5.2" -appVersion: "1.5.2" +version: "1.5.3" +appVersion: "1.5.3" keywords: - dbrepo maintainers: diff --git a/helm/dbrepo/README.md b/helm/dbrepo/README.md index 759e67bf4362bb0b53b49d3d24e24db396e37ad9..8df445bfd5c024497272b41b240d9aa6651dd122 100644 --- a/helm/dbrepo/README.md +++ b/helm/dbrepo/README.md @@ -11,7 +11,7 @@ sample [ for your deployment and update the variables, especially `hostname`. ```bash -helm install my-release "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" --values ./values.yaml --version "1.5.2" +helm install my-release "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" --values ./values.yaml --version "1.5.3" ``` ## Prerequisites @@ -28,7 +28,7 @@ helm install my-release "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" To install the chart with the release name `my-release`: ```bash -helm install my-release "oci://oci://registry.datalab.tuwien.ac.at/dbrepo/helm" --values ./values.yaml --version "1.5.2" +helm install my-release "oci://oci://registry.datalab.tuwien.ac.at/dbrepo/helm" --values ./values.yaml --version "1.5.3" ``` The command deploys DBRepo on the Kubernetes cluster in the default configuration. The Parameters section lists the diff --git a/helm/dbrepo/values.yaml b/helm/dbrepo/values.yaml index 1a122d2fe3c43f8455ca95565de0ef51946fc0fe..afc18212eda3fb40a614549a21da07c46ea60ed9 100644 --- a/helm/dbrepo/values.yaml +++ b/helm/dbrepo/values.yaml @@ -369,7 +369,7 @@ analyseservice: enabled: true image: ## @skip analyseservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.5.2 + name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.5.3 ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param analyseservice.podSecurityContext.enabled Enable pods' Security Context @@ -430,7 +430,7 @@ metadataservice: enabled: true image: ## @skip metadataservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.5.2 + name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.5.3 ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param metadataservice.podSecurityContext.enabled Enable pods' Security Context @@ -527,7 +527,7 @@ dataservice: endpoint: http://data-service image: ## @skip dataservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.5.2 + name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.5.3 ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param dataservice.podSecurityContext.enabled Enable pods' Security Context @@ -613,7 +613,7 @@ searchservice: endpoint: http://search-service image: ## @skip searchservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.5.2 + name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.5.3 ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param searchservice.podSecurityContext.enabled Enable pods' Security Context @@ -660,7 +660,7 @@ searchservice: init: image: ## @skip searchservice.init.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.5.2 + name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.5.3 ## @param searchservice.init.resourcesPreset The container resource preset resourcesPreset: "nano" ## @param searchservice.init.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) @@ -721,7 +721,7 @@ storageservice: init: image: ## @skip storageservice.init.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.5.2 + name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.5.3 ## @param storageservice.init.resourcesPreset The container resource preset resourcesPreset: "nano" ## @param storageservice.init.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) @@ -827,7 +827,7 @@ ui: enabled: true image: ## @skip ui.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.5.2 + name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.5.3 ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param ui.podSecurityContext.enabled Enable pods' Security Context diff --git a/install.sh b/install.sh index 12a20e9868dce4d841b4110d29ab84253e2321c1..f45f92691542b3fb6e65b9730365a7f3c810c83f 100644 --- a/install.sh +++ b/install.sh @@ -1,7 +1,7 @@ #!/bin/bash # preset -VERSION="1.5.2" +VERSION="1.5.3" MIN_CPU=8 MIN_RAM=4 MIN_MAP_COUNT=262144 diff --git a/lib/python/pyproject.toml b/lib/python/pyproject.toml index e032c5edfe1310d307060efe6d178b4d4b29561c..dae17d38356c672186c4e9b066c929a39e483a61 100644 --- a/lib/python/pyproject.toml +++ b/lib/python/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "dbrepo" -version = "1.5.2" +version = "1.5.3" description = "DBRepo Python Library" keywords = [ "DBRepo", diff --git a/lib/python/setup.py b/lib/python/setup.py index 50be6c428aa5d487060590272518f7a9f30177a8..36bc076393305811348862f417ee4eef86fbfc5e 100644 --- a/lib/python/setup.py +++ b/lib/python/setup.py @@ -2,7 +2,7 @@ from distutils.core import setup setup(name="dbrepo", - version="1.5.2", + version="1.5.3", description="A library for communicating with DBRepo", url="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/", author="Martin Weise", diff --git a/sonar-project.properties b/sonar-project.properties index 54228d8d4c7fd97d1c704f55cb9dc064d9bca2f8..f109f63239360a5b7d37631ad7739d835cce75cd 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -2,7 +2,7 @@ sonar.projectKey=fair-data-austria-db-repository_fda-services_a57fa043-ab99-4cdd-a721-162d9a916d77 sonar.host.url=https://s39.datalab.tuwien.ac.at # project -sonar.projectVersion=1.5.2 +sonar.projectVersion=1.5.3 # general sonar.qualitygate.wait=true sonar.projectCreation.mainBranchName=master