Esempio n. 1
0
class TestController():

    def __init__(self, sql = 'show schemas;', breakpoint=None):
        """
        Initialize a session and pass a dummy socket env
        """
        self.request = TestSocket()
        self.session = SessionController()
        self.session.newTransaction(sql_query=sql, breakpoint=breakpoint)

    @staticmethod
    def loadModule(module_class, sql = 'show schemas;', breakpoint=None):
        """
        return an instance of a module for testing

        :param module_class: the actual class to initialize
        :return: an instance of the module
        """
        c = TestController(sql, breakpoint)
        m = module_class(c.session)
        return m
Esempio n. 2
0
class MindsDBController:
    def __init__(self, file=SQLITE_FILE):
        """

        :param file:
        """

        self.setConfigs()

        _thread.start_new_thread(MindsDBController.checkForUpdates, ())
        self.session = SessionController()
        self.storage_file = file
        self.conn = sqlite3.connect(file)
        self.conn.create_aggregate("first_value", 1, FirstValueAgg)
        self.conn.create_aggregate("array_agg_json", 2, ArrayAggJSON)
        self._from_data = None

    def setConfigs(self):
        """
        This sets the config settings for this mindsdb instance
        :return:
        """
        # set logging settings
        logging.basicConfig(**CONFIG.PROXY_LOG_CONFIG)

        # set the mindsdb storage folder
        storage_ok = True  # default state

        # if it does not exist try to create it
        if not os.path.exists(CONFIG.MINDSDB_STORAGE_PATH):
            try:
                logging.info('{folder} does not exist, creating it now'.format(
                    folder=CONFIG.MINDSDB_STORAGE_PATH))
                path = Path(CONFIG.MINDSDB_STORAGE_PATH)
                path.mkdir(exist_ok=True, parents=True)
            except:
                logging.info(traceback.format_exc())
                storage_ok = False
                logging.error(
                    'MindsDB storate foldler: {folder} does not exist and could not be created'
                    .format(folder=CONFIG.MINDSDB_STORAGE_PATH))

        # If storage path is not writable, raise an exception as this can no longer be
        if not os.access(CONFIG.MINDSDB_STORAGE_PATH,
                         os.W_OK) or storage_ok == False:
            error_message = '''Cannot write into storage path, please either set the config variable mindsdb.config.set('MINDSDB_STORAGE_PATH',<path>) or give write access to {folder}'''
            raise ValueError(
                error_message.format(folder=CONFIG.MINDSDB_STORAGE_PATH))

    def addTable(self, ds, as_table):
        """

        :param ds:
        :param as_table:
        :return:
        """

        ds.df.to_sql(as_table, self.conn, if_exists='replace', index=False)

    def query(self, query):
        """

        :param query:
        :return:
        """

        cur = self.conn.cursor()
        return cur.execute(query)

    def queryToDF(self, query):
        """

        :param query:
        :return:
        """

        return pandas.read_sql_query(query, self.conn)

    def setUserEmail(self, email):
        """

        :param email:
        :return:
        """
        email_file = CONFIG.MINDSDB_STORAGE_PATH + '/../email.mdb_base'

        try:
            open(email_file, 'w').write(email)
            return True
        except:
            logging.warning(
                'Cannot store token, Please add write permissions to file:' +
                email_file)
            return False

    def getUserEmail(self):
        """

        :return:
        """
        email_file = CONFIG.MINDSDB_STORAGE_PATH + '/../email.mdb_base'
        email_file_path = Path(email_file)

        try:
            if email_file_path.is_file():
                email = open(email_file, 'r').read()
                return email
            else:
                return None
        except:
            logging.warning(
                'Cannot read email, Please add write permissions to file:' +
                email_file)
            return None

    def learn(self,
              predict,
              from_file=None,
              from_data=None,
              model_name='mdsb_model',
              test_from_data=None,
              group_by=None,
              window_size=MODEL_GROUP_BY_DEAFAULT_LIMIT,
              order_by=[],
              breakpoint=PHASE_END,
              ignore_columns=[],
              rename_strange_columns=True):
        """

        :param from_query:
        :param predict:
        :param model_name:
        :param test_query:
        :return:
        """
        if self._from_data is None:
            from_ds = getDS(from_data) if from_file is None else getDS(
                from_file)
        else:
            from_ds = getDS(self._from_data)
        test_from_ds = test_from_data if test_from_data is None else getDS(
            test_from_data)

        transaction_type = TRANSACTION_LEARN

        predict_columns_map = {}
        predict_columns = [predict] if type(predict) != type([]) else predict

        if rename_strange_columns is False:
            for predict_col in predict_columns:
                predict_col_as_in_df = from_ds.getColNameAsInDF(predict_col)
                predict_columns_map[predict_col_as_in_df] = predict_col

            predict_columns = list(predict_columns_map.keys())
        else:
            logging.warning(
                'After version 1.0 rename_strange_columns in MindsDB().learn, the default value will be flipped from True to False '
            )

        transaction_metadata = TransactionMetadata()
        transaction_metadata.model_name = model_name
        transaction_metadata.model_predict_columns = predict_columns
        transaction_metadata.model_columns_map = {} if rename_strange_columns else from_ds._col_map
        transaction_metadata.model_group_by = group_by
        transaction_metadata.model_order_by = order_by if type(
            order_by) == type([]) else [order_by]
        transaction_metadata.window_size = window_size
        transaction_metadata.type = transaction_type
        transaction_metadata.from_data = from_ds
        transaction_metadata.test_from_data = test_from_ds
        transaction_metadata.ignore_columns = ignore_columns

        self.startInfoServer()
        self.session.newTransaction(transaction_metadata, breakpoint)

    def startInfoServer(self):
        pass

    def predict(self,
                when={},
                from_data=None,
                model_name='mdsb_model',
                breakpoint=PHASE_END,
                **kargs):
        """

        :param predict:
        :param when:
        :param model_name:
        :return:
        """

        transaction_type = TRANSACTION_PREDICT

        from_ds = None if from_data is None else getDS(from_data)

        transaction_metadata = TransactionMetadata()
        transaction_metadata.model_name = model_name

        # This will become irrelevant as if we have trained a model with a predict we just need to pass when or from_data
        # predict_columns = [predict] if type(predict) != type([]) else predict
        # transaction_metadata.model_predict_columns = predict_columns

        transaction_metadata.model_when_conditions = when
        transaction_metadata.type = transaction_type
        transaction_metadata.storage_file = self.storage_file
        transaction_metadata.from_data = from_ds

        transaction = self.session.newTransaction(transaction_metadata,
                                                  breakpoint)

        return transaction.output_data

    @staticmethod
    def checkForUpdates():
        # tmp files
        uuid_file = CONFIG.MINDSDB_STORAGE_PATH + '/../uuid.mdb_base'
        mdb_file = CONFIG.MINDSDB_STORAGE_PATH + '/start.mdb_base'

        uuid_file_path = Path(uuid_file)
        if uuid_file_path.is_file():
            uuid_str = open(uuid_file).read()
        else:
            uuid_str = str(uuid.uuid4())
            try:
                open(uuid_file, 'w').write(uuid_str)
            except:
                logging.warning(
                    'Cannot store token, Please add write permissions to file:'
                    + uuid_file)
                uuid_str = uuid_str + '.NO_WRITE'

        file_path = Path(mdb_file)
        if file_path.is_file():
            token = open(mdb_file).read()
        else:
            token = '{system}|{version}|{uid}'.format(system=platform.system(),
                                                      version=MINDSDB_VERSION,
                                                      uid=uuid_str)
            try:
                open(mdb_file, 'w').write(token)
            except:
                logging.warning(
                    'Cannot store token, Please add write permissions to file:'
                    + mdb_file)
                token = token + '.NO_WRITE'
        extra = urllib.parse.quote_plus(token)
        try:
            r = requests.get(
                'http://mindsdb.com/updates/check/{extra}'.format(extra=extra),
                headers={
                    'referer':
                    'http://check.mindsdb.com/?token={token}'.format(
                        token=token)
                })
        except:
            logging.warning('Could not check for updates')
            return
        try:
            # TODO: Extract version, compare with version in version.py
            ret = r.json()

            if 'version' in ret and ret['version'] != MINDSDB_VERSION:
                logging.warning(
                    "There is a new version of MindsDB {version}, please do:\n    pip3 uninstall mindsdb\n    pip3 install mindsdb --user"
                    .format(version=ret['version']))
            else:
                logging.debug('MindsDB is up to date!')

        except:

            logging.warning('could not check for MindsDB updates')

        # zhihua
    def read_csv(self, filepath, delimiter=',', header='infer', encoding=None):
        data_df = pd.read_csv(filepath,
                              delimiter=delimiter,
                              encoding=encoding,
                              header=header)
        self._from_data = data_df
        return self
Esempio n. 3
0
class MindsDBController:
    def __init__(self, file=SQLITE_FILE):
        """

        :param file:
        """

        self.setConfigs()

        _thread.start_new_thread(MindsDBController.checkForUpdates, ())
        self.session = SessionController()
        self.storage_file = file
        self.conn = sqlite3.connect(file)
        self.conn.create_aggregate("first_value", 1, FirstValueAgg)
        self.conn.create_aggregate("array_agg_json", 2, ArrayAggJSON)

    def setConfigs(self):
        """
        This sets the config settings for this mindsdb instance
        :return:
        """
        # set logging settings
        logging.basicConfig(**CONFIG.PROXY_LOG_CONFIG)

        # set the mindsdb storage folder
        storage_ok = True  # default state

        # if it does not exist try to create it
        if not os.path.exists(CONFIG.MINDSDB_STORAGE_PATH):
            try:
                logging.info('{folder} does not exist, creating it now'.format(
                    folder=CONFIG.MINDSDB_STORAGE_PATH))
                os.mkdir(CONFIG.MINDSDB_STORAGE_PATH)
            except:
                logging.info(traceback.format_exc())
                storage_ok = False
                logging.error(
                    'MindsDB storate foldler: {folder} does not exist and could not be created'
                    .format(folder=CONFIG.MINDSDB_STORAGE_PATH))

        # If storage path is not writable, raise an exception as this can no longer be
        if not os.access(CONFIG.MINDSDB_STORAGE_PATH,
                         os.W_OK) or storage_ok == False:
            error_message = '''Cannot write into storage path, please either set the config variable mindsdb.config.set('MINDSDB_STORAGE_PATH',<path>) or give write access to {folder}'''
            raise ValueError(
                error_message.format(folder=CONFIG.MINDSDB_STORAGE_PATH))

    def addTable(self, ds, as_table):
        """

        :param ds:
        :param as_table:
        :return:
        """

        ds.df.to_sql(as_table, self.conn, if_exists='replace', index=False)

    def query(self, query):
        """

        :param query:
        :return:
        """

        cur = self.conn.cursor()
        return cur.execute(query)

    def queryToDF(self, query):
        """

        :param query:
        :return:
        """

        return pandas.read_sql_query(query, self.conn)

    def learn(self,
              predict,
              from_file=None,
              from_data=None,
              model_name='mdsb_model',
              test_from_data=None,
              group_by=None,
              window_size=MODEL_GROUP_BY_DEAFAULT_LIMIT,
              order_by=[],
              breakpoint=PHASE_END):
        """

        :param from_query:
        :param predict:
        :param model_name:
        :param test_query:
        :return:
        """

        from_ds = getDS(from_data) if from_file is None else getDS(from_file)
        test_from_ds = test_from_data if test_from_data is None else getDS(
            test_from_data)

        transaction_type = TRANSACTION_LEARN

        predict_columns = [predict] if type(predict) != type([]) else predict

        transaction_metadata = TransactionMetadata()
        transaction_metadata.model_name = model_name
        transaction_metadata.model_predict_columns = predict_columns
        transaction_metadata.model_group_by = group_by
        transaction_metadata.model_order_by = order_by if type(
            order_by) == type([]) else [order_by]
        transaction_metadata.window_size = window_size
        transaction_metadata.type = transaction_type
        transaction_metadata.from_data = from_ds
        transaction_metadata.test_from_data = test_from_ds

        self.startInfoServer()
        self.session.newTransaction(transaction_metadata, breakpoint)

    def startInfoServer(self):
        pass

    def predict(self,
                predict,
                from_data=None,
                when={},
                model_name='mdsb_model',
                breakpoint=PHASE_END):
        """

        :param predict:
        :param when:
        :param model_name:
        :return:
        """

        transaction_type = TRANSACTION_PREDICT

        predict_columns = [predict] if type(predict) != type([]) else predict

        transaction_metadata = TransactionMetadata()
        transaction_metadata.model_name = model_name
        transaction_metadata.model_predict_columns = predict_columns
        transaction_metadata.model_when_conditions = when
        transaction_metadata.type = transaction_type
        transaction_metadata.storage_file = self.storage_file
        transaction_metadata.from_data = from_data

        transaction = self.session.newTransaction(transaction_metadata,
                                                  breakpoint)

        return transaction.output_data

    @staticmethod
    def checkForUpdates():
        # tmp files
        mdb_file = CONFIG.MINDSDB_STORAGE_PATH + '/start.mdb_base'
        file_path = Path(mdb_file)
        if file_path.is_file():
            token = open(mdb_file).read()
        else:
            token = '{system}|{version}|{uid}'.format(system=platform.system(),
                                                      version=MDB_VERSION,
                                                      uid=str(uuid.uuid4()))
            try:
                open(mdb_file, 'w').write(token)
            except:
                logging.warn(
                    'Cannot store token, Please add write permissions to file:'
                    + mdb_file)
                token = token + '.NO_WRITE'

        r = requests.get(
            'https://github.com/mindsdb/main/blob/master/version.py',
            headers={
                'referer':
                'http://check.mindsdb.com/?token={token}'.format(token=token)
            })
        try:
            # TODO: Extract version, compare with version in version.py
            # ret = r.json()
            # if 'new_version' in ret:
            #     logging.warn('There is an update available for mindsdb, please go: pip install mindsdb --upgrade')
            pass
        except:
            logging.warning('could not check for MindsDB updates')