def __init__(self, **kwargs):
        self._user = unicode(kwargs.get("user"))
        self._passwd = unicode(kwargs.get("passwd", ""))
        self._host = unicode(kwargs.get("host", "127.0.0.1"))
        self._port = int(kwargs.get("port", 3306))
        self._db = unicode(kwargs.get("db"))

        self._conn = MySQLdb.connect(
            user=self._user,
            passwd=self._passwd,
            host=self._host,
            port=self._port,
            db=self._db,
            use_unicode=True,
            charset="utf8",
        )
        self._extractor = NumExtractor()
class SqlExtractor(object):
    """Class that deals with extracting various numeric data from a SQL table
    and storing the data in the sql afterwards."""

    def __init__(self, **kwargs):
        self._user = unicode(kwargs.get("user"))
        self._passwd = unicode(kwargs.get("passwd", ""))
        self._host = unicode(kwargs.get("host", "127.0.0.1"))
        self._port = int(kwargs.get("port", 3306))
        self._db = unicode(kwargs.get("db"))
        self._prefix = unicode(kwargs.get("prefix", ""))
        self._intable = unicode(kwargs.get("intable", ""))

        self._conn = MySQLdb.connect(
            user=self._user,
            passwd=self._passwd,
            host=self._host,
            port=self._port,
            db=self._db,
            use_unicode=True,
            charset="utf8",
        )
        self._extractor = NumExtractor()
        self._create_tables()

    def _create_tables(self):
        cur = self._conn.cursor()
        for command in sql_create_script(self._db, self._prefix).split(";"):
            if len(command.strip()) > 3:
                cur.execute(command)

    def _abs_prefix(self):
        return "`" + self._db + "`.`" + self._prefix

    def _abs_intable(self):
        return self._abs_prefix() + self._intable + "`"

    def _insert_rr(self, epiId, field, values):
        tuples = []
        for entry in values["record_bloodpressure"]:
            systolic, diastolic, pulse = None, None, None
            if "systolic" in entry:
                systolic = entry["systolic"]["value"]
            if "diastolic" in entry:
                diastolic = entry["diastolic"]["value"]
            if "pulse" in entry:
                pulse = entry["pulse"]["value"]
            tuples.append((epiId, field, systolic, diastolic, pulse))
        if len(tuples) > 0:
            cur = self._conn.cursor()
            cur.execute("begin")
            cur.executemany(
                "insert into "
                + self._abs_prefix()
                + "rr` (epiId, field, systolic, diastolic, pulse) values (%s, %s, %s, %s, %s)",
                tuples,
            )
            cur.execute("commit")

    def _insert_temp(self, epiId, field, values):
        tuples = []
        for entry in values["record_temperature"]:
            temp = entry["temperature"]["value"]
            tuples.append((epiId, field, temp))
        if len(tuples) > 0:
            cur = self._conn.cursor()
            cur.execute("begin")
            cur.executemany(
                "insert into " + self._abs_prefix() + "temp` (epiId, field, temp) values (%s, %s, %s)", tuples
            )
            cur.execute("commit")

    def _insert_kmi(self, epiId, field, values):
        pass

    def process(self, field):
        sql = "SELECT `epiId`, `" + field + "` FROM " + self._abs_intable()
        print sql
        cur = self._conn.cursor()
        cur.execute(sql)

        row = cur.fetchone()
        while row is not None:
            if row[1] is not None:
                epiId = long(row[0])
                document = unicode(row[1])
                values = self._extractor.extract(document)

                self._insert_rr(epiId, field, values)
                # self._insert_temp(epiId, field, values)
            row = cur.fetchone()
class SqlVisitExtractor(object):
    """Extractor for bloodpressure data in splitted epicrisis."""

    def __init__(self, **kwargs):
        self._user = unicode(kwargs.get("user"))
        self._passwd = unicode(kwargs.get("passwd", ""))
        self._host = unicode(kwargs.get("host", "127.0.0.1"))
        self._port = int(kwargs.get("port", 3306))
        self._db = unicode(kwargs.get("db"))

        self._conn = MySQLdb.connect(
            user=self._user,
            passwd=self._passwd,
            host=self._host,
            port=self._port,
            db=self._db,
            use_unicode=True,
            charset="utf8",
        )
        self._extractor = NumExtractor()

    def to_plain(self, json):
        sentences = ast.literal_eval(json)
        return u" ".join([word["sone"].decode("unicode_escape", "replace") for sent in sentences for word in sent])

    def _insert_rr(self, row, values):
        visitId, epiId, epiTime, patId, epiType, fieldName, date, _ = row
        tuples = []
        for entry in values["record_bloodpressure"]:
            systolic, diastolic, pulse = None, None, None
            if "systolic" in entry:
                systolic = entry["systolic"]["value"]
            if "diastolic" in entry:
                diastolic = entry["diastolic"]["value"]
            if "pulse" in entry:
                pulse = entry["pulse"]["value"]
            tuples.append((visitId, epiId, epiTime, patId, epiType, fieldName, date, systolic, diastolic, pulse))
        if len(tuples) > 0:
            cur = self._conn.cursor()
            cur.execute("begin")
            cur.executemany(
                "insert into `"
                + self._db
                + "`.`bloodpressures_visits` (visitID, epiId, epiTime, patId, epiType, fieldName, date, systolic, diastolic, pulse) values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
                tuples,
            )
            cur.execute("commit")

    def process(self):
        sql = "SELECT id, epiId, epiTime, patId, epiType, fieldName, date, json from `" + self._db + "`.`visits`;"
        print sql
        cur = self._conn.cursor()
        cur.execute(sql)

        row = cur.fetchone()
        while row is not None:
            if row[7] is not None:
                values = self._extractor.extract(self.to_plain(row[7]))
                self._insert_rr(row, values)
                # self._insert_temp(epiId, field, values)
            row = cur.fetchone()