Retrieving document properties after reopening database yields different result. Please see the same document printed thrice below for an example.
Key pieces of code (full code available here) - you may like to see the main method first:
class QuoteInfoDb(language: Language) {
val log = LoggerFactory.getLogger(getClass.getName)
var quoteDb: Database = null
var annotationDb: Database = null
var dbManager: Manager = null
def openDatabases() = {
dbManager = new Manager(new JavaContext("data") {
override def getRootDirectory: File = {
val rootDirectoryPath = "/home/vvasuki/subhAShita-db-sanskrit"
new File(rootDirectoryPath)
}
}, Manager.DEFAULT_OPTIONS)
dbManager.setStorageType("ForestDB")
quoteDb = dbManager.getDatabase(s"quote_db__${language.code}")
annotationDb = dbManager.getDatabase(s"annotation_db__${language.code}")
}
def closeDatabases = {
quoteDb.close()
annotationDb.close()
}
def updateDocument(document: Document, jsonMap: Map[String,Object]) = {
document.update(new Document.DocumentUpdater() {
override def update(newRevision: UnsavedRevision): Boolean = {
val properties = newRevision.getUserProperties
properties.putAll(jsonMap.asJava)
newRevision.setUserProperties(properties)
true
}
})
}
def testQuoteWrite() = {
val jsonMap =Map("scriptRenderings"-> List(Map("text"-> "दण्डः शास्ति प्रजाः सर्वाः दण्ड एवाभिरक्षति। दण्डः सुप्तेषु जागर्ति दण्डं धर्मं विदुर्बुधाः।।", "scheme" -> "dev", "startLetter" -> "द")),
"jsonClass"->"QuoteText",
"language"->Map("code" -> "sa"),
"key"->"damDaHshaastiprajaaHsarvaaHdamDaevaabhiraxatidamDaHsupteShujaagartidamDamdharmamvidurbudhaaH"
)
val document = quoteDb.getDocument(jsonMap("key").toString)
updateDocument(document, jsonMap)
}
def testQuoteRetrieval() = {
val id = "damDaHshaastiprajaaHsarvaaHdamDaevaabhiraxatidamDaHsupteShujaagartidamDamdharmamvidurbudhaaH"
val doc = quoteDb.getDocument(id)
val jsonMap = doc.getUserProperties
log debug jsonMap.toString
}
}
object dbMakerSanskrit {
val log = LoggerFactory.getLogger(getClass.getName)
val quoteInfoDb = new QuoteInfoDb(language = Language("sa"))
def main(args: Array[String]): Unit = {
quoteInfoDb.openDatabases()
quoteInfoDb.testQuoteWrite()
quoteInfoDb.testQuoteRetrieval()
quoteInfoDb.closeDatabases
quoteInfoDb.openDatabases()
quoteInfoDb.testQuoteRetrieval()
quoteInfoDb.testQuoteRetrieval()
// quoteInfoDb.checkConflicts
// quoteInfoDb.exportToTsv
// log info s"Updated records ${vishvasaPriyaSamskritaPadyani.take(1).map(quoteInfoDb.addQuoteWithInfo(_)).sum} from vishvasaPriyaSamskritaPadyani"
}
}
yields the following output:
22:29:25 subhAShitaDb.QuoteInfoDb 130 --- {metre={defined=false, empty=true}, scriptRenderings=List(Map(text -> दण्डः शास्ति प्रजाः सर्वाः दण्ड एवाभिरक्षति। दण्डः सुप्तेषु जागर्ति दण्डं धर्मं विदुर्बुधाः।।, scheme -> dev, startLetter -> द)), jsonClass=QuoteText, language=Map(code -> sa), key=damDaHshaastiprajaaHsarvaaHdamDaevaabhiraxatidamDaHsupteShujaagartidamDamdharmamvidurbudhaaH}
22:29:25 subhAShitaDb.QuoteInfoDb 130 --- {metre={defined=false, empty=true}, scriptRenderings={empty=false, traversableAgain=true}, jsonClass=QuoteText, language={traversableAgain=true, empty=false}, key=damDaHshaastiprajaaHsarvaaHdamDaevaabhiraxatidamDaHsupteShujaagartidamDamdharmamvidurbudhaaH}
22:29:25 subhAShitaDb.QuoteInfoDb 130 --- {metre={defined=false, empty=true}, scriptRenderings={empty=false, traversableAgain=true}, jsonClass=QuoteText, language={traversableAgain=true, empty=false}, key=damDaHshaastiprajaaHsarvaaHdamDaevaabhiraxatidamDaHsupteShujaagartidamDamdharmamvidurbudhaaH}
How to ensure that I get a result similar to the first every time?
I was helped here. I was able to fix the code by recursively converting the scala map to a java map (using this tip) while writing to the database.