"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
@@ -640,11 +651,24 @@ ocsp = ["certifi", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identit
snappy = ["python-snappy"]
zstd = ["zstandard"]
+[[package]]
+name = "python-dotenv"
+version = "0.21.1"
+description = "Read key-value pairs from a .env file and set them as environment variables"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "python-dotenv-0.21.1.tar.gz", hash = "sha256:1c93de8f636cde3ce377292818d0e440b6e45a82f215c3744979151fa8151c49"},
+ {file = "python_dotenv-0.21.1-py3-none-any.whl", hash = "sha256:41e12e0318bebc859fcc4d97d4db8d20ad21721a6aa5047dd59f090391cb549a"},
+]
+
+[package.extras]
+cli = ["click (>=5.0)"]
+
[[package]]
name = "pyyaml"
version = "6.0"
description = "YAML parser and emitter for Python"
-category = "main"
optional = false
python-versions = ">=3.6"
files = [
@@ -655,6 +679,13 @@ files = [
{file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"},
{file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"},
{file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"},
+ {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"},
+ {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"},
+ {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"},
+ {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"},
+ {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"},
+ {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"},
+ {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"},
{file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"},
{file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"},
{file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"},
@@ -687,7 +718,6 @@ files = [
name = "random2"
version = "1.0.1"
description = "Python 3 compatible Pytohn 2 `random` Module."
-category = "main"
optional = false
python-versions = "*"
files = [
@@ -698,7 +728,6 @@ files = [
name = "requests"
version = "2.28.2"
description = "Python HTTP for Humans."
-category = "main"
optional = false
python-versions = ">=3.7, <4"
files = [
@@ -720,7 +749,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
name = "setuptools"
version = "67.6.0"
description = "Easily download, build, install, upgrade, and uninstall Python packages"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
@@ -733,11 +761,40 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-g
testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
+[[package]]
+name = "sqlparse"
+version = "0.4.4"
+description = "A non-validating SQL parser."
+optional = false
+python-versions = ">=3.5"
+files = [
+ {file = "sqlparse-0.4.4-py3-none-any.whl", hash = "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3"},
+ {file = "sqlparse-0.4.4.tar.gz", hash = "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c"},
+]
+
+[package.extras]
+dev = ["build", "flake8"]
+doc = ["sphinx"]
+test = ["pytest", "pytest-cov"]
+
+[[package]]
+name = "sympy"
+version = "1.12"
+description = "Computer algebra system (CAS) in Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"},
+ {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"},
+]
+
+[package.dependencies]
+mpmath = ">=0.19"
+
[[package]]
name = "tomli"
version = "2.0.1"
description = "A lil' TOML parser"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
@@ -749,7 +806,6 @@ files = [
name = "tomlkit"
version = "0.11.6"
description = "Style preserving TOML library"
-category = "main"
optional = false
python-versions = ">=3.6"
files = [
@@ -761,7 +817,6 @@ files = [
name = "tqdm"
version = "4.65.0"
description = "Fast, Extensible Progress Meter"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
@@ -782,7 +837,6 @@ telegram = ["requests"]
name = "typing-extensions"
version = "4.5.0"
description = "Backported and Experimental Type Hints for Python 3.7+"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
@@ -794,7 +848,6 @@ files = [
name = "urllib3"
version = "1.26.14"
description = "HTTP library with thread-safe connection pooling, file post, and more."
-category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
files = [
@@ -811,7 +864,6 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
name = "virtualenv"
version = "20.20.0"
description = "Virtual Python Environment builder"
-category = "main"
optional = false
python-versions = ">=3.7"
files = [
@@ -832,7 +884,6 @@ test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess
name = "wrapt"
version = "1.15.0"
description = "Module for decorators, wrappers and monkey patching."
-category = "main"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
files = [
@@ -916,4 +967,4 @@ files = [
[metadata]
lock-version = "2.0"
python-versions = "^3.10"
-content-hash = "2c849c3d9fb82034c7396f4a939ca4a10e27d80b1398ac21848e06d09f6b9bbd"
+content-hash = "896555acb6e1719740f90d150e870937bf6712fc0d744b88a47f0c4b5c30739f"
diff --git a/modules/fbs-sql-checker/pyproject.toml b/modules/fbs-sql-checker/pyproject.toml
index 77800992b..f7814fa1f 100644
--- a/modules/fbs-sql-checker/pyproject.toml
+++ b/modules/fbs-sql-checker/pyproject.toml
@@ -16,6 +16,10 @@ random2 = "^1.0.1"
pre-commit = "^2.20.0"
pylint = "^2.15.3"
tqdm = "^4.64.1"
+sqlparse = "^0.4.2"
+psycopg2 = "^2.9.6"
+python-dotenv = "^0.21.0"
+sympy = "^1.12"
[tool.poetry.dev-dependencies]
From 1079ebb0ed1b2ad2f853c32afab8149b7a54b7cc Mon Sep 17 00:00:00 2001
From: Khaled
Date: Tue, 14 May 2024 04:32:08 +0200
Subject: [PATCH 09/31] improved duplicate flagging logic
---
.../__pycache__/json_creator.cpython-310.pyc | Bin 10291 -> 10343 bytes
modules/fbs-sql-checker/api/json_creator.py | 42 +++++++++---------
2 files changed, 21 insertions(+), 21 deletions(-)
diff --git a/modules/fbs-sql-checker/api/__pycache__/json_creator.cpython-310.pyc b/modules/fbs-sql-checker/api/__pycache__/json_creator.cpython-310.pyc
index 11051f7f6be6b1809f8cedc8a90e0bb724c776ad..8afd450a7fcf1787c0dae79c5f68e6bd39d22462 100644
GIT binary patch
delta 3275
zcma)9O>7&-72a7cm%AiIllmp~LsAldM9Wg#I6n?*H~xz(#ff6Wagr*r6`HeBC{d&|
zyL94Y7{+00Cr#2QnI3X5S}7?|
z;GF_F%uTMfw8k*^Z4HYLwO^9-hiCjGvTvzUTwbL0^-8%^barO-&j~p$!p2MFAL4c6
z4K3(XyToR^Ulhy>
z=Zh)!Ep8h%HESV%*6{9JF5Q_97BBLF-=b@8=1($u#C+@t}BKZv-kQe#zRk8=N(
z0U8rDu>XyN8+pg%e(4`=gt%`7#(2n!AczsrAPv0@8Q3_FxhjO`+vfRNrS6n#Rl6N@
ziuUS!eeJTv{-tGX%W0c#8nmKg&4_1%gQ>?qA`5zb-L{xh2(cLKdm&U`r!c;_R;*qX
z*MfIH&<=W!LF`n2|*|azuo@_#`H3s;=mP#W$12aTv49_1<)@)??Fq~(WM!j=$ct7p#
zuFv;-)IM
zFalf1(!qqXOd2^l#Isiv_BWoBa}3Ejno8A=3My|VPs317*65co^+?Cm$=y(bF!89I
zCh3Nm>5mp^vQ50WjLcUoID-FaGINh9iih$k@38obj+R9lg3>M0)2Df&kMF61(NH5eRr3P;Et|lcl&>vh4PxFAs#<}USF&=ao4K%{l
z4G!H+%DRLA?*Odl$R~+Ncwx`|0Fs3QwJa*4iSloqvMvfYj-p
zPGw!7o7!Wi+UPsoVHbrkFZ5NRXEyr0{irMfQjCvs=y7nL(jawncZVv=gVe*_UBX=h
zsn^S<%8v6eC3OXS9&|!NkKT9W6kPhYuUuVX4*_GR0cO}NQfvuq4q*nMZP2pq6sskR
zJ&d|107NVLqW&yOMd6Db4pF2Q!jhPY9TJzi6GFr?3G7uLscm)oV4K)(=W^SZ_+#wS
zR2dys5TvrQ%f4xGHPFoxuviyQcaPku$K0+*`3~23SbD%>1@rOSKj_cc#M}O*O0DRy
zGsu0*mc!!pie0O+ERF|QN9gj+BqKTinFu*N+3b
zRmhud0KwNym_!IeZ7B-i{X}fw)8=y^wDmf?8s}&`P;?w?ZQYS|HdFAkV=(GwQAImb
z1}S5k0J#urYgWZtV~5a8=2d3+UKHyH&m&wxcmd%m!ixwmA#g>>DXf81ZfXkI|JqMR
zti(@~jQCZ2J1VmtK}&f#W<@FSTDYT8chlRDYU^tfTEZQ3t_Xf*yll654&1I4OpZfC3Ybt?;?;&&~QOqa^lHc3jRJkpW7kxVlsb5mmV(*o*z4X4W03$P<}EpY&7y-vkWr4lx!5?1_H*$
fatPlnA=wFWD}OXLq%@6t4a2y{h#OVoU^wt!g__s`
delta 3095
zcma)8U5p!76`ni(o3S0o-u3R<-u2IV{j-ywCA1}p+C+Gpw40wQO_ZiBE~#<$&MwY+
z?e(2;+D-4o32uRs7Dc)bND#p;MXjoW3R*#5ctGj{5<$FFyjY^*0rB&K5JEx%AvovS
zb-OMPS!q9?^WAgKJ@?!*XXa1mcg}~Jd-nJh_%rz8itFj0gajco;`?NUWOj7*cSQWn
zwLlUg?JiDC^OAHwwr$7&K
zox8hkXNJ4Brp1rkZ;|vHmpo)=#rq3FN}{N}ME)+`&|X#5usEczkw?W{J=u8^GUCdX
zvaL8OS1E}rj>{$xLZvDvHL^`$L-(rUcx)GhCyv*4b8nZNR4x}CAILuHno@vKfk`?V
z2L@t5DqMqKzwO!ba-F&%RX^gkNhQ+r(1T_HrLID%?RqQN{t$R76DoO
z)&IcJvY(oD(>5#3hG_(u0X+LG!alV2tZyzi>t$c7ZL*qam36yW>D!Ah1X53w&``o6
zT1S|<-n?d3XnUhxTZV0|yFgnR0F7v5jJREzD+s@+#ncc{Z>s+eYGLC3FS{V#3naR=^ESyB{c9lTsWWRu{DLA
z=F?6Ltb$PKcq=Pem0gzJ!9Fj&_fYWt*c&Y4cT{$KRS`FWMkfT`Q+x_;JjiokwU>sW
z?0BELljk#Ve|c;*c@bScNh2fnW4r8=(td1U{~fR&AF+?_vQKrSLv-M<0}c}-4wJha
z($ao%V1Eznr$+3@L?~t1T?%-}aD-GPjh+P`eyfo2(8R<+6&ZDw<&?0=6Ymm9h
zJ_Fhq@1Ia*hd~?X{Zqoz23mAbO_iPJK}y;R_?)x-;!ODP(g_?Zu3BS-odk(JhM*%n
z4shL_vrN0E(HhLS#
zB#(>VkHy8kNG@Ii@@=)JE*$C+t3TS1Vv9l>d;TCr(L|8s>QIs@&Omk*;1o<+wkF<<
z%q+0`bU8hA>D;f&8R-Js8TwNn{TTr{*?XRqdb4V?CCumy!dZZ_zr8_WD&weUlgOSz
zNCEU*)y8ITcB9HHacw*kp2r3G8h8+;gJOGpeByH`9!5Bda0I~+zZu{5;=6)9A==TL
z_Yo8?itk0A_2MP4W8y#21zFa9&18|Xu<}#*w+@Mu6Zufom4O$7oA}|ikWqKq6NHeg
zcwzEMazgxaGW~E4Obs6!NlLz|Xq4Jd039xQuWGz(_GS
z$}fs1GqEx3kFp=jQ?aX8>L$yH&CEV>Tl^sNF2#g;p5?k(WyW6lxxl`HuCi>h8V{p-
z13`AhF_eaP)pJ4CY!kWb2pqvdC=Fq8=e^kv$we$!SzB(lnPr})pBM#Qw0s#?{Wa^O
zk0AC6vR_5`8p78RK2cs&Ulo6zJFxZ*5Dk@mTxzeZGK-?gZG>+k#1PT|Mz~*oY=^Q2
zpEq{JYSsJCiR>8JA{%Hf`(&g=60$p9!{yQt2l-n^mT@b2{F^9YNH{ZIo_r1r(!aG55)x!ad2zdtCVBBr
zVTYU%mEu{i^mtMHxR_mf32h%mxPXvFXduiX;Df|w5pE%1ZY+;b+6{{$K7SlOn>yMN
PP17FIVp>Bx6!iTMU?jzb
diff --git a/modules/fbs-sql-checker/api/json_creator.py b/modules/fbs-sql-checker/api/json_creator.py
index 3277a6597..6b8dc4dfd 100644
--- a/modules/fbs-sql-checker/api/json_creator.py
+++ b/modules/fbs-sql-checker/api/json_creator.py
@@ -93,7 +93,7 @@ def parse_single_stat_upload_db(data, client):
insert_tables(mydb, data, my_uuid, client)
# check and remove duplicates
- #remove_duplicates(client, task_nr)
+ flag_duplicates(client, task_nr)
# Check if it is a new solution and characteristics are right
(
@@ -152,14 +152,16 @@ def parse_single_stat_upload_db(data, client):
mycollection.insert_one(record)
-# Idea of a function to remove duplicate queries from the database
-def remove_duplicates(client, task_nr):
+# Idea of a function to flag duplicate queries from the database
+def flag_duplicates(client, task_nr):
mydb = client.get_default_database()
mycol = mydb["Solutions"]
+ # set all queries to not duplicate
+ mycol.update_many({"taskNumber": task_nr}, {"$set": {"duplicate": False}})
queries = list(mycol.find({"taskNumber": task_nr}))
- # list to keep track of items to delete to avoid modifying the collection during iteration
- to_delete = []
+ # list to keep track of queries to flag
+ duplicates = []
# Compare each document with every other document
n = len(queries)
@@ -169,11 +171,11 @@ def remove_duplicates(client, task_nr):
query2 = queries[j]
if d.get_distance(query1["statement"], query2["statement"]) == 0:
- to_delete.append(query2["_id"])
+ duplicates.append(query2["_id"])
- # Remove duplicates based on gathered IDs
- for id in set(to_delete):
- mycol.delete_one({"_id": id})
+ # Flag duplicates based on gathered IDs
+ for id in set(duplicates):
+ mycol.update_one({"_id": id}, {"$set": {"duplicate": True}}, upsert=True)
@@ -212,19 +214,17 @@ def check_solution_chars(
# For every solution for given task
for x in mycol.find({"taskNumber": task_nr}):
# Extract Tables, Attributes etc. (cut out for better overview)
- # compare the distance between the solution and the submission
- distance = d.get_distance(x["statement"], data["submission"])
+ # compare the distance between the solution and the submission only if it is not a duplicate
+ if not x.get("duplicate", False):
+ distance = d.get_distance(x["statement"], data["submission"])
- # insert distance to the solution
- mycol.update_one({"_id": x["_id"]}, {"$set": {"distance": distance}}, upsert=True)
-
- # check for min distance and use the corresponding solution
- if distance < min_distance:
- min_distance = distance
- closest_solution = x["id"] # choose the id of solution if it has the lowest distance
- elif distance == min_distance:
- # insert duplicate attribute and set to True if the distance is the same as the previous one
- mycol.update_one({"id": x["id"]}, {"$set": {"duplicate": True}}, upsert=True)
+ # insert distance to the solution
+ mycol.update_one({"_id": x["_id"]}, {"$set": {"distance": distance}}, upsert=True)
+
+ # check for min distance and use the corresponding solution
+ if distance < min_distance:
+ min_distance = distance
+ closest_solution = x["id"] # choose the id of solution if it has the lowest distance
if closest_solution:
(
From e5eb88334c6a9986138d2005cc27292f6053455e Mon Sep 17 00:00:00 2001
From: Jonas Kuche
Date: Tue, 28 May 2024 10:00:16 +0200
Subject: [PATCH 10/31] chore(sql-checker): remove __pycache__
---
.../__pycache__/attribute_check.cpython-310.pyc | Bin 4728 -> 0 bytes
.../attribute_distance.cpython-310.pyc | Bin 2501 -> 0 bytes
.../api/__pycache__/constants.cpython-310.pyc | Bin 1247 -> 0 bytes
.../__pycache__/db_connection.cpython-310.pyc | Bin 2045 -> 0 bytes
.../__pycache__/distance_calc.cpython-310.pyc | Bin 1284 -> 0 bytes
.../equation_checker.cpython-310.pyc | Bin 727 -> 0 bytes
.../api/__pycache__/format.cpython-310.pyc | Bin 1619 -> 0 bytes
.../api/__pycache__/formatting.cpython-310.pyc | Bin 762 -> 0 bytes
.../__pycache__/json_creator.cpython-310.pyc | Bin 10343 -> 0 bytes
.../__pycache__/mask_aliases.cpython-310.pyc | Bin 4451 -> 0 bytes
.../api/__pycache__/model.cpython-310.pyc | Bin 1829 -> 0 bytes
.../api/__pycache__/parser.cpython-310.pyc | Bin 705 -> 0 bytes
.../pro_attribute_checker.cpython-310.pyc | Bin 5180 -> 0 bytes
.../api/__pycache__/result_log.cpython-310.pyc | Bin 723 -> 0 bytes
.../sel_attribute_checker.cpython-310.pyc | Bin 5403 -> 0 bytes
.../api/__pycache__/table_check.cpython-310.pyc | Bin 6936 -> 0 bytes
.../__pycache__/table_checker.cpython-310.pyc | Bin 3345 -> 0 bytes
.../__pycache__/table_distance.cpython-310.pyc | Bin 3248 -> 0 bytes
18 files changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 modules/fbs-sql-checker/api/__pycache__/attribute_check.cpython-310.pyc
delete mode 100644 modules/fbs-sql-checker/api/__pycache__/attribute_distance.cpython-310.pyc
delete mode 100644 modules/fbs-sql-checker/api/__pycache__/constants.cpython-310.pyc
delete mode 100644 modules/fbs-sql-checker/api/__pycache__/db_connection.cpython-310.pyc
delete mode 100644 modules/fbs-sql-checker/api/__pycache__/distance_calc.cpython-310.pyc
delete mode 100644 modules/fbs-sql-checker/api/__pycache__/equation_checker.cpython-310.pyc
delete mode 100644 modules/fbs-sql-checker/api/__pycache__/format.cpython-310.pyc
delete mode 100644 modules/fbs-sql-checker/api/__pycache__/formatting.cpython-310.pyc
delete mode 100644 modules/fbs-sql-checker/api/__pycache__/json_creator.cpython-310.pyc
delete mode 100644 modules/fbs-sql-checker/api/__pycache__/mask_aliases.cpython-310.pyc
delete mode 100644 modules/fbs-sql-checker/api/__pycache__/model.cpython-310.pyc
delete mode 100644 modules/fbs-sql-checker/api/__pycache__/parser.cpython-310.pyc
delete mode 100644 modules/fbs-sql-checker/api/__pycache__/pro_attribute_checker.cpython-310.pyc
delete mode 100644 modules/fbs-sql-checker/api/__pycache__/result_log.cpython-310.pyc
delete mode 100644 modules/fbs-sql-checker/api/__pycache__/sel_attribute_checker.cpython-310.pyc
delete mode 100644 modules/fbs-sql-checker/api/__pycache__/table_check.cpython-310.pyc
delete mode 100644 modules/fbs-sql-checker/api/__pycache__/table_checker.cpython-310.pyc
delete mode 100644 modules/fbs-sql-checker/api/__pycache__/table_distance.cpython-310.pyc
diff --git a/modules/fbs-sql-checker/api/__pycache__/attribute_check.cpython-310.pyc b/modules/fbs-sql-checker/api/__pycache__/attribute_check.cpython-310.pyc
deleted file mode 100644
index 9f5c742f6b0a616d7c51e745bbbccb36163e4407..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 4728
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
BJ?j7f
diff --git a/modules/fbs-sql-checker/api/__pycache__/constants.cpython-310.pyc b/modules/fbs-sql-checker/api/__pycache__/constants.cpython-310.pyc
deleted file mode 100644
index 9fe622e47fd3e5c0eafefdee0f73613b3bd8a5c0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1247
zcmah{-E!JS7zHGO4A`-gIF9q@jC%nxfy}hM%A|JrkueD%g5<_tmQbNxKt)JYyBJ&J
z2k3M3uCKJWy=h*dS6zWT<4!Lsjn4O-v)}IdcD3H-W;(_nss8=wFEJMTGbHz)1Sdc8
zkNm~~#Xt&3EBgD=qY%L_Q5`S2A-kk;5m8$UZ9uY
zC3*#3p#wdpyk;`83AJ5|GI8X4GbT}U=wK$9j%^Z_@LVP>C)me4(cKnY5VCvCkyOTk?=}usfy`CR*5b
zm^5-ckB`k)V=2pXudq*9hT1bcpx%IBOGyQ3+jV*8zj(GAY&dvC*J;|f$CD`E7%dzp
zs^Gnj)@jx?>B2YH158{k@CFi-KvIB*`BLFTfrqz|kX!NG9nHgKK?$-wi1JDS7LVZD
ze(((>N1=Y3OU9gffRzMKwOFYMY78#z&P2ZOvebMjJ@#1vg?zU2Uq|EVGV-YOAJ$
z^aric9vGJ$RR@`s@t~{L)eErIDjR15^`aB;P4&~Ds#3tD-d{mR@h6b>1{UMmM_WRb#LwTIB=pGa{#2Gu&y1cLU_6R$pa*
z#Qg90*{Q5&otYI>x-W*a2M;N1_X-&xup?C&o9$Gk-3XO?!QzTF&oPD>jJ|_vbQMyo*qUx8QfY^E;-Jqp9ZD{=I|!tFo(QJtAQ7rk
z1dZGclflLpIu|B!%tIy2Z3Tr!yN3@Hw$V98=Y&Hc6QK+3Q1C$UHtXn8dyou<(ZR?G
zlYYOaDwcKwrP@&su2DGHyqCmc7Pk2liF44sSzrFLwGKCvEhV-#gVqX{TPhi}lxlT3
zXPqG2lDkszeyg9bVZ>#t+mYAgc62S=b|qKC0bFek4v`)-
z6qBRRc}pA@7pC89TAcfb7R3cv6cT6-i+OSmYDU@}5EM$$1h1f{ms(^@#umd0Gm?@E
zp#2Ro3r6&4WWTh>6i6c}I4DNjlp!F-sf{i#*Q-m-s@Gh)bHD1X-t}s0O|SaxYNOfk
z_Ltz8(M9j-j<;HCR==s%Kl7H?YK>-n3C7-jV5ZNvhjDLv$lE*KdTsU5dKH#eDz^ac
zJdcNcE`SDYg_}a>_zn+;idSrL7A!O1HSTE(Xz>dGVq1oyH&7WB)8@QcXF&THsx&@3
zN3K{UO#jWarvQSuJ_hJ77)${I|HTZaJsp32X|PO(C;!SotOzJKI;b3mG*twSB|B#-D54+5ZoU#@9zPjq3gCa?|_NyIWs-
z;E9W{WK{H?+^g2B-j4T`_Xgh@l~!wz2%3hoHE&cle0YzS?ypxH-qjJQ+}by}ppw&8
z#A9uXAl~5G=_aBdC~fs(B`(9f_y8K;?Q#`vCNZxRPjE&%Jtf75W4FB~n0
zfHFz!BxOMqX$uY$^DqI~*Un(i;F+$y26{gSEVRukll+b&PM1%exCoQ71Pvr9;*xpG
z1ro#!P*lzcqt|&zcTxqhk{XA;GyO}6%zsHDvs1OR!Og$xIGu|bFg?!XS;otvddj5P
q|HQqr8=7>W-Nk9{y=~lBegusRH!FcVP~w1F9Dc6l&bsdWx&HySw%|Dc
diff --git a/modules/fbs-sql-checker/api/__pycache__/distance_calc.cpython-310.pyc b/modules/fbs-sql-checker/api/__pycache__/distance_calc.cpython-310.pyc
deleted file mode 100644
index daefd1894ef9f3d5d591f68f1d71d67ef43e8aad..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1284
zcmbtTPjAyO6!)JbP18_Bfo)t+uay`lP7@#m>^dP$W5S9QWwAR-yQQ;Tl}0H-0*-tF
zG^ssu;ZyJ_eC4#SfHdIQ=?ZsVhZkF_}7N4>@coP+jqV#SJ@AZ-=T
zV5x7w%EuZlaD^6RiI#XyoP}2w)wCiX@Z1AQLHgQT_?1`rOEM31uxPCGh7K1^4ySxU
zoKzS%J@=OwBj@+3plWQ|n14>Kx3&+_KJt)`W-l?ChZvQyZtC?Mhk5
z?up3ML=H}myL^@7;x|w)Hn`8?ej!gXow`ztKPsj|nm8S2Qi+wbnQ5KouSGs&9r0Gn
zEY~Tx^ksvC!*u
z7MJQSFoN6gg(So=jqw)QAQ5fj$ok%sU-C9=k!@f(26jarC~H(RFv^ZbZvc-RbMl$Y
zF`yc7xx}2_L2u}s9HNRi^m(&;fIbT7Yipl-75#$F0r6`D(s%Fz90Eae2=wfjN5FI-oO-uKq2yx@aB|~
zL)asK$yZMN1r8N62`$CZJioC$p2-^*z1|MssE(f{k1T+n%V5UZ
zna`}4$JRHP*|8lvI6E<$g75yqlQ4-W@_IN(JhTy-`iKy-HP`T+q45SbY{S;pjgKDs
z_SYV+SdG=#8-8ia2Ms@iDV$*yQ?Nlh^BsV&Dy8rV#-Ki&50}Uh9v7c<>JCZJu_&z||1azNt
z5qvIt#QOv!LLVtlhyMJrbo^
diff --git a/modules/fbs-sql-checker/api/__pycache__/format.cpython-310.pyc b/modules/fbs-sql-checker/api/__pycache__/format.cpython-310.pyc
deleted file mode 100644
index 441fe7fa6369da1ee7dac5d7d1effe1022b9b036..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1619
zcmZ`(U2oeq6eTIiR{WI@WJOnO*xF&;^w2#F!ybmVn2~y!u}s4;TUgh9c6nZ22Q3
z(>8_kGVEUz8|=sYCBE)yf58vK?xo})NmBumcz7xC@Z59nv|g_exc>h3yME#k@(+Tm
zmjmEOxYZx<;DpnR9OZ9%L@j1V4rjvcGwyKrPxr_xkjG1aN`UCFJoF)6=04196!8sS
z0aPhamDd1O3smO~K(zvG@-0AhPCF#n{ug+V(0C~q6P-{*#f4Pi2xJd#^*uZ^Sy0V}
zjwVBQ$vci7r*{cbAl{qW$hwb$&lOi77YCIjQB(_`Z)Ez?=xNCpIqC&f$g#(3jcCxZ(j
zH(_!W?)?z`ri4_HmZL!&JrioAr?W`ws4oORj+2o(Q(BCp@syutLPh;!^+=s$kCK5%
zMnXpMERFh834i@&c4lh%uoq`(tV(!zOz9S@P?zp9m&$E`*OWrlT)3@L4`47S3!>?e
zEvejuv4dkymu%s#RgtJ};F(&lmrN%*PA96@lVzAR{X<
z2KLPPV+&Vr7HoN{bUH~iPFmJAx&wse9l+PfqL7zl9|D+@AtV-PvL*NtNK&4YrQkro
zm}qc{8%q3aMZaFrAaIQLD$Y)Y+=V$)e<^fNia6^{;;{%=o~@0Xnil*f=|({s>@bce
z962id`2&>q6Bt}$jPhO@@h*V15eutmeD?FNe-D^GRUP9uIT4BodLBOymim*
zV$auuR0}l&BYwHwvPR_>w{3ZurWX)}K0)8XrtoI($Y0K!ydv_Rt%n;Cq?LCITx-`o
zEY?9AT*uIYSY2<~{UByjWeI^jXrxX;_av_5>4YH^e-9f<%Bfs)*z_o(Ys{%c^J
zd<7Fh!=}ji&>TQ$CCmmCr_%96t70!`N4EZLT|tXF$)I;(>rDG8m{{cCvRE7Wm
diff --git a/modules/fbs-sql-checker/api/__pycache__/formatting.cpython-310.pyc b/modules/fbs-sql-checker/api/__pycache__/formatting.cpython-310.pyc
deleted file mode 100644
index 0f20b4e68c39634848a7c8bf59f99b2a8d3768de..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 762
zcmaJ<%}&BV5Z?aK77Eem$&+Ui@d1o6CK`?;3SP)2q;wW(3KV8n6B2IvGQ3i+K7uz-
z&TNArF|eDRneOakYbXw`^oOTWFIk
zQdN4|;MOU9NKCR77}CX`=k!LtXoXrD%%_QbR5~}sQW_&CO2IfubG_C^&E>p+x0%v%
zGS(fvnsw5tN^^xWS!Qxl;5;!VTfAN`*JVA^BPvB-J~tSUX*fPjtW$W92{J8YjoL0U
zJ?b<|4c2&@o2^X5nUG3wGUja-9h+qSK{J>Y>68L+HsW1i!191cqWZnkpI|W`bSvaT
zh4>7sY?(wAlapiRutiyh544)8)Ep~d#j>X^=n`_H$i)tF*?|wk0zu(;eGEM&o$RsE
tczyYYe@;=aU9-<&g+r!e%OdCY)V8`?$)nrq54huJ(yV#pMIp~-@C$X2iWL9=
diff --git a/modules/fbs-sql-checker/api/__pycache__/json_creator.cpython-310.pyc b/modules/fbs-sql-checker/api/__pycache__/json_creator.cpython-310.pyc
deleted file mode 100644
index 8afd450a7fcf1787c0dae79c5f68e6bd39d22462..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 10343
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