Skip to content

Commit 406047b

Browse files
feat: implement extractor of room historical environmental data
1 parent f00da57 commit 406047b

File tree

3 files changed

+47
-0
lines changed

3 files changed

+47
-0
lines changed

Diff for: src/main/kotlin/application/controller/RoomController.kt

+7
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,13 @@ class RoomController(
4444
this.roomDatabaseManager.findBy(roomId, dateTime)
4545
}
4646

47+
override fun getRoomEnvironmentalData(
48+
roomId: RoomID,
49+
start: Instant,
50+
end: Instant,
51+
): List<Pair<Instant, RoomEnvironmentalData>>? =
52+
this.roomDatabaseManager.getRoomEnvironmentalData(roomId, start, end)
53+
4754
override fun getRooms(): Set<Room> = this.roomDatabaseManager.getAllRooms()
4855

4956
override fun updateRoomEnvironmentalData(

Diff for: src/main/kotlin/application/service/RoomService.kt

+14
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,20 @@ object RoomService {
5252
override fun execute(): Room? = this.roomRepository.findBy(roomID, dateTime)
5353
}
5454

55+
/**
56+
* Application Service that has the object to obtain all the environmental data about a room, identified by
57+
* its [roomID], within a range of date [startDateTime] - [endDateTime] using the provided [roomRepository].
58+
*/
59+
class ExportRoomEnvironmentalData(
60+
private val roomID: RoomID,
61+
private val roomRepository: RoomRepository,
62+
private val startDateTime: Instant,
63+
private val endDateTime: Instant?
64+
) : ApplicationService<List<Pair<Instant, RoomEnvironmentalData>>?> {
65+
override fun execute(): List<Pair<Instant, RoomEnvironmentalData>>? =
66+
this.roomRepository.getRoomEnvironmentalData(roomID, startDateTime, endDateTime ?: Instant.now())
67+
}
68+
5569
/**
5670
* Application Service that has the objective of getting all the room that are inside the building using
5771
* the provided [roomRepository].

Diff for: src/main/kotlin/infrastructure/database/DatabaseManager.kt

+26
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,14 @@ import entity.zone.Room
2525
import entity.zone.RoomEnvironmentalData
2626
import entity.zone.RoomID
2727
import org.litote.kmongo.KMongo
28+
import org.litote.kmongo.ascendingSort
2829
import org.litote.kmongo.descendingSort
2930
import org.litote.kmongo.div
3031
import org.litote.kmongo.eq
3132
import org.litote.kmongo.find
3233
import org.litote.kmongo.findOne
3334
import org.litote.kmongo.getCollection
35+
import org.litote.kmongo.gt
3436
import org.litote.kmongo.lte
3537
import org.litote.kmongo.setValue
3638
import java.time.Instant
@@ -80,6 +82,30 @@ class DatabaseManager(customConnectionString: String? = null) : RoomDatabaseMana
8082
}.toRoomEnvironmentalData()
8183
)
8284

85+
override fun getRoomEnvironmentalData(
86+
roomId: RoomID,
87+
start: Instant,
88+
end: Instant,
89+
): List<Pair<Instant, RoomEnvironmentalData>>? {
90+
var roomCurrentData = this.findBy(roomId, start)?.environmentalData
91+
if (roomCurrentData != null) {
92+
// The room exist
93+
return this.roomTimeSeriesCollection.find(
94+
TimeSeriesRoomEnvironmentalData::metadata / TimeSeriesRoomMetadata::roomId eq roomId,
95+
TimeSeriesRoomEnvironmentalData::dateTime gt start,
96+
TimeSeriesRoomEnvironmentalData::dateTime lte end
97+
).ascendingSort(TimeSeriesRoomEnvironmentalData::dateTime).toList().map {
98+
// update current data about the room in order to have an update image of it
99+
val updatedRoom = mapOf(it.metadata.type to it).toRoomEnvironmentalData(roomCurrentData)
100+
roomCurrentData = updatedRoom
101+
// map the update to corresponding date time
102+
it.dateTime to updatedRoom
103+
}
104+
} else {
105+
return null // The room does not exist
106+
}
107+
}
108+
83109
override fun getAllRooms(): Set<Room> = this.roomCollection.find().toSet()
84110

85111
override fun updateRoomEnvironmentalData(

0 commit comments

Comments
 (0)