Skip to content

Commit

Permalink
feat: #100 Add LetterAssessmentEvent
Browse files Browse the repository at this point in the history
- Export assessment events to CSV
  • Loading branch information
nya-elimu committed Jan 29, 2021
1 parent cebfc54 commit 9eb8ffd
Show file tree
Hide file tree
Showing 2 changed files with 135 additions and 1 deletion.
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ dependencies {
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'com.google.android.material:material:1.2.1'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.work:work-runtime:2.4.0'
implementation 'androidx.work:work-runtime:2.5.0'
implementation 'org.apache.commons:commons-csv:1.8'
implementation 'commons-io:commons-io:2.8.0'

Expand Down
134 changes: 134 additions & 0 deletions app/src/main/java/ai/elimu/analytics/task/ExportEventsToCsvWorker.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,16 @@
import java.text.SimpleDateFormat;
import java.util.List;

import ai.elimu.analytics.dao.LetterAssessmentEventDao;
import ai.elimu.analytics.dao.LetterLearningEventDao;
import ai.elimu.analytics.dao.StoryBookLearningEventDao;
import ai.elimu.analytics.dao.WordAssessmentEventDao;
import ai.elimu.analytics.dao.WordLearningEventDao;
import ai.elimu.analytics.db.RoomDb;
import ai.elimu.analytics.entity.LetterAssessmentEvent;
import ai.elimu.analytics.entity.LetterLearningEvent;
import ai.elimu.analytics.entity.StoryBookLearningEvent;
import ai.elimu.analytics.entity.WordAssessmentEvent;
import ai.elimu.analytics.entity.WordLearningEvent;

public class ExportEventsToCsvWorker extends Worker {
Expand All @@ -37,7 +41,9 @@ public Result doWork() {
Log.i(getClass().getName(), "doWork");

exportLetterLearningEventsToCsv();
exportLetterAssessmentEventsToCsv();
exportWordLearningEventsToCsv();
exportWordAssessmentEventsToCsv();
exportStoryBookLearningEventsToCsv();

return Result.success();
Expand Down Expand Up @@ -105,6 +111,70 @@ private void exportLetterLearningEventsToCsv() {
}
}

private void exportLetterAssessmentEventsToCsv() {
Log.i(getClass().getName(), "exportLetterAssessmentEventsToCsv");

// Extract LetterAssessmentEvents from the database that have not yet been exported to CSV.
RoomDb roomDb = RoomDb.getDatabase(getApplicationContext());
LetterAssessmentEventDao letterAssessmentEventDao = roomDb.letterAssessmentEventDao();
List<LetterAssessmentEvent> letterAssessmentEvents = letterAssessmentEventDao.loadAllOrderedByTimeAsc();
Log.i(getClass().getName(), "letterAssessmentEvents.size(): " + letterAssessmentEvents.size());

CSVFormat csvFormat = CSVFormat.DEFAULT
.withHeader(
"id",
"time",
"android_id",
"package_name",
"letter_id",
"letter_text",
"mastery_score",
"time_spent_ms"
);
StringWriter stringWriter = new StringWriter();
try {
CSVPrinter csvPrinter = new CSVPrinter(stringWriter, csvFormat);

// Generate one CSV file per day of events
String dateOfPreviousEvent = null;
for (LetterAssessmentEvent letterAssessmentEvent : letterAssessmentEvents) {
// Export event to CSV file. Example format: "files/letter-assessment-events/7161a85a0e4751cd_letter-assessment-events_2020-03-21.csv"
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String date = simpleDateFormat.format(letterAssessmentEvent.getTime().getTime());
if (!date.equals(dateOfPreviousEvent)) {
// Reset file content
stringWriter = new StringWriter();
csvPrinter = new CSVPrinter(stringWriter, csvFormat);
}
dateOfPreviousEvent = date;
String csvFilename = letterAssessmentEvent.getAndroidId() + "_letter-assessment-events_" + date + ".csv";
Log.i(getClass().getName(), "csvFilename: " + csvFilename);

csvPrinter.printRecord(
letterAssessmentEvent.getId(),
letterAssessmentEvent.getTime().getTimeInMillis(),
letterAssessmentEvent.getAndroidId(),
letterAssessmentEvent.getPackageName(),
letterAssessmentEvent.getLetterId(),
letterAssessmentEvent.getLetterText(),
letterAssessmentEvent.getMasteryScore(),
letterAssessmentEvent.getTimeSpentMs()
);
csvPrinter.flush();

String csvFileContent = stringWriter.toString();

// Write the content to the CSV file
File filesDir = getApplicationContext().getFilesDir();
File letterAssessmentEventsDir = new File(filesDir, "letter-assessment-events");
File csvFile = new File(letterAssessmentEventsDir, csvFilename);
FileUtils.writeStringToFile(csvFile, csvFileContent, "UTF-8");
}
} catch (IOException e) {
Log.e(getClass().getName(), null, e);
}
}

private void exportWordLearningEventsToCsv() {
Log.i(getClass().getName(), "exportWordLearningEventsToCsv");

Expand Down Expand Up @@ -166,6 +236,70 @@ private void exportWordLearningEventsToCsv() {
Log.e(getClass().getName(), null, e);
}
}

private void exportWordAssessmentEventsToCsv() {
Log.i(getClass().getName(), "exportWordAssessmentEventsToCsv");

// Extract WordAssessmentEvents from the database that have not yet been exported to CSV.
RoomDb roomDb = RoomDb.getDatabase(getApplicationContext());
WordAssessmentEventDao wordAssessmentEventDao = roomDb.wordAssessmentEventDao();
List<WordAssessmentEvent> wordAssessmentEvents = wordAssessmentEventDao.loadAllOrderedByTimeAsc();
Log.i(getClass().getName(), "wordAssessmentEvents.size(): " + wordAssessmentEvents.size());

CSVFormat csvFormat = CSVFormat.DEFAULT
.withHeader(
"id",
"time",
"android_id",
"package_name",
"word_id",
"word_text",
"mastery_score",
"time_spent_ms"
);
StringWriter stringWriter = new StringWriter();
try {
CSVPrinter csvPrinter = new CSVPrinter(stringWriter, csvFormat);

// Generate one CSV file per day of events
String dateOfPreviousEvent = null;
for (WordAssessmentEvent wordAssessmentEvent : wordAssessmentEvents) {
// Export event to CSV file. Example format: "files/word-assessment-events/7161a85a0e4751cd_word-assessment-events_2020-03-21.csv"
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String date = simpleDateFormat.format(wordAssessmentEvent.getTime().getTime());
if (!date.equals(dateOfPreviousEvent)) {
// Reset file content
stringWriter = new StringWriter();
csvPrinter = new CSVPrinter(stringWriter, csvFormat);
}
dateOfPreviousEvent = date;
String csvFilename = wordAssessmentEvent.getAndroidId() + "_word-assessment-events_" + date + ".csv";
Log.i(getClass().getName(), "csvFilename: " + csvFilename);

csvPrinter.printRecord(
wordAssessmentEvent.getId(),
wordAssessmentEvent.getTime().getTimeInMillis(),
wordAssessmentEvent.getAndroidId(),
wordAssessmentEvent.getPackageName(),
wordAssessmentEvent.getWordId(),
wordAssessmentEvent.getWordText(),
wordAssessmentEvent.getMasteryScore(),
wordAssessmentEvent.getTimeSpentMs()
);
csvPrinter.flush();

String csvFileContent = stringWriter.toString();

// Write the content to the CSV file
File filesDir = getApplicationContext().getFilesDir();
File wordAssessmentEventsDir = new File(filesDir, "word-assessment-events");
File csvFile = new File(wordAssessmentEventsDir, csvFilename);
FileUtils.writeStringToFile(csvFile, csvFileContent, "UTF-8");
}
} catch (IOException e) {
Log.e(getClass().getName(), null, e);
}
}

private void exportStoryBookLearningEventsToCsv() {
Log.i(getClass().getName(), "exportStoryBookLearningEventsToCsv");
Expand Down

0 comments on commit 9eb8ffd

Please sign in to comment.