Skip to content
Snippets Groups Projects
Commit 7af4015a authored by erichard's avatar erichard
Browse files

implémentation de labelsTower sous forme de fonctions python (!=@route)

get_elements(str,str,str)->List[Dict[str,str]]
get_labels(List[Dict[str,str]])->List[Dict[str,str]]
get_ids(List[Dict[str,str]])->str
send_request_to_db(str)->List[Dict[str,str]]
parent fef05f68
No related branches found
No related tags found
2 merge requests!61Packager labelstower,!60WIP: Implement sqlalchemy
import json
from app.sql_request import send_sql
from typing import Dict, List
def get_elements(id_mandatory_labels, id_forbiden_labels, number_of_mandatory_labels):
"""
......@@ -10,29 +11,143 @@ def get_elements(id_mandatory_labels, id_forbiden_labels, number_of_mandatory_la
:return: list
"""
if(id_mandatory_labels):
elements = send_sql('SELECT ELEMENT.id, element_name FROM ELEMENT INNER JOIN ELEMENT_LABEL ON ELEMENT.id=ELEMENT_LABEL.id_element INNER JOIN LABEL ON ELEMENT_LABEL.id_label=LABEL.id WHERE id_label IN (' + id_mandatory_labels + ") AND id_element NOT IN (SELECT id_element FROM ELEMENT INNER JOIN ELEMENT_LABEL ON ELEMENT.id=ELEMENT_LABEL.id_element INNER JOIN LABEL ON ELEMENT_LABEL.id_label=LABEL.id WHERE id_label IN (" + id_forbiden_labels + ")) GROUP BY id_element HAVING COUNT(*) = " + str(number_of_mandatory_labels) + " Order BY element_name")
print("avec")
request = '''
SELECT
ELEMENT.id
, element_name
FROM
ELEMENT
INNER JOIN
ELEMENT_LABEL
ON ELEMENT.id=ELEMENT_LABEL.id_element
INNER JOIN
LABEL
ON ELEMENT_LABEL.id_label=LABEL.id
WHERE
id_label IN ({})
AND
id_element NOT IN (
SELECT
id_element
FROM
ELEMENT
INNER JOIN
ELEMENT_LABEL
ON ELEMENT.id=ELEMENT_LABEL.id_element
INNER JOIN
LABEL
ON ELEMENT_LABEL.id_label=LABEL.id
WHERE
id_label IN ({}))
GROUP BY id_element
HAVING COUNT(*) = {}
Order BY element_name
'''.format(id_mandatory_labels, id_forbiden_labels, number_of_mandatory_labels)
elements = send_request_to_db(request)
else:
elements = send_sql('SELECT DISTINCT ELEMENT.id, element_name FROM ELEMENT INNER JOIN ELEMENT_LABEL ON ELEMENT.id = ELEMENT_LABEL.id_element INNER JOIN label ON ELEMENT_LABEL.id_label=label.id WHERE element_name NOT IN ( SELECT element_name FROM ELEMENT INNER JOIN ELEMENT_LABEL ON ELEMENT.id = ELEMENT_LABEL.id_element INNER JOIN label ON ELEMENT_LABEL.id_label = label.id WHERE id_label IN (' + id_forbiden_labels + ') ) ORDER BY element_name ASC')
print("sans")
request = '''
SELECT
DISTINCT ELEMENT.id
, element_name
FROM
ELEMENT
INNER JOIN
ELEMENT_LABEL
ON ELEMENT.id = ELEMENT_LABEL.id_element
INNER JOIN
label
ON ELEMENT_LABEL.id_label=label.id
WHERE
element_name NOT IN (
SELECT
element_name
FROM
ELEMENT
INNER JOIN
ELEMENT_LABEL
ON ELEMENT.id = ELEMENT_LABEL.id_element
INNER JOIN
label
ON ELEMENT_LABEL.id_label = label.id
WHERE id_label IN ({}) )
ORDER BY element_name ASC
'''.format(id_forbiden_labels)
elements = send_request_to_db(request)
return elements
#get_labels(json.loads(get_elements(id_mandatory_labels, id_forbiden_labels, number_of_mandatory_labels)))
def get_labels(elements):
def get_labels(elements: List[Dict[int, str]]):
"""
Return a set of new labels to continue your selection with it
:param elements: list
:return: list
:param elements: list[Dict[str,str]]
:return: list[Dict[str,str]]
"""
id_selected_elements = get_ids(elements)
id_selected_elements: str = get_ids(elements)
print(id_selected_elements)
print(type(id_selected_elements))
number_of_selected_elements = len(elements)
discriminating_labels = send_sql('SELECT LABEL.id, label_name FROM ELEMENT INNER JOIN ELEMENT_LABEL ON ELEMENT.id=ELEMENT_LABEL.id_element INNER JOIN LABEL ON ELEMENT_LABEL.id_label=LABEL.id WHERE id_element IN (' + id_selected_elements + ') GROUP BY id_label HAVING COUNT(*) < ' + number_of_selected_elements)
print(number_of_selected_elements)
print(type(number_of_selected_elements))
request = '''
SELECT
LABEL.id
, label_name
FROM
ELEMENT
INNER JOIN
ELEMENT_LABEL
ON ELEMENT.id=ELEMENT_LABEL.id_element
INNER JOIN
LABEL
ON ELEMENT_LABEL.id_label=LABEL.id
WHERE
id_element IN ({})
GROUP BY id_label
HAVING COUNT(*) < {}
'''.format(id_selected_elements,number_of_selected_elements)
discriminating_labels = send_request_to_db(request)
id_discriminating_labels = get_ids(discriminating_labels)
labels = send_sql('SELECT * FROM (SELECT label_name, id FROM LABEL WHERE LABEL.id IN(' + id_discriminating_labels + ')) WHERE id NOT IN (SELECT B.id AS id_fils FROM (SELECT * FROM LABEL WHERE id IN (' + id_discriminating_labels + ')) AS A, LABEL AS B WHERE A.id=B.father_id)')
request = '''
SELECT
*
FROM (
SELECT
label_name
, id
FROM
LABEL
WHERE
LABEL.id IN({})
)
WHERE
id NOT IN (
SELECT
B.id AS id_fils
FROM (
SELECT
*
FROM
LABEL
WHERE
id IN ({})
) AS A,
LABEL AS B
WHERE
A.id=B.father_id
)
'''.format(id_discriminating_labels, id_discriminating_labels)
labels = send_request_to_db(request)
return labels
def get_ids(objects):
"""
Return all ids of the object's set
:param objects: list
:param objects: list[Dict[str,str]]
:param attribut: str
:return: str
"""
......@@ -42,5 +157,16 @@ def get_ids(objects):
while i<len(objects)-1:
objects_ids += str(objects[i]["id"]) + ","
i +=1
objects_ids += str(objects[i]["id"])
return objects_ids
\ No newline at end of file
if(len(objects)!=0):
objects_ids += str(objects[i]["id"])
return objects_ids
def send_request_to_db(request):
import sqlite3
l = []
with sqlite3.connect('app/labelsTower.db') as connexion:
cursor = connexion.cursor()
response = cursor.execute(request)
for row in response:
l.append({"id": row[0], "name": row[1]})
return l
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment