示例#1
0
    def test_log_handling(self):
        # type: () -> None
        """
        Tests the log handling functionality

        :return: Nothing
        :raises AssertionError: Raises AssertionError if a test fails
        """
        log_values = (
            (
                (10, 4, "", ""),
                (15, "45.4", "name 1", "Comment 1"),
                (16, 34.3, "", ""),
                (17, 234, "", "Comment 2"),
                (5, "34.4", "", "Comment 3")
            ),
            (
                (34.3, 4, "", ""),
                (13, 234, "", "Comment 2"),
                (34, "34.4", "", "Comment 3")
            )
        )

        well = Well.load_by_wellname_from_db("Well_2", self.session)
        for i in range(len(log_values)):
            log = WellLog("log {}".format(i), "unit name", self.session, "", "")
            log.save_to_db()
            well.add_log(log)

            for value in log_values[i]:
                log.insert_log_value(WellLogValue(value[0], value[1], self.session, value[2], value[3]))
            del log

        del well

        well = Well.load_by_wellname_from_db("Well_2", self.session)
        self.assertEqual(2, len(well.logs))
        self.assertEqual(5, len(well.logs[0].log_values))
        self.assertEqual("log 0", well.logs[0].property_name)
        self.assertEqual(3, len(well.logs[1].log_values))
        self.assertEqual("log 1", well.logs[1].property_name)

        well.delete_log(well.logs[1])

        del well

        well = Well.load_by_wellname_from_db("Well_2", self.session)
        self.assertEqual(1, len(well.logs))
        self.assertEqual(5, len(well.logs[0].log_values))
        self.assertEqual("log 0", well.logs[0].property_name)

        logs = WellLog.load_all_from_db(self.session)
        self.assertEqual(1, len(logs))
示例#2
0
    def test_get_marker_by_depth(self):
        # type: () -> None
        """
        Test the Well.get_marker_by_depth function

        :return: Nothing
        :raises AssertionError: Raises AssertionError if a test fails
        """
        well = Well.load_by_wellname_from_db("Well_1", self.session)
        self.assertEqual(well.get_marker_by_depth(16).horizon.statigraphic_name, "sm")
        self.assertRaises(ValueError, well.get_marker_by_depth, 100)
示例#3
0
    def test_loading(self):
        # type: () -> None
        """
        Test the different types of loading of lines from the db.
        Part 1: load all wells from the database
        Part 2: load well by name
        Part 3: load wells in given extent
        Part 4: load wells with minimal depth

        :return: Nothing
        :raises AssertionError: Raises AssertionError if a test fails
        """
        # Part 1: load all wells from the database
        wells = Well.load_all_from_db(self.session)
        self.assertEqual(len(wells), 3)
        self.assertEqual(wells[0].well_name, "Well_1")
        self.assertEqual(wells[1].well_name, "Well_2")
        self.assertEqual(wells[2].well_name, "Well_3")
        self.assertEqual(len(wells[1].marker), 4)
        self.assertTrue(wells[1].marker[0].horizon == wells[1].marker[3].horizon)
        del wells

        # Part 2: load well by name
        well = Well.load_by_wellname_from_db("Well_2", self.session)
        self.assertEqual(well.well_name, "Well_2")
        self.assertEqual(well.short_name, "W2")
        self.assertEqual(well.depth, 341)
        self.assertEqual(len(well.marker), 4)
        self.assertEqual(well.marker[1].horizon.statigraphic_name, "mm")
        self.assertEqual(well.marker[1].depth, 120)
        del well

        # Part 3: load wells in given extent
        # extent x: 500 - 1,300
        # extent y: 0 - 2,400
        # result: "Well_1" and "Well_2"
        wells = Well.load_in_extent_from_db(self.session, 500, 1300, 0, 2400)
        self.assertEqual(len(wells), 2)
        self.assertEqual(wells[0].well_name, "Well_1")
        self.assertEqual(wells[1].well_name, "Well_2")
        self.assertEqual(len(wells[0].marker), 5)
        self.assertEqual(len(wells[1].marker), 4)
        del wells

        # Part 4: load wells with minimal depth
        wells = Well.load_deeper_than_value_from_db(self.session, 395.23)
        self.assertEqual(len(wells), 2)
        self.assertEqual(wells[0].well_name, "Well_1")
        self.assertEqual(wells[1].well_name, "Well_3")
        self.assertTrue(wells[0].depth >= 395.23)
        self.assertTrue(wells[1].depth >= 395.23)
        del wells
示例#4
0
    def test_delete_marker(self):
        # type: () -> None
        """
        Test the Well.get_marker_by_depth function

        :return: Nothing
        :raises AssertionError: Raises AssertionError if a test fails
        """
        well = Well.load_by_wellname_from_db("Well_1", self.session)
        marker = well.get_marker_by_depth(16)
        self.assertEqual(marker.horizon.statigraphic_name, "sm")
        self.assertRaises(ValueError, well.get_marker_by_depth, 100)
        well.delete_marker(marker)
        well.save_to_db()
        self.assertEqual(len(well.marker), 4)
        del well

        well = Well.load_by_wellname_from_db("Well_1", self.session)
        self.assertEqual(len(well.marker), 4)

        new_marker = WellMarker(23423, StratigraphicObject.init_stratigraphy(self.session, "so"), self.session,
                                "Nothing")
        self.assertRaises(ValueError, well.delete_marker, new_marker)
        self.assertRaises(TypeError, well.delete_marker, "test")
示例#5
0
    def run(self):
        """
        Save well logs to the database
        :return: Nothing, emits Qt Signals
        """

        self._mutex.lock()
        service = DatabaseService.get_instance()
        service.close_session()
        service.connect()
        session = service.get_session()

        failed_imports = 0
        try:
            onekey = self._data[next(iter(self._data.keys()))]["values"]
            # import json
            # self._logger.info(json.dumps(onekey, indent=2))
            count = len(onekey)

            well_name_col = self._selection["well_name"]
            depth_col = self._selection["depth"]

            reference = ImportService.get_instance().get_crs()
            if reference is None:
                reference = ""
            else:
                reference = reference.toWkt()

            self._logger.debug("Saving with reference system\n{}".format(reference))

            for i in range(count):
                self.update_progress.emit(100 * i / count)

                try:
                    well_name = self._data[well_name_col]["values"][i]
                except ValueError:
                    self._logger.warn("No well_name specified for current data set at line {}".format(i))
                    failed_imports += 1
                    continue

                if (well_name is None) or (well_name == ""):
                    self._logger.warn("Unknown well name found: [{}]".format(well_name))
                    failed_imports += 1
                    continue

                try:
                    well: Well = Well.load_by_wellname_from_db(well_name, session)
                    if well is None:
                        self._logger.warn("No well with name [{}] found...".format(well_name))
                        failed_imports += 1
                        continue

                    well.reference_system = reference

                    # add / update properties
                    for item in self._properties:
                        self._logger.debug("Property: {}".format(item))
                        if well.has_log(item.name):
                            log = well.get_log(item.name)
                        else:
                            log = WellLog(property_name = item.name, property_unit = item.unit, session=session)
                            well.add_log(log)

                        depth = self._data[depth_col]["values"][i]
                        value = self._data[item.name]["values"][i]
                        try:
                            log_value: WellLogValue = log.get_value_by_depth(depth)
                        except ValueError:
                            log_value = WellLogValue(depth, value, session=session)

                        log_value.value = value
                        log.insert_log_value(log_value)

                    self._logger.debug("well: {}".format(well))
                    well.save_to_db()

                except DatabaseRequestException:
                    self._logger.warn("Cannot find well with name [{}]. Skipping log import".format(well_name))
                    failed_imports += 1

                if self._cancel:
                    self._logger.debug("Import canceled")
                    self.import_failed.emit(self._message)
                    break

            if not self._cancel:
                if failed_imports > 0:
                    self.import_finished_with_warnings.emit("Could not import {} properties.".format(failed_imports))
                self.update_progress.emit(100)
                self.import_finished.emit()

        except Exception as e:
            msg = str(ExceptionHandler(e))
            self.import_failed.emit(msg)
            self._logger.error("Error", msg, to_messagebar=True)

        finally:
            service.close_session()

        self._mutex.unlock()
        self.quit()
