diff --git a/app/getter.py b/app/getter.py index 3693e14d7de428db889eb6cff80361c25a755669..f6ffb03aa67d3b55cd42a311a1989283b31bf89a 100644 --- a/app/getter.py +++ b/app/getter.py @@ -1,5 +1,6 @@ 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