Skip to content

Commit 39bb2be

Browse files
committed
Updated store change set realm DB, removed dependancy on edited record, moved osm element creation to change set
now we able to answer the quest
1 parent 88d432f commit 39bb2be

File tree

6 files changed

+55
-32
lines changed

6 files changed

+55
-32
lines changed

GoInfoGame/GoInfoGame/DataBase/DBModels/StoredChangeset.swift

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import Foundation
99

1010
import RealmSwift
1111
import osmparser
12+
import CoreLocation
13+
import osmapi
1214

1315
enum StoredElementEnum: String, PersistableEnum {
1416
case node
@@ -21,8 +23,29 @@ class StoredChangeset: Object {
2123
@Persisted(primaryKey: true) var id: String = UUID().uuidString // Internal ID
2224
// Type of change -> can be node or way
2325
@Persisted var elementType : StoredElementEnum = .unknown
24-
@Persisted var elementId: String = "" // The ID of the element
26+
@Persisted var elementId: Int // The ID of the element
2527
@Persisted var tags = Map<String,String>()
28+
@Persisted var originalTags = Map<String,String>()
2629
@Persisted var changesetId: Int = -1 // Initial value of changeset // To be figured out later as index
2730
@Persisted var timestamp : String = "" // User time stamp
31+
@Persisted var version: Int = 0
32+
@Persisted var point: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0)
33+
@Persisted var nodes: List<Int64> = List<Int64>()
34+
35+
public func asOSMWay() -> OSMWay {
36+
var storage = originalTags.toDictionary()
37+
for tag in tags {
38+
storage[tag.key] = tag.value
39+
}
40+
let nodes = Array(nodes.map { Int($0) })
41+
return OSMWay(type: "way", id: elementId, timestamp: Date(), version: version, changeset: -1, user: "", uid: -1, nodes: nodes, tags: storage)
42+
}
43+
44+
public func asOSMNode() -> OSMNode {
45+
var storage = originalTags.toDictionary()
46+
for tag in tags {
47+
storage[tag.key] = tag.value
48+
}
49+
return OSMNode(type: "node", id: elementId, lat: point.latitude, lon: point.longitude, timestamp: Date(), version: version, changeset: -1, user: "", uid: -1, tags: storage)
50+
}
2851
}

GoInfoGame/GoInfoGame/DataBase/DBModels/StoredNode.swift

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,4 @@ class StoredNode : Object {
3737
let n = Node(id: Int64(id), version: version, tags: theTags, timestampEdited: 0, position: position)
3838
return n
3939
}
40-
41-
public func asOSMNode() -> OSMNode {
42-
var storage = [String: String]()
43-
for tag in tags {
44-
storage[tag.key] = tag.value
45-
}
46-
return OSMNode(type: "node", id: id, lat: point.latitude, lon: point.longitude, timestamp: Date(), version: version, changeset: -1, user: "", uid: -1, tags: storage)
47-
}
4840
}

GoInfoGame/GoInfoGame/DataBase/DBModels/StoredWay.swift

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,4 @@ class StoredWay: Object {
5959
way.polyline = latLong
6060
return way
6161
}
62-
63-
public func asOSMWay() -> OSMWay {
64-
var storage = [String: String]()
65-
for tag in tags {
66-
storage[tag.key] = tag.value
67-
}
68-
let nodes = Array(nodes.map { Int($0) })
69-
return OSMWay(type: "way", id: id, timestamp: Date(), version: version, changeset: -1, user: "", uid: -1, nodes: nodes, tags: storage)
70-
}
7162
}

GoInfoGame/GoInfoGame/DataBase/DatabaseConnector.swift

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,14 +369,27 @@ class DatabaseConnector {
369369
- parameter tags [String:String] tags changed with this
370370
- Returns: An instance of `StoredChangeset`
371371
*/
372-
func createChangeset(id:String, type: StoredElementEnum, tags:[String:String]) -> StoredChangeset? {
372+
func createChangeset(id:Int, type: StoredElementEnum, originalTags:[String:String], tags:[String:String], version: Int, point: CLLocationCoordinate2D? = nil, nodes: List<Int64>? = nil) -> StoredChangeset? {
373373
let storedChangeset = StoredChangeset()
374374
storedChangeset.elementId = id
375375
storedChangeset.elementType = type
376+
storedChangeset.version = version
377+
if let point = point {
378+
storedChangeset.point = point
379+
}
380+
if let nodes = nodes {
381+
storedChangeset.nodes = nodes
382+
}
383+
376384
storedChangeset.timestamp = String(Date().timeIntervalSince1970)
377385
for tag in tags {
378386
storedChangeset.tags.setValue(tag.value, forKey: tag.key)
379387
}
388+
389+
for tag in originalTags {
390+
storedChangeset.originalTags.setValue(tag.value, forKey: tag.key)
391+
}
392+
380393
do {
381394
try realm.write {
382395
realm.add(storedChangeset)

GoInfoGame/GoInfoGame/data/DatasyncManager.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,13 @@ class DatasyncManager {
6868
let intId = Int($0.elementId) ?? -1
6969
switch $0.elementType {
7070
case .way:
71-
let exists = self.dbInstance.getWay(id: intId, version: .edited) != nil
71+
let exists = self.dbInstance.getWay(id: intId, version: .original) != nil
7272
if !exists {
7373
print("⚠️ Edited way not found for ID: \(intId)")
7474
}
7575
return exists
7676
case .node:
77-
let exists = self.dbInstance.getNode(id: intId, version: .edited) != nil
77+
let exists = self.dbInstance.getNode(id: intId, version: .original) != nil
7878
if !exists {
7979
print("⚠️ Edited node not found for ID: \(intId)")
8080
}
@@ -86,17 +86,17 @@ class DatasyncManager {
8686

8787
print("📦 Found \(validChangesets.count) unsynced changesets with valid edits")
8888

89-
var nodesToSync: [String: StoredNode] = [:]
90-
var waysToSync: [String: StoredWay] = [:]
89+
var nodesToSync: [String: StoredChangeset] = [:]
90+
var waysToSync: [String: StoredChangeset] = [:]
9191

9292
for cs in validChangesets {
9393
let intId = Int(cs.elementId) ?? -1
9494
if cs.elementType == .node,
95-
let node = dbInstance.getNode(id: intId, version: .edited) {
96-
nodesToSync[cs.id] = node
95+
let node = dbInstance.getNode(id: intId, version: .original) {
96+
nodesToSync[cs.id] = cs
9797
} else if cs.elementType == .way,
98-
let way = dbInstance.getWay(id: intId, version: .edited) {
99-
waysToSync[cs.id] = way
98+
let way = dbInstance.getWay(id: intId, version: .original) {
99+
waysToSync[cs.id] = cs
100100
}
101101
}
102102

GoInfoGame/GoInfoGame/quests/QuestProtocols.swift

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,20 @@ class QuestBase {
4848

4949
// Convert from ElementType enum to StoredElementEnum
5050
let storedElementType: StoredElementEnum = type == .way ? .way : .node
51-
let storedId = String(id)
52-
// Create a changeset
53-
_ = DatabaseConnector.shared.createChangeset(id: storedId, type: storedElementType, tags: tags)
51+
5452
switch (storedElementType){
5553
case .way:
5654
elementSubmittingToPOSM = .way
57-
_ = DatabaseConnector.shared.addWayTags(id: storedId, tags: tags)
55+
// _ = DatabaseConnector.shared.addWayTags(id: storedId, tags: tags)
56+
let way = DatabaseConnector.shared.getWay(id: Int(id), version: .original)!
57+
// Create a changeset
58+
_ = DatabaseConnector.shared.createChangeset(id: Int(id), type: storedElementType, originalTags: way.tags.toDictionary(), tags: tags, version: way.version, nodes: way.nodes)
5859
case .node:
5960
elementSubmittingToPOSM = .node
60-
_ = DatabaseConnector.shared.addNodeTags(id: storedId, tags: tags)
61+
// _ = DatabaseConnector.shared.addNodeTags(id: storedId, tags: tags)
62+
let node = DatabaseConnector.shared.getNode(id: Int(id), version: .original)!
63+
// Create a changeset
64+
_ = DatabaseConnector.shared.createChangeset(id: Int(id), type: storedElementType, originalTags: node.tags.toDictionary(), tags: tags, version: node.version, point: node.point)
6165
case .unknown:
6266
print("Unknown Stored element type received")
6367
}

0 commit comments

Comments
 (0)