Skip to content

Commit cf1ad0c

Browse files
authored
feat: add string arrays to letter-sound events (#2313)
2 parents f3448e8 + e315b5b commit cf1ad0c

File tree

7 files changed

+267
-184
lines changed

7 files changed

+267
-184
lines changed

pom-dependency-tree.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
ai.elimu:webapp:war:2.6.108-SNAPSHOT
2-
+- ai.elimu:model:jar:model-2.0.117:compile
1+
ai.elimu:webapp:war:2.6.109-SNAPSHOT
2+
+- ai.elimu:model:jar:model-2.0.118:compile
33
| \- com.google.code.gson:gson:jar:2.13.1:compile
44
| \- com.google.errorprone:error_prone_annotations:jar:2.38.0:compile
55
+- org.springframework:spring-context:jar:6.0.11:compile

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<properties>
1010
<java.version>17</java.version>
1111
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
12-
<model.version>2.0.117</model.version>
12+
<model.version>2.0.118</model.version>
1313
<hibernate.version>6.1.7.Final</hibernate.version>
1414
<jetty.version>11.0.24</jetty.version>
1515
<spring.version>6.0.11</spring.version>

src/main/java/ai/elimu/entity/analytics/LetterSoundAssessmentEvent.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package ai.elimu.entity.analytics;
22

3+
import java.util.List;
4+
35
import ai.elimu.entity.content.LetterSound;
6+
import ai.elimu.entity.converters.StringListConverter;
7+
import jakarta.persistence.Convert;
48
import jakarta.persistence.Entity;
59
import jakarta.persistence.ManyToOne;
610
import jakarta.validation.constraints.NotNull;
@@ -16,13 +20,15 @@ public class LetterSoundAssessmentEvent extends AssessmentEvent {
1620
* The sequence of letters. E.g. <code>"sh"</code>.
1721
*/
1822
@NotNull
19-
private String letterSoundLetters;
23+
@Convert(converter = StringListConverter.class)
24+
private List<String> letterSoundLetters;
2025

2126
/**
2227
* The sequence of sounds (IPA values). E.g. <code>"ʃ"</code>.
2328
*/
2429
@NotNull
25-
private String letterSoundSounds;
30+
@Convert(converter = StringListConverter.class)
31+
private List<String> letterSoundSounds;
2632

2733
/**
2834
* This field might not be included, e.g. if the assessment task was done in a

src/main/java/ai/elimu/util/csv/CsvAnalyticsExtractionHelper.java

Lines changed: 200 additions & 172 deletions
Large diffs are not rendered by default.

src/main/java/ai/elimu/web/analytics/students/LetterSoundLearningEventsCsvExportController.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ public void handleRequest(
5454
"additional_data",
5555
"research_experiment",
5656
"experiment_group",
57-
// "letter_sound_letters",
58-
// "letter_sound_sounds",
57+
"letter_sound_letters",
58+
"letter_sound_sounds",
5959
"letter_sound_id"
6060
).build();
6161
StringWriter stringWriter = new StringWriter();
@@ -69,8 +69,8 @@ public void handleRequest(
6969
event.getAdditionalData(),
7070
(event.getResearchExperiment() != null) ? event.getResearchExperiment().ordinal() : null,
7171
(event.getExperimentGroup() != null) ? event.getExperimentGroup().ordinal() : null,
72-
// letterSoundLearningEvent.getLetterSoundLetters(),
73-
// letterSoundLearningEvent.getLetterSoundSounds(),
72+
event.getLetterSoundLetters(),
73+
event.getLetterSoundSounds(),
7474
event.getLetterSoundId()
7575
);
7676
}

src/test/java/ai/elimu/util/csv/CsvAnalyticsExtractionHelperTest.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package ai.elimu.util.csv;
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
4-
import static org.junit.jupiter.api.Assertions.assertNotNull;
54
import static org.junit.jupiter.api.Assertions.assertNull;
65
import static org.junit.jupiter.api.Assertions.assertTrue;
76

87
import java.io.File;
98
import java.io.IOException;
9+
import java.util.Arrays;
1010
import java.util.List;
1111

1212
import org.json.JSONObject;
@@ -29,8 +29,6 @@
2929

3030
public class CsvAnalyticsExtractionHelperTest {
3131

32-
// TODO: letter-sound assessment events
33-
3432
/**
3533
* Test extraction of data from CSV files generated by version 3002014 of the Analytics app:
3634
* https://github.com/elimu-ai/analytics/releases/tag/3.2.14
@@ -92,9 +90,37 @@ public void testExtractLetterSoundLearningEvents_v3005013() throws IOException {
9290
assertEquals("ai.elimu.herufi", letterSoundLearningEvent.getPackageName());
9391
assertNull(letterSoundLearningEvent.getResearchExperiment());
9492
assertNull(letterSoundLearningEvent.getExperimentGroup());
93+
assertEquals(Arrays.asList(), letterSoundLearningEvent.getLetterSoundLetters());
94+
assertEquals(Arrays.asList(), letterSoundLearningEvent.getLetterSoundSounds());
9595
assertEquals(1, letterSoundLearningEvent.getLetterSoundId());
9696
}
9797

98+
/**
99+
* Test extraction of data from CSV files generated by version 4001002 of the Analytics app:
100+
* https://github.com/elimu-ai/analytics/releases/tag/4.1.2
101+
*/
102+
@Test
103+
public void testExtractLetterSoundLearningEvents_v4001002() throws IOException {
104+
ResourceLoader resourceLoader = new ClassRelativeResourceLoader(CsvAnalyticsExtractionHelper.class);
105+
Resource resource = resourceLoader.getResource("5b7c682a12ecbe2e_4001002_letter-sound-learning-events_2025-07-28.csv");
106+
File csvFile = resource.getFile();
107+
108+
List<LetterSoundLearningEvent> letterSoundLearningEvents = CsvAnalyticsExtractionHelper.extractLetterSoundLearningEvents(csvFile);
109+
assertEquals(22, letterSoundLearningEvents.size());
110+
111+
LetterSoundLearningEvent letterSoundLearningEvent = letterSoundLearningEvents.get(0);
112+
assertEquals(1753693734 * 1_000L, letterSoundLearningEvent.getTimestamp().getTimeInMillis());
113+
assertEquals("5b7c682a12ecbe2e", letterSoundLearningEvent.getAndroidId());
114+
assertEquals("ai.elimu.herufi.debug", letterSoundLearningEvent.getPackageName());
115+
assertEquals(ResearchExperiment.EXP_0_WORD_EMOJIS, letterSoundLearningEvent.getResearchExperiment());
116+
assertEquals(ExperimentGroup.TREATMENT, letterSoundLearningEvent.getExperimentGroup());
117+
assertEquals(Arrays.asList("น"), letterSoundLearningEvent.getLetterSoundLetters());
118+
assertEquals(Arrays.asList("n"), letterSoundLearningEvent.getLetterSoundSounds());
119+
assertEquals(7, letterSoundLearningEvent.getLetterSoundId());
120+
}
121+
122+
// TODO: letter-sound assessment events
123+
98124

99125
/**
100126
* Test extraction of data from CSV files generated by version 3001030 of the Analytics app:
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
id,timestamp,package_name,additional_data,research_experiment,experiment_group,letter_sound_letters,letter_sound_sounds,letter_sound_id
2+
44,1753693734,ai.elimu.herufi.debug,,0,1,[น],[n],7
3+
45,1753693740,ai.elimu.herufi.debug,,0,1,[ก],[k],3
4+
46,1753693756,ai.elimu.herufi.debug,,0,1,[◌ั],[a],34
5+
47,1753694783,ai.elimu.herufi.debug,,0,1,[น],[n],7
6+
48,1753694800,ai.elimu.herufi.debug,,0,1,[ก],[k],3
7+
49,1753694805,ai.elimu.herufi.debug,,0,1,[◌ั],[a],34
8+
50,1753694807,ai.elimu.herufi.debug,,0,1,[◌า],[aː],13
9+
51,1753694813,ai.elimu.herufi.debug,,0,1,[◌อ],[ɔː],31
10+
52,1753694819,ai.elimu.herufi.debug,,0,1,[ข],[kʰ],38
11+
53,1753694821,ai.elimu.herufi.debug,,0,1,[จ],[tɕ],24
12+
54,1753694825,ai.elimu.herufi.debug,,0,1,[ไ◌],"[a, j]",40
13+
55,1753694846,ai.elimu.herufi.debug,,0,1,[ฉ],[tɕʰ],44
14+
56,1753694865,ai.elimu.herufi.debug,,0,1,[เ◌า],"[a, w]",69
15+
57,1753694871,ai.elimu.herufi.debug,,0,1,[แ◌ะ],[ɛ],70
16+
58,1753694877,ai.elimu.herufi.debug,,0,1,[เ◌อ],[ɤː],72
17+
59,1753694881,ai.elimu.herufi.debug,,0,1,[น],"[n, o]",62
18+
60,1753694885,ai.elimu.herufi.debug,,0,1,[เ◌ย],"[ɤː, j]",79
19+
61,1753694893,ai.elimu.herufi.debug,,0,1,"[ห, ล]",[l],65
20+
62,1753694897,ai.elimu.herufi.debug,,0,1,"[ห, ล]",[l],65
21+
63,1753694918,ai.elimu.herufi.debug,,0,1,"[ห, ย]",[y],59
22+
64,1753694930,ai.elimu.herufi.debug,,0,1,"[ท, ร]",[s],42
23+
65,1753695261,ai.elimu.herufi.debug,,0,1,[น],[n],7

0 commit comments

Comments
 (0)