class TravelRequestsSimulator(object):
    def __init__(self):
        self.mongodb_database_connection = MongodbDatabaseConnection(host=mongodb_host, port=mongodb_port)
        log(module_name='travel_requests_simulator', log_type='DEBUG',
            log_message='mongodb_database_connection: established')

    def clear_travel_requests_collection(self):
        """
        Clear all the documents of the TravelRequests collection.

        :return: None
        """
        self.mongodb_database_connection.clear_travel_request_documents_collection()
        log(module_name='travel_requests_simulator', log_type='DEBUG',
            log_message='clear_travel_request_documents_collection: ok')

    def delete_travel_request_documents(self, object_ids=None, client_ids=None, bus_line_ids=None,
                                        min_departure_datetime=None, max_departure_datetime=None):
        """
        Delete multiple travel_request_documents.

        :param object_ids: [ObjectId]
        :param client_ids: [int]
        :param bus_line_ids: [int]
        :param min_departure_datetime: datetime
        :param max_departure_datetime
        :return: None
        """
        self.mongodb_database_connection.delete_travel_request_documents(
            object_ids=object_ids,
            client_ids=client_ids,
            bus_line_ids=bus_line_ids,
            min_departure_datetime=min_departure_datetime,
            max_departure_datetime=max_departure_datetime
        )
        log(module_name='travel_requests_simulator', log_type='DEBUG',
            log_message='delete_travel_request_documents: ok')

    def generate_random_travel_request_documents(self, initial_datetime, min_number_of_travel_request_documents,
                                                 max_number_of_travel_request_documents):
        """
        Generate random number of travel_request_documents for each bus_line,
        for a 24hour period starting from a selected datetime, and store them at the
        corresponding collection of the System Database.

        :param initial_datetime: datetime
        :param min_number_of_travel_request_documents: int
        :param max_number_of_travel_request_documents: int
        :return: None
        """
        bus_lines = self.mongodb_database_connection.find_bus_line_documents()

        for bus_line in bus_lines:
            number_of_travel_request_documents = random.randint(
                min_number_of_travel_request_documents,
                max_number_of_travel_request_documents
            )
            self.generate_travel_request_documents(
                initial_datetime=initial_datetime,
                number_of_travel_request_documents=number_of_travel_request_documents,
                bus_line=bus_line
            )

    def generate_travel_request_documents(self, initial_datetime, number_of_travel_request_documents,
                                          bus_line=None, bus_line_id=None):
        """
        Generate a specific number of travel_request_documents, for the selected bus_line,
        for a 24hour period starting from a selected datetime, and store them at the
        corresponding collection of the System Database.

        :param initial_datetime: datetime
        :param number_of_travel_request_documents: int
        :param bus_line: bus_line_document
        :param bus_line_id: int
        :return: None
        """
        # 1: The inputs: initial_datetime, number_of_travel_request_documents, and (bus_line or bus_line_id)
        #    are provided to the Travel Requests Simulator, so as a specific number of travel_request_documents
        #    to be generated, for the selected bus_line, for a 24hour period starting from
        #    the selected datetime.
        #
        # 2: If the provided bus_line is None, then the Travel Requests Simulator retrieves from the System Database
        #    the bus_line which corresponds to the provided bus_line_id.
        #
        if bus_line is None and bus_line_id is None:
            return None
        elif bus_line is None:
            bus_line = self.mongodb_database_connection.find_bus_line_document(bus_line_id=bus_line_id)
        else:
            pass

        bus_stops = bus_line.get('bus_stops')
        number_of_bus_stops = len(bus_stops)

        # 3: The Travel Requests Simulator generates the travel_request_documents, taking into consideration
        #    the variation of transportation demand during the hours of the day.
        #
        # distribution_weighted_datetimes = [
        #     (initial_datetime + timedelta(hours=0), 1),
        #     (initial_datetime + timedelta(hours=1), 1),
        #     (initial_datetime + timedelta(hours=2), 1),
        #     (initial_datetime + timedelta(hours=3), 1),
        #     (initial_datetime + timedelta(hours=4), 1),
        #     (initial_datetime + timedelta(hours=5), 1),
        #     (initial_datetime + timedelta(hours=6), 1),
        #     (initial_datetime + timedelta(hours=7), 1),
        #     (initial_datetime + timedelta(hours=8), 1),
        #     (initial_datetime + timedelta(hours=9), 1),
        #     (initial_datetime + timedelta(hours=10), 1),
        #     (initial_datetime + timedelta(hours=11), 1),
        #     (initial_datetime + timedelta(hours=12), 1),
        #     (initial_datetime + timedelta(hours=13), 1),
        #     (initial_datetime + timedelta(hours=14), 1),
        #     (initial_datetime + timedelta(hours=15), 1),
        #     (initial_datetime + timedelta(hours=16), 1),
        #     (initial_datetime + timedelta(hours=17), 1),
        #     (initial_datetime + timedelta(hours=18), 1),
        #     (initial_datetime + timedelta(hours=19), 1),
        #     (initial_datetime + timedelta(hours=20), 1),
        #     (initial_datetime + timedelta(hours=21), 1),
        #     (initial_datetime + timedelta(hours=22), 1),
        #     (initial_datetime + timedelta(hours=23), 1)
        # ]
        distribution_weighted_datetimes = [
            (initial_datetime + timedelta(hours=i),
             travel_requests_simulator_datetime_distribution_weights[i]) for i in range(0, 24)
        ]
        datetime_population = [val for val, cnt in distribution_weighted_datetimes for i in range(cnt)]
        travel_request_documents = []
        maximum_client_id = self.mongodb_database_connection.get_maximum_or_minimum(collection='travel_request')

        for i in range(0, number_of_travel_request_documents):
            client_id = maximum_client_id + 1
            maximum_client_id = client_id
            starting_bus_stop_index = random.randint(0, number_of_bus_stops - 2)
            starting_bus_stop = bus_stops[starting_bus_stop_index]
            ending_bus_stop_index = random.randint(starting_bus_stop_index + 1, number_of_bus_stops - 1)
            ending_bus_stop = bus_stops[ending_bus_stop_index]
            additional_departure_time_interval = random.randint(0, 59)
            departure_datetime = (random.choice(datetime_population) +
                                  timedelta(minutes=additional_departure_time_interval))

            travel_request_document = {
                'client_id': client_id,
                'bus_line_id': bus_line_id,
                'starting_bus_stop': starting_bus_stop,
                'ending_bus_stop': ending_bus_stop,
                'departure_datetime': departure_datetime,
                'arrival_datetime': None,
                'starting_timetable_entry_index': None,
                'ending_timetable_entry_index': None
            }
            travel_request_documents.append(travel_request_document)

        # 4: The generated travel_request_documents are stored at the
        #    TravelRequests collection of the System Database.
        #
        self.mongodb_database_connection.insert_travel_request_documents(
            travel_request_documents=travel_request_documents
        )
class TravelRequestsSimulator(object):
    def __init__(self):
        self.mongodb_database_connection = MongodbDatabaseConnection(host=mongodb_host, port=mongodb_port)
        log(
            module_name="travel_requests_simulator",
            log_type="DEBUG",
            log_message="mongodb_database_connection: established",
        )

    def clear_travel_requests_collection(self):
        """
        Clear all the documents of the TravelRequests collection.

        :return: None
        """
        self.mongodb_database_connection.clear_travel_request_documents_collection()
        log(
            module_name="travel_requests_simulator",
            log_type="DEBUG",
            log_message="clear_travel_request_documents_collection: ok",
        )

    def delete_travel_request_documents(
        self, object_ids=None, client_ids=None, line_ids=None, min_departure_datetime=None, max_departure_datetime=None
    ):
        """
        Delete multiple travel_request_documents.

        travel_request_document: {
            '_id', 'client_id', 'line_id',
            'starting_bus_stop': {'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}},
            'ending_bus_stop': {'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}},
            'departure_datetime', 'arrival_datetime',
            'starting_timetable_entry_index', 'ending_timetable_entry_index'
        }
        :param object_ids: [ObjectId]
        :param client_ids: [int]
        :param line_ids: [int]
        :param min_departure_datetime: datetime
        :param max_departure_datetime
        :return: None
        """
        self.mongodb_database_connection.delete_travel_request_documents(
            object_ids=object_ids,
            client_ids=client_ids,
            line_ids=line_ids,
            min_departure_datetime=min_departure_datetime,
            max_departure_datetime=max_departure_datetime,
        )
        log(
            module_name="travel_requests_simulator", log_type="DEBUG", log_message="delete_travel_request_documents: ok"
        )

    def generate_random_travel_request_documents(
        self, initial_datetime, min_number_of_travel_request_documents, max_number_of_travel_request_documents
    ):
        """
        Generate random number of travel_request_documents for each bus_line,
        for a 24hour period starting from a selected datetime, and store them at the
        corresponding collection of the System Database.

        bus_line_document: {
            '_id', 'line_id', 'bus_stops': [{'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}}]
        }
        :param initial_datetime: datetime
        :param min_number_of_travel_request_documents: int
        :param max_number_of_travel_request_documents: int
        :return: None
        """
        bus_lines = self.mongodb_database_connection.find_bus_line_documents()

        for bus_line in bus_lines:
            number_of_travel_request_documents = random.randint(
                min_number_of_travel_request_documents, max_number_of_travel_request_documents
            )
            self.generate_travel_request_documents(
                initial_datetime=initial_datetime,
                number_of_travel_request_documents=number_of_travel_request_documents,
                bus_line=bus_line,
            )

    def generate_travel_request_documents(
        self, initial_datetime, number_of_travel_request_documents, bus_line=None, line_id=None
    ):
        """
        Generate a specific number of travel_request_documents, for the selected bus_line,
        for a 24hour period starting from a selected datetime, and store them at the
        corresponding collection of the System Database.

        bus_line_document: {
            '_id', 'line_id', 'bus_stops': [{'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}}]
        }
        :param initial_datetime: datetime
        :param number_of_travel_request_documents: int
        :param bus_line: bus_line_document
        :param line_id: int
        :return: None
        """
        # 1: The inputs: initial_datetime, number_of_travel_request_documents, and (bus_line or line_id)
        #    are provided to the Travel Requests Simulator, so as a specific number of travel_request_documents
        #    to be generated, for the selected bus_line, for a 24hour period starting from
        #    the selected datetime.
        #
        # 2: If the provided bus_line is None, then the Travel Requests Simulator retrieves from the System Database
        #    the bus_line which corresponds to the provided line_id.
        #
        if bus_line is None and line_id is None:
            return None
        elif bus_line is None:
            bus_line = self.mongodb_database_connection.find_bus_line_document(line_id=line_id)
        else:
            pass

        bus_stops = bus_line.get("bus_stops")
        number_of_bus_stops = len(bus_stops)

        # 3: The Travel Requests Simulator generates the travel_request_documents, taking into consideration
        #    the variation of transportation demand during the hours of the day.
        #
        weighted_datetimes = [
            (initial_datetime + timedelta(hours=0), 1),
            (initial_datetime + timedelta(hours=1), 1),
            (initial_datetime + timedelta(hours=2), 1),
            (initial_datetime + timedelta(hours=3), 1),
            (initial_datetime + timedelta(hours=4), 1),
            (initial_datetime + timedelta(hours=5), 1),
            (initial_datetime + timedelta(hours=6), 1),
            (initial_datetime + timedelta(hours=7), 1),
            (initial_datetime + timedelta(hours=8), 1),
            (initial_datetime + timedelta(hours=9), 1),
            (initial_datetime + timedelta(hours=10), 1),
            (initial_datetime + timedelta(hours=11), 1),
            (initial_datetime + timedelta(hours=12), 1),
            (initial_datetime + timedelta(hours=13), 1),
            (initial_datetime + timedelta(hours=14), 1),
            (initial_datetime + timedelta(hours=15), 1),
            (initial_datetime + timedelta(hours=16), 1),
            (initial_datetime + timedelta(hours=17), 1),
            (initial_datetime + timedelta(hours=18), 1),
            (initial_datetime + timedelta(hours=19), 1),
            (initial_datetime + timedelta(hours=20), 1),
            (initial_datetime + timedelta(hours=21), 1),
            (initial_datetime + timedelta(hours=22), 1),
            (initial_datetime + timedelta(hours=23), 1),
        ]
        datetime_population = [val for val, cnt in weighted_datetimes for i in range(cnt)]
        travel_request_documents = []

        for i in range(0, number_of_travel_request_documents):
            client_id = i
            starting_bus_stop_index = random.randint(0, number_of_bus_stops - 2)
            starting_bus_stop = bus_stops[starting_bus_stop_index]
            ending_bus_stop_index = random.randint(starting_bus_stop_index + 1, number_of_bus_stops - 1)
            ending_bus_stop = bus_stops[ending_bus_stop_index]
            additional_departure_time_interval = random.randint(0, 59)
            departure_datetime = random.choice(datetime_population) + timedelta(
                minutes=additional_departure_time_interval
            )

            travel_request_document = {
                "client_id": client_id,
                "line_id": line_id,
                "starting_bus_stop": starting_bus_stop,
                "ending_bus_stop": ending_bus_stop,
                "departure_datetime": departure_datetime,
                "arrival_datetime": None,
                "starting_timetable_entry_index": None,
                "ending_timetable_entry_index": None,
            }
            travel_request_documents.append(travel_request_document)

        # 4: The generated travel_request_documents are stored at the
        #    TravelRequests collection of the System Database.
        #
        self.mongodb_database_connection.insert_travel_request_documents(
            travel_request_documents=travel_request_documents
        )
class MongodbDatabaseConnectionTester(object):
    def __init__(self):
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='initialize_mongodb_database_connection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection = MongodbDatabaseConnection(
            host=mongodb_host, port=mongodb_port)
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message=
            'initialize_mongodb_database_connection: finished - elapsed_time = '
            + str(self.elapsed_time) + ' sec')

    def clear_all_collections(self):
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='clear_all_collections: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_all_collections()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='clear_all_collections: finished - elapsed_time = ' +
            str(self.elapsed_time) + ' sec')

    def clear_address_documents_collection(self):
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='clear_address_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_address_documents_collection()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message=
            'clear_address_documents_collection: finished - elapsed_time = ' +
            str(self.elapsed_time) + ' sec')

    def clear_bus_line_documents_collection(self):
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='clear_bus_line_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_bus_line_documents_collection()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message=
            'clear_bus_line_documents_collection: finished - elapsed_time = ' +
            str(self.elapsed_time) + ' sec')

    def clear_bus_stop_documents_collection(self):
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='clear_bus_stop_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_bus_stop_documents_collection()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message=
            'clear_bus_stop_documents_collection: finished - elapsed_time = ' +
            str(self.elapsed_time) + ' sec')

    def clear_bus_stop_waypoints_documents_collection(self):
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message=
            'clear_bus_stop_waypoints_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_bus_stop_waypoints_documents_collection(
        )
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message=
            'clear_bus_stop_waypoints_documents_collection: finished - elapsed_time = '
            + str(self.elapsed_time) + ' sec')

    def clear_edge_documents_collection(self):
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='clear_edge_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_edge_documents_collection()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message=
            'clear_edge_documents_collection: finished - elapsed_time = ' +
            str(self.elapsed_time) + ' sec')

    def clear_node_documents_collection(self):
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='clear_node_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_node_documents_collection()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message=
            'clear_node_documents_collection: finished - elapsed_time = ' +
            str(self.elapsed_time) + ' sec')

    def clear_point_documents_collection(self):
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='clear_point_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_point_documents_collection()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message=
            'clear_point_documents_collection: finished - elapsed_time = ' +
            str(self.elapsed_time) + ' sec')

    def clear_timetable_documents_collection(self):
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='clear_timetable_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_timetable_documents_collection()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message=
            'clear_timetable_documents_collection: finished - elapsed_time = '
            + str(self.elapsed_time) + ' sec')

    def clear_traffic_density(self):
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='clear_traffic_density: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_traffic_density()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='clear_traffic_density: finished - elapsed_time = ' +
            str(self.elapsed_time) + ' sec')

    def clear_traffic_event_documents_collection(self):
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='clear_traffic_event_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_traffic_event_documents_collection(
        )
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message=
            'clear_traffic_event_documents_collection: finished - elapsed_time = '
            + str(self.elapsed_time) + ' sec')

    def clear_travel_request_documents_collection(self):
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='clear_travel_request_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_travel_request_documents_collection(
        )
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message=
            'clear_travel_request_documents_collection: finished - elapsed_time = '
            + str(self.elapsed_time) + ' sec')

    def clear_way_documents_collection(self):
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='clear_way_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_way_documents_collection()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message=
            'clear_way_documents_collection: finished - elapsed_time = ' +
            str(self.elapsed_time) + ' sec')

    def print_address_documents(self,
                                object_ids=None,
                                names=None,
                                node_ids=None,
                                counter=None):
        """
        Print multiple address_documents.

        :param object_ids: [ObjectId]
        :param names: [string]
        :param node_ids: [int]
        :param counter: int
        :return: None
        """
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='print_address_documents')
        self.mongodb_database_connection.print_address_documents(
            object_ids=object_ids,
            names=names,
            node_ids=node_ids,
            counter=counter)

    def print_bus_line_documents(self,
                                 object_ids=None,
                                 bus_line_ids=None,
                                 counter=None):
        """
        Print multiple bus_line_documents.

        :param object_ids: [ObjectId]
        :param bus_line_ids: [int]
        :param counter: int
        :return: None
        """
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='print_bus_line_documents')
        self.mongodb_database_connection.print_bus_line_documents(
            object_ids=object_ids, bus_line_ids=bus_line_ids, counter=counter)

    def print_bus_stop_documents(self,
                                 object_ids=None,
                                 osm_ids=None,
                                 names=None,
                                 counter=None):
        """
        Print multiple bus_stop_documents.

        :param object_ids: [ObjectId]
        :param osm_ids: [int]
        :param names: [string]
        :param counter: int
        :return: None
        """
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='print_bus_stop_documents')
        self.mongodb_database_connection.print_bus_stop_documents(
            object_ids=object_ids,
            osm_ids=osm_ids,
            names=names,
            counter=counter)

    def print_bus_stop_waypoints_documents(self,
                                           object_ids=None,
                                           bus_stops=None,
                                           bus_stop_names=None,
                                           bus_line_id=None):
        """
        Print multiple bus_stop_waypoints_documents.

        :param object_ids: [ObjectId]
        :param bus_stops: [{'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}}]
        :param bus_stop_names: [string]
        :param bus_line_id: int
        :return: None
        """
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='print_bus_stop_waypoints_documents')
        self.mongodb_database_connection.print_bus_stop_waypoints_documents(
            object_ids=object_ids,
            bus_stops=bus_stops,
            bus_stop_names=bus_stop_names,
            bus_line_id=bus_line_id)

    def print_detailed_bus_stop_waypoints_documents(self,
                                                    object_ids=None,
                                                    bus_stops=None,
                                                    bus_stop_names=None,
                                                    bus_line_id=None):
        """
        Print multiple detailed_bus_stop_waypoints_documents.

        :param object_ids: [ObjectId]
        :param bus_stops: [{'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}}]
        :param bus_stop_names: [string]
        :param bus_line_id: int
        :return: None
        """
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='print_detailed_bus_stop_waypoints_documents')
        self.mongodb_database_connection.print_detailed_bus_stop_waypoints_documents(
            object_ids=object_ids,
            bus_stops=bus_stops,
            bus_stop_names=bus_stop_names,
            bus_line_id=bus_line_id)

    def print_edge_documents(self,
                             object_ids=None,
                             starting_node_osm_id=None,
                             ending_node_osm_id=None,
                             counter=None):
        """
        Print multiple edge_documents.

        :param object_ids: [ObjectId]
        :param starting_node_osm_id: int
        :param ending_node_osm_id: int
        :param counter: int
        :return: None
        """
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='print_edge_documents')
        self.mongodb_database_connection.print_edge_documents(
            object_ids=object_ids,
            starting_node_osm_id=starting_node_osm_id,
            ending_node_osm_id=ending_node_osm_id,
            counter=counter)

    def print_node_documents(self,
                             object_ids=None,
                             osm_ids=None,
                             counter=None):
        """
        Print multiple node_documents.

        :param object_ids: [ObjectId]
        :param osm_ids: [int]
        :param counter: int
        :return: None
        """
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='print_node_documents')
        self.mongodb_database_connection.print_node_documents(
            object_ids=object_ids, osm_ids=osm_ids, counter=counter)

    def print_point_documents(self,
                              object_ids=None,
                              osm_ids=None,
                              counter=None):
        """
        Print multiple point_documents.

        :param object_ids: [ObjectId]
        :param osm_ids: [int]
        :param counter: int
        :return: None
        """
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='print_point_documents')
        self.mongodb_database_connection.print_point_documents(
            object_ids=object_ids, osm_ids=osm_ids, counter=counter)

    def print_timetable_documents(self,
                                  object_ids=None,
                                  bus_line_ids=None,
                                  counter=None,
                                  timetables_control=True,
                                  timetable_entries_control=False,
                                  travel_requests_control=False):
        """
        Print multiple timetable_documents.

        :param object_ids: [ObjectId]
        :param bus_line_ids: [int]
        :param counter: int
        :param timetables_control: bool
        :param timetable_entries_control: bool
        :param travel_requests_control: bool
        :return: timetable_documents: [timetable_document]
        """
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='print_timetable_documents')
        self.mongodb_database_connection.print_timetable_documents(
            object_ids=object_ids,
            bus_line_ids=bus_line_ids,
            counter=counter,
            timetables_control=timetables_control,
            timetable_entries_control=timetable_entries_control,
            travel_requests_control=travel_requests_control)

    def print_traffic_density_documents(self,
                                        bus_stops=None,
                                        bus_stop_names=None):
        """
        Print multiple traffic_density_documents.

        :param bus_stops: [bus_stop_document]
        :param bus_stop_names: [string]
        :return: None
        """
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='print_traffic_density_documents')
        self.mongodb_database_connection.print_traffic_density_documents(
            bus_stops=bus_stops, bus_stop_names=bus_stop_names)

    def print_travel_request_documents(self,
                                       object_ids=None,
                                       client_ids=None,
                                       bus_line_ids=None,
                                       min_departure_datetime=None,
                                       max_departure_datetime=None,
                                       counter=None):
        """
        Print multiple travel_request_documents.

        :param object_ids: [ObjectId]
        :param client_ids: [int]
        :param bus_line_ids: [int]
        :param min_departure_datetime: datetime
        :param max_departure_datetime: datetime
        :param counter: int
        :return: None
        """
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='print_travel_request_documents')
        self.mongodb_database_connection.print_travel_request_documents(
            object_ids=object_ids,
            client_ids=client_ids,
            bus_line_ids=bus_line_ids,
            min_departure_datetime=min_departure_datetime,
            max_departure_datetime=max_departure_datetime,
            counter=counter)

    def print_way_documents(self, object_ids=None, osm_ids=None, counter=None):
        """
        Print multiple way_documents.

        :param object_ids: [ObjectId]
        :param osm_ids: [int]
        :param counter: int
        :return: None
        """
        log(module_name='mongodb_database_connection_test',
            log_type='INFO',
            log_message='print_way_documents')
        self.mongodb_database_connection.print_way_documents(
            object_ids=object_ids, osm_ids=osm_ids, counter=counter)
