Search code examples
scalacouchbase-lite

couchbase lite - retrieving document properties after reopening database yields different result


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?


Solution

  • 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.