def ReturnSelectExecution(sql_query, query_var):
    """
    Voert een query uit, met de meegegeven variabelen.
    (Gaat uit van een 'SELECT' query waarbij data terug moet worden gehaald.)
    Geeft de geselecteerde waardes terug.
    """
    rdbcon, rdbcur = conrdb()
    rdbcur.execute(sql_query, query_var)
    returnvalue = []
    try:
        returnvalue = rdbcur.fetchone()[0]
        rdbcur.close()
        rdbcon.close()
    except TypeError:
        pass
    return returnvalue
Exemplo n.º 2
0
def return_selection(sql_query, query_var):
    """
        Voert een query uit, met de meegegeven variabelen.
        (Gaat uit van een 'SELECT' query waarbij data terug moet worden gehaald.)
        Geeft de geselecteerde waardes terug.

        :param sql_query: str: query die uitgevoerd moet worden
        :param query_var: tuple: variabelen die nodig zijn om de query uit te voeren
        :returns: opgevraagde element
    """
    rdbcon, rdbcur = conrdb()
    rdbcur.execute(sql_query, query_var)
    returnvalue = []
    try:
        returnvalue = rdbcur.fetchone()[0]
        rdbcur.close()
        rdbcon.close()
    except TypeError:
        pass
    return returnvalue
Exemplo n.º 3
0
from time import perf_counter
from collections import Counter
from rdbconnection2 import conrdb

rdbcon, rdbcur = conrdb()


class Pactum:
    """
        De similar recommendation class ofwel pactum. Hierin zitten alle 
        functies die je nodig hebt om met een instance van de class
        similar recommendations te maken.
    """
    def __init__(self, conn):
        """
            De initiate functie deze word gecalled met een postgresql open connection
            deze variabele word aan de instance toegewezen met "self" en zo kan elke functie
            die self als parameter heeft de connectie gebruiken
        """
        self.conn = conn

    def get_n_recommended(self, product_id, n):
        """
            Deze functie returned met een gegeven product-id een n aantal recommendations
        """
        res = self.recommend_products(
            product_id
        )  # vraag de response van de functie recommend_products deze returned een aantal lists in een dict
        products = res["occurences"].most_common(
            n
        )  # pak n aantal recommendations van de opgetelde lijst van de recomend_products functie
    def get(self, profileid, count, type_rec, shopping_list, pagecat,
            huidige_klik_events, productid):
        """ This function represents the handler for GET requests coming in
        through the API. It currently returns a random sample of products.

        :param type_rec: str : is één van de keys uit 'recommendationtypes' huw.py
        :param shopping_list: str: str met daarin de boodschappenlijst """

        if type_rec == "popular":
            pagecat = ast.literal_eval(pagecat)
            cat = pagecat[0].replace("-", " ")
            cat = cat.replace(" en ", " & ")
            cat = cat.replace("make up", "make-up")
            huidige_klik_events = ast.literal_eval(huidige_klik_events)

            prodids = popularrec.return_recommended_products(
                profileid, cat, huidige_klik_events)
            prodids = [
                niet_leeg_element for niet_leeg_element in prodids
                if niet_leeg_element
            ]

        elif type_rec == "similar":
            pact = pactum.Pactum(personalrec.rdbcon)
            products = pact.get_n_recommended(productid, count)
            if products:
                prodids = [p[0] for p in products]
            else:
                prodids = []  # todo alternative/fallback

        elif type_rec == "combination":
            mogelijke_genders = ['Man', 'Vrouw']
            shopping_l = ast.literal_eval(shopping_list)
            genders_in_shopping_list = []
            uitvoerings_check = 0
            for item in shopping_l:
                gender1 = ReturnSelectExecution(
                    """SELECT gender from product Where product_id = %s""",
                    [item[0]])
                genders_in_shopping_list.append(gender1)
            if 'Man' in genders_in_shopping_list:
                uitvoerings_check += 1
            if 'Vrouw' in genders_in_shopping_list:
                uitvoerings_check += 1
            if uitvoerings_check == 2:
                hoeveelheid_man = 0
                hoeveelheid_vrouw = 0
                gender_count_list = [hoeveelheid_man, hoeveelheid_vrouw]
                prod_man_list = []
                prod_vrouw_list = []
                bruikbare_producten = []
                prodids = []
                for i in shopping_l:
                    product_data = ReturnSelectExecution(
                        "SELECT array[gender, sub_category] FROM product WHERE product_id = %s",
                        [i[0]])
                    if product_data[0] in mogelijke_genders:
                        if product_data[0] == 'Man':
                            hoeveelheid_man += 1
                            prod_man_list.append(i[0])
                        if product_data[0] == 'Vrouw':
                            hoeveelheid_vrouw += 1
                            prod_vrouw_list.append(i[0])
                if hoeveelheid_vrouw >= hoeveelheid_man:
                    product = prod_vrouw_list[0]
                if hoeveelheid_man > hoeveelheid_vrouw:
                    product = prod_man_list[0]

                gender = product_data[0]
                sub_category = product_data[1]
                index = mogelijke_genders.index(gender)
                for i in range(4):
                    output = ReturnSelectExecution(
                        "SELECT product_id FROM product WHERE sub_category=%s AND gender=%s ORDER BY RANDOM() LIMIT 1",
                        [sub_category, mogelijke_genders[index - 1]])
                    prodids.append(output)
            else:
                randcursor = database.products.aggregate([{
                    '$sample': {
                        'size': count
                    }
                }])
                prodids = list(map(lambda x: x['_id'], list(randcursor)))
        elif type_rec == "personal":
            prodids = personalrec.giveRecommendation(profileid)
        elif type_rec == "behaviour":
            rdbcon, rdbcur = conrdb()
            huidige_klik_events = ast.literal_eval(huidige_klik_events)
            fyp_list = [
                p for product in huidige_klik_events for p in pactum.Pactum(
                    rdbcon).recommend_products(product)["products"]
            ]
            prodids = [prod[0] for prod in Counter(fyp_list).most_common(4)]
        else:
            randcursor = database.products.aggregate([{
                '$sample': {
                    'size': count
                }
            }])
            prodids = list(map(lambda x: x['_id'], list(randcursor)))
        return prodids, 200