class TravelRequestsSimulator(object):
    def __init__(self):
        self.mongodb_database_connection = MongodbDatabaseConnection(
            host=mongodb_host, port=mongodb_port)
        log(module_name='travel_requests_simulator',
            log_type='DEBUG',
            log_message='mongodb_database_connection: established')

    def clear_travel_requests_collection(self):
        """
        Clear all the documents of the TravelRequests collection.

        :return: None
        """
        self.mongodb_database_connection.clear_travel_request_documents_collection(
        )
        log(module_name='travel_requests_simulator',
            log_type='DEBUG',
            log_message='clear_travel_request_documents_collection: ok')

    def delete_travel_request_documents(self,
                                        object_ids=None,
                                        client_ids=None,
                                        bus_line_ids=None,
                                        min_departure_datetime=None,
                                        max_departure_datetime=None):
        """
        Delete multiple travel_request_documents.

        :param object_ids: [ObjectId]
        :param client_ids: [int]
        :param bus_line_ids: [int]
        :param min_departure_datetime: datetime
        :param max_departure_datetime
        :return: None
        """
        self.mongodb_database_connection.delete_travel_request_documents(
            object_ids=object_ids,
            client_ids=client_ids,
            bus_line_ids=bus_line_ids,
            min_departure_datetime=min_departure_datetime,
            max_departure_datetime=max_departure_datetime)
        log(module_name='travel_requests_simulator',
            log_type='DEBUG',
            log_message='delete_travel_request_documents: ok')

    def generate_random_travel_request_documents(
            self, initial_datetime, min_number_of_travel_request_documents,
            max_number_of_travel_request_documents):
        """
        Generate random number of travel_request_documents for each bus_line,
        for a 24hour period starting from a selected datetime, and store them at the
        corresponding collection of the System Database.

        :param initial_datetime: datetime
        :param min_number_of_travel_request_documents: int
        :param max_number_of_travel_request_documents: int
        :return: None
        """
        bus_lines = self.mongodb_database_connection.find_bus_line_documents()

        for bus_line in bus_lines:
            number_of_travel_request_documents = random.randint(
                min_number_of_travel_request_documents,
                max_number_of_travel_request_documents)
            self.generate_travel_request_documents(
                initial_datetime=initial_datetime,
                number_of_travel_request_documents=
                number_of_travel_request_documents,
                bus_line=bus_line)

    def generate_travel_request_documents(self,
                                          initial_datetime,
                                          number_of_travel_request_documents,
                                          bus_line=None,
                                          bus_line_id=None):
        """
        Generate a specific number of travel_request_documents, for the selected bus_line,
        for a 24hour period starting from a selected datetime, and store them at the
        corresponding collection of the System Database.

        :param initial_datetime: datetime
        :param number_of_travel_request_documents: int
        :param bus_line: bus_line_document
        :param bus_line_id: int
        :return: None
        """
        # 1: The inputs: initial_datetime, number_of_travel_request_documents, and (bus_line or bus_line_id)
        #    are provided to the Travel Requests Simulator, so as a specific number of travel_request_documents
        #    to be generated, for the selected bus_line, for a 24hour period starting from
        #    the selected datetime.
        #
        # 2: If the provided bus_line is None, then the Travel Requests Simulator retrieves from the System Database
        #    the bus_line which corresponds to the provided bus_line_id.
        #
        if bus_line is None and bus_line_id is None:
            return None
        elif bus_line is None:
            bus_line = self.mongodb_database_connection.find_bus_line_document(
                bus_line_id=bus_line_id)
        else:
            pass

        bus_stops = bus_line.get('bus_stops')
        number_of_bus_stops = len(bus_stops)

        # 3: The Travel Requests Simulator generates the travel_request_documents, taking into consideration
        #    the variation of transportation demand during the hours of the day.
        #
        # distribution_weighted_datetimes = [
        #     (initial_datetime + timedelta(hours=0), 1),
        #     (initial_datetime + timedelta(hours=1), 1),
        #     (initial_datetime + timedelta(hours=2), 1),
        #     (initial_datetime + timedelta(hours=3), 1),
        #     (initial_datetime + timedelta(hours=4), 1),
        #     (initial_datetime + timedelta(hours=5), 1),
        #     (initial_datetime + timedelta(hours=6), 1),
        #     (initial_datetime + timedelta(hours=7), 1),
        #     (initial_datetime + timedelta(hours=8), 1),
        #     (initial_datetime + timedelta(hours=9), 1),
        #     (initial_datetime + timedelta(hours=10), 1),
        #     (initial_datetime + timedelta(hours=11), 1),
        #     (initial_datetime + timedelta(hours=12), 1),
        #     (initial_datetime + timedelta(hours=13), 1),
        #     (initial_datetime + timedelta(hours=14), 1),
        #     (initial_datetime + timedelta(hours=15), 1),
        #     (initial_datetime + timedelta(hours=16), 1),
        #     (initial_datetime + timedelta(hours=17), 1),
        #     (initial_datetime + timedelta(hours=18), 1),
        #     (initial_datetime + timedelta(hours=19), 1),
        #     (initial_datetime + timedelta(hours=20), 1),
        #     (initial_datetime + timedelta(hours=21), 1),
        #     (initial_datetime + timedelta(hours=22), 1),
        #     (initial_datetime + timedelta(hours=23), 1)
        # ]
        distribution_weighted_datetimes = [
            (initial_datetime + timedelta(hours=i),
             travel_requests_simulator_datetime_distribution_weights[i])
            for i in range(0, 24)
        ]
        datetime_population = [
            val for val, cnt in distribution_weighted_datetimes
            for i in range(cnt)
        ]
        travel_request_documents = []
        maximum_client_id = self.mongodb_database_connection.get_maximum_or_minimum(
            collection='travel_request')

        for i in range(0, number_of_travel_request_documents):
            client_id = maximum_client_id + 1
            maximum_client_id = client_id
            starting_bus_stop_index = random.randint(0,
                                                     number_of_bus_stops - 2)
            starting_bus_stop = bus_stops[starting_bus_stop_index]
            ending_bus_stop_index = random.randint(starting_bus_stop_index + 1,
                                                   number_of_bus_stops - 1)
            ending_bus_stop = bus_stops[ending_bus_stop_index]
            additional_departure_time_interval = random.randint(0, 59)
            departure_datetime = (
                random.choice(datetime_population) +
                timedelta(minutes=additional_departure_time_interval))

            travel_request_document = {
                'client_id': client_id,
                'bus_line_id': bus_line_id,
                'starting_bus_stop': starting_bus_stop,
                'ending_bus_stop': ending_bus_stop,
                'departure_datetime': departure_datetime,
                'arrival_datetime': None,
                'starting_timetable_entry_index': None,
                'ending_timetable_entry_index': None
            }
            travel_request_documents.append(travel_request_document)

        # 4: The generated travel_request_documents are stored at the
        #    TravelRequests collection of the System Database.
        #
        self.mongodb_database_connection.insert_travel_request_documents(
            travel_request_documents=travel_request_documents)
Esempio n. 5
0
class MongodbDatabaseConnectionTester(object):
    def __init__(self):
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='initialize_mongodb_database_connection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection = MongodbDatabaseConnection(host=mongodb_host, port=mongodb_port)
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='initialize_mongodb_database_connection: finished - elapsed_time = ' +
                        str(self.elapsed_time) + ' sec')

    def clear_all_collections(self):
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_all_collections: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_all_collections()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_all_collections: finished - elapsed_time = ' +
                        str(self.elapsed_time) + ' sec')

    def clear_address_documents_collection(self):
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_address_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_address_documents_collection()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_address_documents_collection: finished - elapsed_time = ' +
                        str(self.elapsed_time) + ' sec')

    def clear_bus_line_documents_collection(self):
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_bus_line_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_bus_line_documents_collection()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_bus_line_documents_collection: finished - elapsed_time = ' +
                        str(self.elapsed_time) + ' sec')

    def clear_bus_stop_documents_collection(self):
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_bus_stop_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_bus_stop_documents_collection()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_bus_stop_documents_collection: finished - elapsed_time = ' +
                        str(self.elapsed_time) + ' sec')

    def clear_bus_stop_waypoints_documents_collection(self):
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_bus_stop_waypoints_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_bus_stop_waypoints_documents_collection()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_bus_stop_waypoints_documents_collection: finished - elapsed_time = ' +
                        str(self.elapsed_time) + ' sec')

    def clear_edge_documents_collection(self):
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_edge_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_edge_documents_collection()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_edge_documents_collection: finished - elapsed_time = ' +
                        str(self.elapsed_time) + ' sec')

    def clear_node_documents_collection(self):
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_node_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_node_documents_collection()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_node_documents_collection: finished - elapsed_time = ' +
                        str(self.elapsed_time) + ' sec')

    def clear_point_documents_collection(self):
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_point_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_point_documents_collection()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_point_documents_collection: finished - elapsed_time = ' +
                        str(self.elapsed_time) + ' sec')

    def clear_timetable_documents_collection(self):
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_timetable_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_timetable_documents_collection()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_timetable_documents_collection: finished - elapsed_time = ' +
                        str(self.elapsed_time) + ' sec')

    def clear_traffic_event_documents_collection(self):
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_traffic_event_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_traffic_event_documents_collection()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_traffic_event_documents_collection: finished - elapsed_time = ' +
                        str(self.elapsed_time) + ' sec')

    def clear_travel_request_documents_collection(self):
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_travel_request_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_travel_request_documents_collection()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_travel_request_documents_collection: finished - elapsed_time = ' +
                        str(self.elapsed_time) + ' sec')

    def clear_way_documents_collection(self):
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_way_documents_collection: starting')
        self.start_time = time.time()
        self.mongodb_database_connection.clear_way_documents_collection()
        self.elapsed_time = time.time() - self.start_time
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='clear_way_documents_collection: finished - elapsed_time = ' +
                        str(self.elapsed_time) + ' sec')

    def print_address_documents(self, object_ids=None, names=None, node_ids=None, counter=None):
        """
        Print multiple address_documents.

        address_document: {'_id', 'name', 'node_id', 'point': {'longitude', 'latitude'}}

        :param object_ids: [ObjectId]
        :param names: [string]
        :param node_ids: [int]
        :param counter: int
        :return: None
        """
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='print_address_documents')
        self.mongodb_database_connection.print_address_documents(
            object_ids=object_ids,
            names=names,
            node_ids=node_ids,
            counter=counter
        )

    def print_bus_line_documents(self, object_ids=None, line_ids=None, counter=None):
        """
        Print multiple bus_line_documents.

        bus_line_document: {
            '_id', 'line_id', 'bus_stops': [{'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}}]
        }
        :param object_ids: [ObjectId]
        :param line_ids: [int]
        :param counter: int
        :return: None
        """
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='print_bus_line_documents')
        self.mongodb_database_connection.print_bus_line_documents(
            object_ids=object_ids,
            line_ids=line_ids,
            counter=counter
        )

    def print_bus_stop_documents(self, object_ids=None, osm_ids=None, names=None, counter=None):
        """
        Print multiple bus_stop_documents.

        bus_stop_document: {'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}}

        :param object_ids: [ObjectId]
        :param osm_ids: [int]
        :param names: [string]
        :param counter: int
        :return: None
        """
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='print_bus_stop_documents')
        self.mongodb_database_connection.print_bus_stop_documents(
            object_ids=object_ids,
            osm_ids=osm_ids,
            names=names,
            counter=counter
        )

    def print_bus_stop_waypoints_documents(self, object_ids=None, bus_stops=None, bus_stop_names=None, line_id=None):
        """
        Print multiple bus_stop_waypoints_documents.

        bus_stop_waypoints_document: {
            '_id', 'starting_bus_stop': {'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}},
            'ending_bus_stop': {'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}},
            'waypoints': [[edge_object_id]]
        }
        :param object_ids: [ObjectId]
        :param bus_stops: [{'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}}]
        :param bus_stop_names: [string]
        :param line_id: int
        :return: None
        """
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='print_bus_stop_waypoints_documents')
        self.mongodb_database_connection.print_bus_stop_waypoints_documents(
            object_ids=object_ids,
            bus_stops=bus_stops,
            bus_stop_names=bus_stop_names,
            line_id=line_id
        )

    def print_detailed_bus_stop_waypoints_documents(self, object_ids=None, bus_stops=None,
                                                    bus_stop_names=None, line_id=None):
        """
        Print multiple detailed_bus_stop_waypoints_documents.

        edge_document: {
            '_id', 'starting_node': {'osm_id', 'point': {'longitude', 'latitude'}},
            'ending_node': {'osm_id', 'point': {'longitude', 'latitude'}},
            'max_speed', 'road_type', 'way_id', 'traffic_density'
        }
        bus_stop_waypoints_document: {
            '_id', 'starting_bus_stop': {'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}},
            'ending_bus_stop': {'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}},
            'waypoints': [[edge_object_id]]
        }
        detailed_bus_stop_waypoints_document: {
            '_id', 'starting_bus_stop': {'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}},
            'ending_bus_stop': {'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}},
            'waypoints': [[edge_document]]
        }
        :param object_ids: [ObjectId]
        :param bus_stops: [{'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}}]
        :param bus_stop_names: [string]
        :param line_id: int
        :return: None
        """
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='print_detailed_bus_stop_waypoints_documents')
        self.mongodb_database_connection.print_detailed_bus_stop_waypoints_documents(
            object_ids=object_ids,
            bus_stops=bus_stops,
            bus_stop_names=bus_stop_names,
            line_id=line_id
        )

    def print_edge_documents(self, object_ids=None, starting_node_osm_id=None, ending_node_osm_id=None, counter=None):
        """
        Print multiple edge_documents.

        edge_document: {
            '_id', 'starting_node': {'osm_id', 'point': {'longitude', 'latitude'}},
            'ending_node': {'osm_id', 'point': {'longitude', 'latitude'}},
            'max_speed', 'road_type', 'way_id', 'traffic_density'
        }
        :param object_ids: [ObjectId]
        :param starting_node_osm_id: int
        :param ending_node_osm_id: int
        :param counter: int
        :return: None
        """
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='print_edge_documents')
        self.mongodb_database_connection.print_edge_documents(
            object_ids=object_ids,
            starting_node_osm_id=starting_node_osm_id,
            ending_node_osm_id=ending_node_osm_id,
            counter=counter
        )

    def print_node_documents(self, object_ids=None, osm_ids=None, counter=None):
        """
        Print multiple node_documents.

        node_document: {'_id', 'osm_id', 'tags', 'point': {'longitude', 'latitude'}}

        :param object_ids: [ObjectId]
        :param osm_ids: [int]
        :param counter: int
        :return: None
        """
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='print_node_documents')
        self.mongodb_database_connection.print_node_documents(
            object_ids=object_ids,
            osm_ids=osm_ids,
            counter=counter
        )

    def print_point_documents(self, object_ids=None, osm_ids=None, counter=None):
        """
        Print multiple point_documents.

        point_document: {'_id', 'osm_id', 'point': {'longitude', 'latitude'}}

        :param object_ids: [ObjectId]
        :param osm_ids: [int]
        :param counter: int
        :return: None
        """
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='print_point_documents')
        self.mongodb_database_connection.print_point_documents(
            object_ids=object_ids,
            osm_ids=osm_ids,
            counter=counter
        )

    def print_timetable_documents(self, object_ids=None, line_ids=None, counter=None, timetables_control=True,
                                  timetable_entries_control=False, travel_requests_control=False):
        """
        Print multiple timetable_documents.

        timetable_document: {
            '_id', 'line_id',
            'timetable_entries': [{
                'starting_bus_stop': {'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}},
                'ending_bus_stop': {'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}},
                'departure_datetime', 'arrival_datetime', 'total_time', 'number_of_onboarding_passengers',
                'number_of_deboarding_passengers', 'number_of_current_passengers'}],
            'travel_requests': [{
                '_id', 'client_id', 'line_id',
                'starting_bus_stop': {'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}},
                'ending_bus_stop': {'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}},
                'departure_datetime', 'arrival_datetime',
                'starting_timetable_entry_index', 'ending_timetable_entry_index'}]
        }
        :param object_ids: [ObjectId]
        :param line_ids: [int]
        :param counter: int
        :param timetables_control: bool
        :param timetable_entries_control: bool
        :param travel_requests_control: bool
        :return: timetable_documents: [timetable_document]
        """
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='print_timetable_documents')
        self.mongodb_database_connection.print_timetable_documents(
            object_ids=object_ids,
            line_ids=line_ids,
            counter=counter,
            timetables_control=timetables_control,
            timetable_entries_control=timetable_entries_control,
            travel_requests_control=travel_requests_control
        )

    def print_traffic_density_documents(self, bus_stops=None, bus_stop_names=None):
        """
        Print multiple traffic_density_documents.

        traffic_density_document: {
            'starting_bus_stop': {'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}},
            'ending_bus_stop': {'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}},
            'traffic_density_values': [[{'edge_object_id', 'traffic_density'}]]
        }
        :param bus_stops: [{'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}}]
        :param bus_stop_names: [string]
        :return: None
        """
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='print_traffic_density_documents')
        self.mongodb_database_connection.print_traffic_density_documents(
            bus_stops=bus_stops,
            bus_stop_names=bus_stop_names
        )

    def print_travel_request_documents(self, object_ids=None, client_ids=None, line_ids=None,
                                       min_departure_datetime=None, max_departure_datetime=None,
                                       counter=None):
        """
        Print multiple travel_request_documents.

        travel_request_document: {
            '_id', 'client_id', 'line_id',
            'starting_bus_stop': {'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}},
            'ending_bus_stop': {'_id', 'osm_id', 'name', 'point': {'longitude', 'latitude'}},
            'departure_datetime', 'arrival_datetime',
            'starting_timetable_entry_index', 'ending_timetable_entry_index'
        }
        :param object_ids: [ObjectId]
        :param client_ids: [int]
        :param line_ids: [int]
        :param min_departure_datetime: datetime
        :param max_departure_datetime: datetime
        :param counter: int
        :return: None
        """
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='print_travel_request_documents')
        self.mongodb_database_connection.print_travel_request_documents(
            object_ids=object_ids,
            client_ids=client_ids,
            line_ids=line_ids,
            min_departure_datetime=min_departure_datetime,
            max_departure_datetime=max_departure_datetime,
            counter=counter
        )

    def print_way_documents(self, object_ids=None, osm_ids=None, counter=None):
        """
        Print multiple way_documents.

        way_document: {'_id', 'osm_id', 'tags', 'references'}

        :param object_ids: [ObjectId]
        :param osm_ids: [int]
        :param counter: int
        :return: None
        """
        log(module_name='mongodb_database_connection_test', log_type='INFO',
            log_message='print_way_documents')
        self.mongodb_database_connection.print_way_documents(
            object_ids=object_ids,
            osm_ids=osm_ids,
            counter=counter
        )