示例#6
0
    def run(self) -> bool:
        """
        Save the Well Object(s) to the database
        :return: True if function executed successfully, else False
        """

        self._mutex.lock()
        service = DatabaseService.get_instance()
        service.close_session()
        service.connect()
        session = DatabaseService.get_instance().get_session()

        try:
            onekey = self._data[next(iter(self._data.keys()))]["values"]
            count = len(onekey)

            name = self._selection["name"]
            short_name = self._selection["short_name"]
            east = self._selection["easting"]
            north = self._selection["northing"]
            alt = self._selection["altitude"]
            total_depth = self._selection["total_depth"]
            strat = self._selection["strat"]
            depth_to = self._selection["depth_to"]
            comment = self._selection["comment"]

            reference = ImportService.get_instance().get_crs()
            if reference is None:
                reference = ""
            else:
                reference = reference.toWkt()

            self._logger.debug("Saving with reference system\n{}".format(reference))

            wells = dict()

            maximum = count
            for i in range(count):
                if (self._data[east]["values"][i] == "") and (self._data[north]["values"][i] == ""):
                    continue

                na = self._data[name]["values"][i]
                sn = "" if short_name == "" else self._data[short_name]["values"][i]
                e = float(self._data[east]["values"][i])
                n = float(self._data[north]["values"][i])
                kb = None if alt == "" else float(self._data[alt]["values"][i])
                td = -1 if total_depth == "" else float(self._data[total_depth]["values"][i])
                s = "" if strat == "" else self._data[strat]["values"][i]
                dt = -1 if depth_to == "" else float(self._data[depth_to]["values"][i])
                c = "" if comment == "" else self._data[comment]["values"][i]

                strat_obj = StratigraphicObject.init_stratigraphy(session, s, -1)
                strat_obj.save_to_db()

                marker = WellMarker(dt, strat_obj, session=session, comment=c)
                # marker.save_to_db()
                # point = GeoPoint(None, False if (h is None) else True, reference,
                #                e, n, 0 if (h is None) else h, session, sn, c)

                if na in wells:
                    wells[na]["marker"].append(marker)
                else:
                    wells[na] = {
                        "short_name": sn,
                        "easting": e,
                        "northing": n,
                        "altitude": kb,
                        "total_depth": td,
                        "marker": [marker]
                    }

                    maximum += 1

                if self._cancel:
                    self._logger.debug("Import canceled")
                    self.import_failed.emit(self._message)
                    break

                self.update_progress.emit(100 * i / maximum)

            i = count
            if not self._cancel:
                for well_name in wells:
                    i += 1
                    well = wells[well_name]

                    new_well = Well.load_by_wellname_from_db(well_name, session)
                    if new_well is not None:
                        try:
                            self._logger.debug("Updating existing well: {}".format(new_well))
                            for marker in new_well.marker:
                                WellMarker.delete_from_db(marker, session)

                            new_well.save_to_db()
                            new_well.marker = well["marker"]
                            new_well.short_name = well["short_name"]
                            new_well.easting = well["easting"]
                            new_well.northing = well["northing"]
                            new_well.depth = well["total_depth"]
                        except WellMarkerDepthException as e:
                            self._logger.error("WellMarkerDepthException", "{}\n{}".format(new_well, str(e)))
                            return False
                    else:
                        self._logger.debug("Creating new well with name [{}]".format(well_name))
                        new_well = Well(well_name, well["short_name"], well["total_depth"], reference_system=reference,
                                        easting=well["easting"], northing=well["northing"], altitude=well["altitude"],
                                        session=session)

                        new_well.marker = well["marker"]

                    new_well.save_to_db()

                    self._logger.debug("Saved well:\n{}".format(new_well))

                    self.update_progress.emit(100 * i / maximum)

                    if self._cancel:
                        self._logger.debug("Import canceled")
                        self.import_failed.emit(self._message)
                        break

            if not self._cancel:
                self.update_progress.emit(100)
                self._logger.debug("Lines successfully imported")
                self.import_finished.emit()

        except Exception as e:
            msg = str(ExceptionHandler(e))
            self.import_failed.emit(msg)
            self._logger.error("Error", msg)

        finally:
            service.close_session()

        self._mutex.unlock()
        self.quit()