use of org.liberty.android.fantastischmemo.entity.LearningData in project AnyMemo by helloworld1.
the class Mnemosyne2CardsImporter method xmlToCards.
/*
Sample format to parse:
<openSM2sync number_of_entries="10"><log type="10" o_id="epbt47DXNulRU8DsEtwtRp"><name>Category1</name></log>
<log type="10" o_id="5SfWDFGwqrlnGLDQxHHyG0"><name>Category2</name></log>
<log type="16" o_id="4pblLFgzF7vONXhjIQv5Rm"><b>Answer1</b><f>Qustion1</f></log>
<log type="16" o_id="QiQz84nC2tvMF5OKdPepaf"><b>Answer2</b><f>Question2</f></log>
<log type="16" o_id="hfoNwlcf0quuxpcWntyCZl"><b>Answer3</b><f>Question3</f></log>
<log type="16" o_id="7xmRCBH0WP0DZaxeFn5NLw"><b>Answer4</b><f>Question4</f></log>
<log card_t="1" fact_v="1.1" e="2.5" gr="-1" tags="epbt47DXNulRU8DsEtwtRp" rt_rp_l="0" lps="0" l_rp="-1" n_rp="-1" ac_rp_l="0" rt_rp="0" ac_rp="0" type="6" o_id="MDcIMVQJUGEjqR6DJoAqVm" fact="4pblLFgzF7vONXhjIQv5Rm"></log>
<log card_t="1" fact_v="1.1" e="2.5" gr="-1" tags="epbt47DXNulRU8DsEtwtRp" rt_rp_l="0" lps="0" l_rp="-1" n_rp="-1" ac_rp_l="0" rt_rp="0" ac_rp="0" type="6" o_id="iVwbE7q2QLPY4SJRS1AtqK" fact="QiQz84nC2tvMF5OKdPepaf"></log>
<log card_t="1" fact_v="1.1" e="2.5" gr="-1" tags="5SfWDFGwqrlnGLDQxHHyG0" rt_rp_l="0" lps="0" l_rp="-1" n_rp="-1" ac_rp_l="0" rt_rp="0" ac_rp="0" type="6" o_id="hW3JxWbfBOWoKDVQZ3jVQ1" fact="hfoNwlcf0quuxpcWntyCZl"></log>
<log card_t="1" fact_v="1.1" e="2.5" gr="-1" tags="5SfWDFGwqrlnGLDQxHHyG0" rt_rp_l="0" lps="0" l_rp="-1" n_rp="-1" ac_rp_l="0" rt_rp="0" ac_rp="0" type="6" o_id="7IXjCysHuCDtXo8hlFrK55" fact="7xmRCBH0WP0DZaxeFn5NLw"></log>
</openSM2sync>
*/
private List<Card> xmlToCards(File xmlFile) throws IOException, XmlPullParserException {
FileInputStream inputStream = new FileInputStream(xmlFile);
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(false);
XmlPullParser xpp = factory.newPullParser();
xpp.setInput(new BufferedReader(new InputStreamReader(inputStream)));
List<Card> cardList = null;
// Map between xml oid to card
Map<String, Card> cardOidMap = null;
// Map between xml oid to category
Map<String, Category> categoryOidMAP = null;
int lastType = 0;
int currentOrd = 1;
String lastOid = "";
ValueType lastValueType = null;
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_DOCUMENT) {
// Nothing
} else if (eventType == XmlPullParser.START_TAG) {
// <openSM2sync number_of_entries="10">
if (xpp.getName().equals("openSM2sync")) {
int cardCount = Integer.parseInt(xpp.getAttributeValue(null, "number_of_entries"));
cardList = new ArrayList<Card>(cardCount);
// The hash map is 0.75 full for performance and space.
// Use LinkedHashMap to maintain insertion order.
cardOidMap = new LinkedHashMap<String, Card>(cardCount * 4 / 3);
categoryOidMAP = new LinkedHashMap<String, Category>();
}
if (xpp.getName().equals("log")) {
lastType = Integer.parseInt(xpp.getAttributeValue(null, "type"));
lastOid = xpp.getAttributeValue(null, "o_id");
}
// <log type="10" o_id="5SfWDFGwqrlnGLDQxHHyG0"><name>Category2</name></log>
if (lastType == TAG_FIELD_TYPE && xpp.getName().equals("name")) {
lastValueType = ValueType.CARD_TAG;
}
// <log type="16" o_id="7xmRCBH0WP0DZaxeFn5NLw"><b>Answer4</b><f>Question4</f></log>
if (lastType == QA_FIELD_TYPE && xpp.getName().equals("f")) {
lastValueType = ValueType.CARD_FRONT;
}
if (lastType == QA_FIELD_TYPE && xpp.getName().equals("b")) {
lastValueType = ValueType.CARD_BACK;
}
// <log card_t="1" fact_v="1.1" e="2.5" gr="-1" tags="epbt47DXNulRU8DsEtwtRp" rt_rp_l="0" lps="0" l_rp="-1" n_rp="-1" ac_rp_l="0" rt_rp="0" ac_rp="0" type="6" o_id="MDcIMVQJUGEjqR6DJoAqVm" fact= "4pblLFgzF7vONXhjIQv5Rm"></log>
if (lastType == LEARNING_DATA_FIELD_TYPE) {
String tagOid = xpp.getAttributeValue(null, "tags");
String factOid = xpp.getAttributeValue(null, "fact");
LearningData ld = new LearningData();
ld.setEasiness(Float.parseFloat(xpp.getAttributeValue(null, "e")));
ld.setGrade(Integer.parseInt(xpp.getAttributeValue(null, "gr")));
ld.setRetReps(Integer.parseInt(xpp.getAttributeValue(null, "rt_rp_l")));
ld.setLapses(Integer.parseInt(xpp.getAttributeValue(null, "lps")));
ld.setLapses(Integer.parseInt(xpp.getAttributeValue(null, "lps")));
long nrp = Integer.parseInt(xpp.getAttributeValue(null, "n_rp"));
long lrp = Integer.parseInt(xpp.getAttributeValue(null, "l_rp"));
if (lrp != -1 && nrp != -1) {
ld.setLastLearnDate(new Date(lrp * 1000L));
ld.setNextLearnDate(new Date(nrp * 1000L));
}
ld.setAcqRepsSinceLapse(Integer.parseInt(xpp.getAttributeValue(null, "ac_rp_l")));
ld.setRetReps(Integer.parseInt(xpp.getAttributeValue(null, "rt_rp")));
ld.setAcqReps(Integer.parseInt(xpp.getAttributeValue(null, "ac_rp")));
// Now find the card that need this learning data
Card card = cardOidMap.get(factOid);
// The learning data is using the same id as card
ld.setId(card.getId());
// and also find out the corresponding tag for card's category
Category category = categoryOidMAP.get(tagOid);
if (tagOid.contains(",")) {
// If the card has multiple category, select only the first category.
String firstOid = tagOid.split(",")[0];
category = categoryOidMAP.get(firstOid);
} else {
category = categoryOidMAP.get(tagOid);
}
if (category == null) {
category = new Category();
}
card.setLearningData(ld);
card.setCategory(category);
}
} else if (eventType == XmlPullParser.TEXT) {
if (lastValueType == ValueType.CARD_TAG) {
Category category = new Category();
category.setName(xpp.getText());
categoryOidMAP.put(lastOid, category);
} else if (lastValueType == ValueType.CARD_FRONT) {
Card card = cardOidMap.get(lastOid);
if (card == null) {
card = new Card();
card.setId(currentOrd);
card.setOrdinal(currentOrd);
cardOidMap.put(lastOid, card);
cardList.add(card);
currentOrd++;
}
card.setQuestion(xpp.getText());
} else if (lastValueType == ValueType.CARD_BACK) {
Card card = cardOidMap.get(lastOid);
if (card == null) {
card = new Card();
card.setId(currentOrd);
card.setOrdinal(currentOrd);
cardOidMap.put(lastOid, card);
cardList.add(card);
currentOrd++;
}
card.setAnswer(xpp.getText());
}
} else if (eventType == XmlPullParser.END_TAG) {
if (xpp.getName().equals("log")) {
lastType = 0;
lastOid = "";
lastValueType = null;
}
}
eventType = xpp.next();
}
return cardList;
}
use of org.liberty.android.fantastischmemo.entity.LearningData in project AnyMemo by helloworld1.
the class SupermemoXMLImporter method startElement.
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
if (localName.equals("SuperMemoElement")) {
card = new Card();
card.setCategory(new Category());
ld = new LearningData();
card.setLearningData(ld);
// Set a default interval, in case of malformed the xml file
interval = 0;
}
characterBuf = new StringBuffer();
}
use of org.liberty.android.fantastischmemo.entity.LearningData in project AnyMemo by helloworld1.
the class CellsDBConverter method convertCellsToDb.
/* cardCells contains the question, answer, category and note
* category and note is optionally.
* learningDataCells contains all necessary learning data.
* If learningDataCells, new learning data is used.
* dbPath is the place to store converted database
*/
public void convertCellsToDb(Cells cardCells, Cells learningDataCells, String dbPath) throws IOException {
int numberOfRows = cardCells.getRowCounts();
int numberOfLearningDataRows = 0;
if (learningDataCells != null) {
numberOfLearningDataRows = learningDataCells.getRowCounts();
}
// We ignore the header row
List<Card> cardList = new ArrayList<Card>(numberOfRows + 1);
for (int i = 1; i < numberOfRows; i++) {
List<String> row = cardCells.getRow(i);
Card card = new Card();
Category category = new Category();
if (row.size() == 0) {
Log.w(TAG, "Each row in spreadsheet should have at least 2 column: question and answer. Row number: " + i);
}
if (row.size() >= 1) {
card.setQuestion(row.get(0));
}
if (row.size() >= 2) {
card.setAnswer(row.get(1));
}
if (row.size() >= 3) {
category.setName(row.get(2));
}
if (row.size() >= 4) {
card.setNote(row.get(3));
}
// This can't be null because numberOfLearningDataRows is 0
// if learningDataCells is 0.
LearningData learningData;
if (i < numberOfLearningDataRows) {
learningData = getLearningDataFromRow(learningDataCells.getRow(i));
} else {
learningData = new LearningData();
}
card.setCategory(category);
card.setLearningData(learningData);
cardList.add(card);
}
if (cardList.size() == 0) {
throw new IOException("Wrong spreadsheet format. The spreadsheet should contain at least 1 worksheet with at least 2 columns of questions and answers.");
}
AnyMemoDBOpenHelper helper = AnyMemoDBOpenHelperManager.getHelper(mContext, dbPath);
try {
CardDao cardDao = helper.getCardDao();
cardDao.createCards(cardList);
} finally {
AnyMemoDBOpenHelperManager.releaseHelper(helper);
}
}
use of org.liberty.android.fantastischmemo.entity.LearningData in project AnyMemo by helloworld1.
the class DefaultSchedulerTest method testScheduleLearnedCardFailure.
@SmallTest
@Test
public void testScheduleLearnedCardFailure() {
LearningData newLd = defaultScheduler.schedule(learnedCardLearningData, 0, false);
assertTrue(defaultScheduler.isCardForReview(newLd));
assertFalse(defaultScheduler.isCardNew(newLd));
assertFalse(defaultScheduler.isCardLearned(newLd));
}
use of org.liberty.android.fantastischmemo.entity.LearningData in project AnyMemo by helloworld1.
the class CardDaoImpl method getRandomReviewedCards.
public List<Card> getRandomReviewedCards(Category filterCategory, int limit) {
try {
LearningDataDao learningDataDao = getHelper().getLearningDataDao();
QueryBuilder<LearningData, Integer> learnQb = learningDataDao.queryBuilder();
learnQb.selectColumns("id");
learnQb.where().gt("acqReps", "0");
QueryBuilder<Card, Integer> cardQb = this.queryBuilder();
Where<Card, Integer> where = cardQb.where().in("learningData_id", learnQb);
if (filterCategory != null) {
where.and().eq("category_id", filterCategory.getId());
}
cardQb.setWhere(where);
// Return random ordered cards
cardQb.orderByRaw("random()");
cardQb.limit((long) limit);
List<Card> cs = cardQb.query();
for (Card c : cs) {
learningDataDao.refresh(c.getLearningData());
}
return cs;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
Aggregations