Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
CityDoctor
CityDoctor2
Commits
0a833640
Commit
0a833640
authored
Nov 07, 2025
by
Luna Riegel
Browse files
Refactor: Add querying for Features with errors
parent
6fce842e
Changes
4
Hide whitespace changes
Inline
Side-by-side
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/database/CityObjectCache.java
View file @
0a833640
...
@@ -21,4 +21,6 @@ public interface CityObjectCache {
...
@@ -21,4 +21,6 @@ public interface CityObjectCache {
void
resetCache
();
void
resetCache
();
List
<
GmlId
>
getErrorFeatureIds
();
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/database/DatabaseHandler.java
View file @
0a833640
...
@@ -68,7 +68,7 @@ public class DatabaseHandler {
...
@@ -68,7 +68,7 @@ public class DatabaseHandler {
}
}
}
}
try
(
PreparedStatement
createPs
=
con
.
prepareStatement
(
"CREATE TABLE features (gmlid VARCHAR(255)"
+
try
(
PreparedStatement
createPs
=
con
.
prepareStatement
(
"CREATE TABLE features (gmlid VARCHAR(255)"
+
" PRIMARY KEY, bbox GEOMETRY, data BLOB
)
"
))
{
" PRIMARY KEY, bbox GEOMETRY, data BLOB
, errors BOOLEAN);
"
))
{
createPs
.
executeUpdate
();
createPs
.
executeUpdate
();
if
(
logger
.
isDebugEnabled
())
{
if
(
logger
.
isDebugEnabled
())
{
logger
.
debug
(
"Created features table"
);
logger
.
debug
(
"Created features table"
);
...
@@ -88,10 +88,16 @@ public class DatabaseHandler {
...
@@ -88,10 +88,16 @@ public class DatabaseHandler {
*/
*/
public
void
marshallCityObject
(
CityObject
co
)
{
public
void
marshallCityObject
(
CityObject
co
)
{
try
(
Connection
con
=
dataSource
.
getConnection
())
{
try
(
Connection
con
=
dataSource
.
getConnection
())
{
try
(
PreparedStatement
ps
=
con
.
prepareStatement
(
"MERGE INTO features VALUES (?, ?, ?)"
))
{
try
(
PreparedStatement
ps
=
con
.
prepareStatement
(
"MERGE INTO features VALUES (?, ?,
?,
?)"
))
{
ps
.
setString
(
1
,
co
.
getGmlId
().
toString
());
ps
.
setString
(
1
,
co
.
getGmlId
().
toString
());
String
bbox
=
BoundingBox
.
of
(
co
).
to2DWkt
();
String
bbox
=
BoundingBox
.
of
(
co
).
to2DWkt
();
ps
.
setString
(
2
,
bbox
);
ps
.
setString
(
2
,
bbox
);
if
(
co
.
isValidated
())
{
ps
.
setBoolean
(
4
,
co
.
hasAnyError
());
}
else
{
ps
.
setNull
(
4
,
java
.
sql
.
Types
.
BOOLEAN
);
}
if
(
logger
.
isDebugEnabled
())
{
if
(
logger
.
isDebugEnabled
())
{
logger
.
debug
(
"Attempting to serialize CityObject: {} "
,
co
);
logger
.
debug
(
"Attempting to serialize CityObject: {} "
,
co
);
}
}
...
@@ -116,7 +122,7 @@ public class DatabaseHandler {
...
@@ -116,7 +122,7 @@ public class DatabaseHandler {
// Id String for error logging
// Id String for error logging
String
id
=
""
;
String
id
=
""
;
try
(
Connection
con
=
dataSource
.
getConnection
())
{
try
(
Connection
con
=
dataSource
.
getConnection
())
{
try
(
PreparedStatement
ps
=
con
.
prepareStatement
(
"MERGE INTO features VALUES (?, ?, ?)"
))
{
try
(
PreparedStatement
ps
=
con
.
prepareStatement
(
"MERGE INTO features VALUES (?, ?,
?,
?)"
))
{
con
.
setAutoCommit
(
false
);
con
.
setAutoCommit
(
false
);
for
(
Map
.
Entry
<
GmlId
,
CityObject
>
entry
:
map
.
entrySet
())
{
for
(
Map
.
Entry
<
GmlId
,
CityObject
>
entry
:
map
.
entrySet
())
{
CityObject
co
=
entry
.
getValue
();
CityObject
co
=
entry
.
getValue
();
...
@@ -127,6 +133,12 @@ public class DatabaseHandler {
...
@@ -127,6 +133,12 @@ public class DatabaseHandler {
if
(
logger
.
isTraceEnabled
())
{
if
(
logger
.
isTraceEnabled
())
{
logger
.
trace
(
"Attempting to serialize CityObject: {} "
,
co
);
logger
.
trace
(
"Attempting to serialize CityObject: {} "
,
co
);
}
}
if
(
co
.
isValidated
())
{
ps
.
setBoolean
(
4
,
co
.
hasAnyError
());
}
else
{
ps
.
setNull
(
4
,
java
.
sql
.
Types
.
BOOLEAN
);
}
try
{
try
{
byte
[]
bytes
=
SerializationUtils
.
serialize
(
co
);
byte
[]
bytes
=
SerializationUtils
.
serialize
(
co
);
ByteArrayInputStream
bis
=
new
ByteArrayInputStream
(
bytes
);
ByteArrayInputStream
bis
=
new
ByteArrayInputStream
(
bytes
);
...
@@ -161,7 +173,7 @@ public class DatabaseHandler {
...
@@ -161,7 +173,7 @@ public class DatabaseHandler {
public
CityObject
unmarshallCityObject
(
GmlId
id
)
{
public
CityObject
unmarshallCityObject
(
GmlId
id
)
{
try
(
Connection
con
=
dataSource
.
getConnection
())
{
try
(
Connection
con
=
dataSource
.
getConnection
())
{
try
(
PreparedStatement
ps
=
con
.
prepareStatement
(
try
(
PreparedStatement
ps
=
con
.
prepareStatement
(
"SELECT
gmlid, bbox,
data FROM features WHERE gmlid = ?"
))
{
"SELECT data FROM features WHERE gmlid = ?"
))
{
ps
.
setString
(
1
,
id
.
toString
());
ps
.
setString
(
1
,
id
.
toString
());
ResultSet
rs
=
ps
.
executeQuery
();
ResultSet
rs
=
ps
.
executeQuery
();
if
(
rs
.
next
())
{
if
(
rs
.
next
())
{
...
@@ -188,6 +200,22 @@ public class DatabaseHandler {
...
@@ -188,6 +200,22 @@ public class DatabaseHandler {
return
null
;
return
null
;
}
}
public
List
<
GmlId
>
getIdsOfAllCityObjectsWithErrors
(){
List
<
GmlId
>
ids
=
new
ArrayList
<>();
try
(
Connection
con
=
dataSource
.
getConnection
()){
try
(
PreparedStatement
ps
=
con
.
prepareStatement
(
"SELECT gmlid FROM features WHERE errors = TRUE"
))
{
ResultSet
rs
=
ps
.
executeQuery
();
while
(
rs
.
next
())
{
ids
.
add
(
new
GmlId
(
rs
.
getString
(
"gmlid"
)));
}
}
}
catch
(
SQLException
e
)
{
logger
.
error
(
"Fetching ids of all features with errors failed!"
);
logger
.
error
(
e
.
getMessage
());
}
return
ids
;
}
public
List
<
CityObject
>
getAllCityObjects
()
{
public
List
<
CityObject
>
getAllCityObjects
()
{
List
<
CityObject
>
cos
=
new
ArrayList
<>();
List
<
CityObject
>
cos
=
new
ArrayList
<>();
try
(
Connection
con
=
new
ConnectionWrapper
(
H2GISDBFactory
.
openSpatialDataBase
(
DB_NAME
)))
{
try
(
Connection
con
=
new
ConnectionWrapper
(
H2GISDBFactory
.
openSpatialDataBase
(
DB_NAME
)))
{
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/database/FeatureCache.java
View file @
0a833640
...
@@ -25,14 +25,12 @@ public class FeatureCache implements CityObjectCache{
...
@@ -25,14 +25,12 @@ public class FeatureCache implements CityObjectCache{
private
static
final
Logger
logger
=
LogManager
.
getLogger
(
FeatureCache
.
class
);
private
static
final
Logger
logger
=
LogManager
.
getLogger
(
FeatureCache
.
class
);
private
final
LoadingCache
<
GmlId
,
CityObject
>
cache
;
private
final
LoadingCache
<
GmlId
,
CityObject
>
cache
;
private
DatabaseHandler
handler
;
private
final
DatabaseHandler
handler
;
private
final
Map
<
String
,
DatabaseHandler
>
handlerList
=
new
HashMap
<>();
private
AtomicInteger
putsCounter
=
new
AtomicInteger
(
0
);
private
AtomicInteger
putsCounter
=
new
AtomicInteger
(
0
);
private
boolean
parsingFinished
=
false
;
private
boolean
parsingFinished
=
false
;
FeatureCache
()
{
FeatureCache
()
{
handler
=
new
DatabaseHandler
();
handler
=
new
DatabaseHandler
();
handler
.
setupFeaturesTable
();
cache
=
Caffeine
.
newBuilder
().
maximumSize
(
3000
).
removalListener
((
GmlId
key
,
CityObject
value
,
RemovalCause
cause
)
->
{
cache
=
Caffeine
.
newBuilder
().
maximumSize
(
3000
).
removalListener
((
GmlId
key
,
CityObject
value
,
RemovalCause
cause
)
->
{
if
(
value
!=
null
&&
cause
.
wasEvicted
())
{
if
(
value
!=
null
&&
cause
.
wasEvicted
())
{
handler
.
marshallCityObject
(
value
);
handler
.
marshallCityObject
(
value
);
...
@@ -84,14 +82,6 @@ public class FeatureCache implements CityObjectCache{
...
@@ -84,14 +82,6 @@ public class FeatureCache implements CityObjectCache{
public
void
changeFileName
(
String
fileName
){
handler
=
handlerList
.
computeIfAbsent
(
fileName
,
k
->
{
DatabaseHandler
handler1
=
new
DatabaseHandler
();
handler1
.
setupFeaturesTable
();
return
handler1
;
});
}
public
void
preCacheFeatures
(
List
<
GmlId
>
ids
)
{
public
void
preCacheFeatures
(
List
<
GmlId
>
ids
)
{
cache
.
getAll
(
ids
);
cache
.
getAll
(
ids
);
}
}
...
@@ -120,6 +110,11 @@ public class FeatureCache implements CityObjectCache{
...
@@ -120,6 +110,11 @@ public class FeatureCache implements CityObjectCache{
parsingFinished
=
false
;
parsingFinished
=
false
;
}
}
@Override
public
List
<
GmlId
>
getErrorFeatureIds
()
{
return
handler
.
getIdsOfAllCityObjectsWithErrors
();
}
public
void
finishParsing
()
{
public
void
finishParsing
()
{
if
(!
parsingFinished
)
{
if
(!
parsingFinished
)
{
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/database/UnconnectedCache.java
View file @
0a833640
...
@@ -4,6 +4,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
...
@@ -4,6 +4,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import
de.hft.stuttgart.citydoctor2.datastructure.GmlId
;
import
de.hft.stuttgart.citydoctor2.datastructure.GmlId
;
import
de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException
;
import
de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map
;
...
@@ -48,4 +49,15 @@ public class UnconnectedCache implements CityObjectCache{
...
@@ -48,4 +49,15 @@ public class UnconnectedCache implements CityObjectCache{
public
void
resetCache
(){
public
void
resetCache
(){
//
//
}
}
@Override
public
List
<
GmlId
>
getErrorFeatureIds
()
{
List
<
GmlId
>
errorFeatureIds
=
new
ArrayList
<>();
cache
.
forEach
((
gmlId
,
cityObject
)
->{
if
(
cityObject
.
containsAnyError
()){
errorFeatureIds
.
add
(
cityObject
.
getGmlId
());
}
});
return
errorFeatureIds
;
}
}
}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment