use of com.ichi2.anki.CardBrowser.Column.LAPSES in project AnkiChinaAndroid by ankichinateam.
the class StudySettingActivity method updateValues.
private void updateValues() {
// new
JSONObject newOptions = mOptions.getJSONObject("new");
tx_max_learn_card.setText(newOptions.getString("perDay"));
mCurrentNewOrderValue = Integer.parseInt(newOptions.getString("order"));
tx_new_card_sequence.setText(mNewOrderMap.get(mCurrentNewOrderValue));
tx_interval_step.setText(StepsPreference.convertFromJSON(newOptions.getJSONArray("delays")));
// 毕业间隔
tx_interval_graduate.setText(newOptions.getJSONArray("ints").getString(0));
// 简单按钮间隔
tx_interval_simple.setText(newOptions.getJSONArray("ints").getString(1));
// 初始难度
tx_init_level.setText(String.valueOf(newOptions.getInt("initialFactor") / 10));
// rev
JSONObject revOptions = mOptions.getJSONObject("rev");
tx_max_review_card.setText(revOptions.getString("perDay"));
// 唯一一个全局设置
mCurrentStudyPreferenceValue = mCol.getConf().getInt("newSpread");
tx_learn_sequence.setText(mStudyPreferenceMap.get(mCurrentStudyPreferenceValue));
tx_medal_simple.setText(String.valueOf((int) Math.round((revOptions.getDouble("ease4") * 100))));
Timber.i("ivl fct:" + revOptions.getDouble("ivlFct"));
tx_interval_decoration.setText(String.valueOf((int) Math.round(revOptions.getDouble("ivlFct") * 100)));
tx_max_interval.setText(revOptions.getString("maxIvl"));
// lapses
JSONObject lapOptions = mOptions.getJSONObject("lapse");
tx_error_interval_step.setText(StepsPreference.convertFromJSON(lapOptions.getJSONArray("delays")));
tx_error_new_interval.setText(String.valueOf((int) Math.round(lapOptions.getDouble("mult") * 100)));
tx_error_min_interval.setText(lapOptions.getString("minInt"));
SharedPreferences sharedPreferences = getSharedPreferences(STUDY_SETTING, 0);
// mCurrentMindModeValue = sharedPreferences.getInt(KEY_MIND_MODE, 0);
String savedMindModeValue = sharedPreferences.getString(KEY_MIND_MODE, "");
Map<String, Integer> map = null;
try {
Gson gson = new Gson();
map = gson.fromJson(savedMindModeValue, new TypeToken<Map<String, Integer>>() {
}.getType());
} catch (Exception e) {
e.printStackTrace();
}
// Timber.i("我来取数据了 "+ map.get(mDeckIdStr));
mCurrentMindModeValue = map != null && map.get(mDeckIdStr) != null ? map.get(mDeckIdStr).intValue() : 0;
tx_algorithm.setText(mMindModeMap.get(mCurrentMindModeValue));
}
use of com.ichi2.anki.CardBrowser.Column.LAPSES in project AnkiChinaAndroid by ankichinateam.
the class SchedV2Test method filteredDeckSchedulingOptionsRegressionTest.
/**
* Reported by /u/CarelessSecretary9 on reddit:
*/
@Test
public void filteredDeckSchedulingOptionsRegressionTest() {
Collection col = getCol();
col.setCrt(1587852900L);
// 30 minutes learn ahead. required as we have 20m delay
col.getConf().put("collapseTime", 1800);
long homeDeckId = addDeck("Poorretention");
DeckConfig homeDeckConf = col.getDecks().confForDid(homeDeckId);
JSONObject lapse = homeDeckConf.getJSONObject("lapse");
lapse.put("minInt", 2);
lapse.put("mult", 0.7d);
lapse.put("delays", new JSONArray("[20]"));
ensureLapseMatchesSppliedAnkiDesktopConfig(lapse);
col.flush();
long dynId = addDynamicDeck("Dyn");
/*
>>> pp(self.reviewer.card)
{'data': '', 'did': 1587939535230, 'due': 0, 'factor': 1300, 'flags': 0, 'id': 1510928829863, 'ivl': 25,
'lapses': 5, 'left': 1004, 'mod': 1587921512, 'nid': 1510928805161, 'odid': 1587920944107,
'odue': 0, 'ord': 0, 'queue': 2, 'reps': 22, 'type': 2, 'usn': -1}
*/
Note n = addNoteUsingBasicModel("Hello", "World");
Card c = getOnlyElement(n.cards());
c.setType(Consts.CARD_TYPE_REV);
c.setQueue(Consts.QUEUE_TYPE_REV);
c.setIvl(25);
c.setDue(0);
c.setLapses(5);
c.setFactor(1300);
c.setLeft(1004);
c.setODid(homeDeckId);
c.setDid(dynId);
c.flush();
SchedV2 v2 = new SchedV2(col);
Card schedCard = v2.getCard();
assertThat(schedCard, Matchers.notNullValue());
v2.answerCard(schedCard, Consts.BUTTON_ONE);
assertThat("The lapsed card should now be counted as lrn", v2.mLrnCount, is(1));
Card after = v2.getCard();
assertThat("A card should be returned ", after, Matchers.notNullValue());
/* Data from Anki - pp(self.reviewer.card)
{'data': '', 'did': 1587939535230, 'due': 1587941137, 'factor': 1300,
'flags': 0, 'id': 1510928829863, 'ivl': 17, 'lapses': 6, 'left': 1001,
'mod': 1587939720, 'nid': 1510928805161, 'odid': 1587920944107, 'odue': 0,
'ord': 0, 'queue': 1, 'reps': 23, 'type': 3, 'usn': -1}
*/
assertThat(after.getType(), is(Consts.CARD_TYPE_RELEARNING));
assertThat(after.getQueue(), is(Consts.QUEUE_TYPE_LRN));
assertThat(after.getLeft(), is(1001));
assertThat("ivl is reduced by 70%", after.getIvl(), is(17));
assertThat("One lapse is added", after.getLapses(), is(6));
assertThat(v2.answerButtons(after), is(4));
long one = v2.nextIvl(after, Consts.BUTTON_ONE);
long two = v2.nextIvl(after, Consts.BUTTON_TWO);
long three = v2.nextIvl(after, Consts.BUTTON_THREE);
long four = v2.nextIvl(after, Consts.BUTTON_FOUR);
// 20 mins
assertThat("Again should pick the current step", one, is(1200L));
// 30 mins
assertThat("Repeating single step - 20 minutes * 1.5", two, is(1800L));
// 17 days
assertThat("Good should take the reduced interval (25 * 0.7)", three, is(1468800L));
// 18 days
assertThat("Easy should have a bonus day over good", four, is(1555200L));
}
use of com.ichi2.anki.CardBrowser.Column.LAPSES in project Anki-Android by ankidroid.
the class SchedV2Test method filteredDeckSchedulingOptionsRegressionTest.
/**
* Reported by /u/CarelessSecretary9 on reddit:
*/
@Test
public void filteredDeckSchedulingOptionsRegressionTest() {
Collection col = getCol();
col.setCrt(1587852900L);
// 30 minutes learn ahead. required as we have 20m delay
col.set_config("collapseTime", 1800);
long homeDeckId = addDeck("Poorretention");
DeckConfig homeDeckConf = col.getDecks().confForDid(homeDeckId);
JSONObject lapse = homeDeckConf.getJSONObject("lapse");
lapse.put("minInt", 2);
lapse.put("mult", 0.7d);
lapse.put("delays", new JSONArray("[20]"));
col.getDecks().save(homeDeckConf);
ensureLapseMatchesSppliedAnkiDesktopConfig(lapse);
col.flush();
long dynId = addDynamicDeck("Dyn");
/*
>>> pp(self.reviewer.card)
{'data': '', 'did': 1587939535230, 'due': 0, 'factor': 1300, 'flags': 0, 'id': 1510928829863, 'ivl': 25,
'lapses': 5, 'left': 1004, 'mod': 1587921512, 'nid': 1510928805161, 'odid': 1587920944107,
'odue': 0, 'ord': 0, 'queue': 2, 'reps': 22, 'type': 2, 'usn': -1}
*/
Note n = addNoteUsingBasicModel("Hello", "World");
Card c = getOnlyElement(n.cards());
c.setType(CARD_TYPE_REV);
c.setQueue(QUEUE_TYPE_REV);
c.setIvl(25);
c.setDue(0);
c.setLapses(5);
c.setFactor(1300);
c.setLeft(1004);
c.setODid(homeDeckId);
c.setDid(dynId);
c.flush();
SchedV2 v2 = new SchedV2(col);
Card schedCard = v2.getCard();
assertThat(schedCard, Matchers.notNullValue());
v2.answerCard(schedCard, BUTTON_ONE);
assertThat("The lapsed card should now be counted as lrn", v2.mLrnCount, is(1));
Card after = v2.getCard();
assertThat("A card should be returned ", after, Matchers.notNullValue());
/* Data from Anki - pp(self.reviewer.card)
{'data': '', 'did': 1587939535230, 'due': 1587941137, 'factor': 1300,
'flags': 0, 'id': 1510928829863, 'ivl': 17, 'lapses': 6, 'left': 1001,
'mod': 1587939720, 'nid': 1510928805161, 'odid': 1587920944107, 'odue': 0,
'ord': 0, 'queue': 1, 'reps': 23, 'type': 3, 'usn': -1}
*/
assertThat(after.getType(), is(Consts.CARD_TYPE_RELEARNING));
assertThat(after.getQueue(), is(Consts.QUEUE_TYPE_LRN));
assertThat(after.getLeft(), is(1001));
assertThat("ivl is reduced by 70%", after.getIvl(), is(17));
assertThat("One lapse is added", after.getLapses(), is(6));
assertThat(v2.answerButtons(after), is(4));
long one = v2.nextIvl(after, BUTTON_ONE);
long two = v2.nextIvl(after, BUTTON_TWO);
long three = v2.nextIvl(after, BUTTON_THREE);
long four = v2.nextIvl(after, BUTTON_FOUR);
// 20 mins
assertThat("Again should pick the current step", one, is(1200L));
// 30 mins
assertThat("Repeating single step - 20 minutes * 1.5", two, is(1800L));
// 17 days
assertThat("Good should take the reduced interval (25 * 0.7)", three, is(1468800L));
// 18 days
assertThat("Easy should have a bonus day over good", four, is(1555200L));
}
use of com.ichi2.anki.CardBrowser.Column.LAPSES in project AnkiChinaAndroid by ankichinateam.
the class AnkiChinaSyncer method handleServerData.
// 35%+25%
private void handleServerData(JSONObject item) {
mCol = CollectionHelper.getInstance().getColSafe(AnkiDroidApp.getInstance());
CollectionHelper.getInstance().lockCollection();
updateDialogProgress(SYNCING_DATA, "更新全局配置中", mCurrentProgress + 1);
DB db = mCol.getDb();
try {
JSONObject remoteCol = item.getJSONObject("col").getJSONObject("replace");
// db.execute("update col set id ="+remoteCol.getInt("id")+","+"set crt =\"+remoteCol.getLong(\"crt\")");
// db.execute("update col set crt ="+remoteCol.getLong("crt"));
// db.execute("update col set mod ="+remoteCol.getLong("mod"));
// db.execute("update col set scm ="+remoteCol.getLong("scm"));
// db.execute("update col set ver ="+remoteCol.getInt("ver"));
// db.execute("update col set dty ="+remoteCol.getInt("dty"));
// db.execute("update col set usn ="+remoteCol.getInt("usn"));
// db.execute("update col set ls ="+remoteCol.getLong("ls"));
// db.execute("update col set conf ="+remoteCol.getString("conf"));
// db.execute("update col set tags ="+remoteCol.getString("tags"));
// db.execute("update col set tags ="+remoteCol.getString("tags"));
// db.execute("update col set id = %d,");
Timber.i("remote col config:%s", remoteCol.toString());
@SuppressLint("DefaultLocale") String sql = String.format("update col set id = %d,crt = %d,mod=%d,scm=%d,ver=%d,dty=%d,usn=%d,ls=%d,conf='%s',tags='%s'", remoteCol.getInt("id"), remoteCol.getLong("crt"), remoteCol.getLong("mod"), remoteCol.getLong("scm"), remoteCol.getInt("ver"), remoteCol.getInt("dty"), remoteCol.getInt("usn"), remoteCol.getLong("ls"), remoteCol.getString("conf"), remoteCol.getString("tags") == null || !remoteCol.getString("tags").startsWith("{") ? "{}" : remoteCol.getString("tags"));
db.execute(sql);
mCol.load();
} catch (Exception e) {
e.printStackTrace();
}
Decks currentDecks = mCol.getDecks();
// 删除多余的内容
try {
JSONArray deletedDecks = item.getJSONObject("decks").getJSONArray("delete");
if (deletedDecks.length() > 0) {
double percent = 2.0 / deletedDecks.length();
for (int i = 0; i < deletedDecks.length(); i++) {
String deckID = deletedDecks.getString(i);
currentDecks.rem(Long.parseLong(deckID));
updateDialogProgress(SYNCING_DATA, "删除多余牌组中", mCurrentProgress + percent);
}
mCol.save();
}
} catch (Exception e) {
// e.printStackTrace();
}
try {
JSONArray deletedDConf = item.getJSONObject("dconf").getJSONArray("delete");
if (deletedDConf.length() > 0) {
double percent = 2.0 / deletedDConf.length();
for (int i = 0; i < deletedDConf.length(); i++) {
String id = deletedDConf.getString(i);
mCol.getDecks().remConf(Long.parseLong(id));
updateDialogProgress(SYNCING_DATA, "删除多余牌组配置中", mCurrentProgress + percent);
}
mCol.save();
}
} catch (Exception e) {
// e.printStackTrace();
}
try {
JSONArray deletedModel = item.getJSONObject("models").getJSONArray("delete");
if (deletedModel.length() > 0) {
double percent = 2.0 / deletedModel.length();
for (int i = 0; i < deletedModel.length(); i++) {
String id = deletedModel.getString(i);
mCol.getModels().rem(mCol.getModels().get(Long.parseLong(id)));
updateDialogProgress(SYNCING_DATA, "删除多余模板中", mCurrentProgress + percent);
}
mCol.save();
}
} catch (Exception e) {
e.printStackTrace();
}
updateDialogProgress(SYNCING_DATA, "删除多余卡牌中", mCurrentProgress + 2);
try {
JSONArray deletedCards = item.getJSONObject("cards").getJSONArray("delete");
List<Long> sids = ids2longList(deletedCards);
Timber.e("need delete cards num:%s", sids.size());
// db.execute("DELETE FROM cards WHERE id IN " + sids);
mCol.remCards(sids);
mCol.save();
} catch (Exception e) {
e.printStackTrace();
}
updateDialogProgress(SYNCING_DATA, "删除多余笔记中", mCurrentProgress + 2);
try {
JSONArray deletedNotes = item.getJSONObject("notes").getJSONArray("delete");
long[] sids = ids2longArray(deletedNotes);
// db.execute("DELETE FROM notes WHERE id IN " + sids);
mCol.remNotes(sids);
mCol.save();
} catch (Exception e) {
e.printStackTrace();
}
try {
JSONObject replaceDecks = item.getJSONObject("decks").getJSONObject("replace");
if (replaceDecks.length() > 0) {
double percent = 2.0 / replaceDecks.length();
Iterator<String> it = replaceDecks.keys();
while (it.hasNext()) {
String next = it.next();
try {
// mCol.getDecks().getDecks().put(Long.parseLong(next), new Deck(replaceDecks.getJSONObject(next)));
mCol.getDecks().update(new Deck(replaceDecks.getJSONObject(next)));
updateDialogProgress(SYNCING_DATA, "同步牌组数据中", mCurrentProgress + percent);
} catch (Exception e) {
// 只遍历model id
}
}
mCol.save();
}
} catch (Exception e) {
// e.printStackTrace();
}
db.getDatabase().beginTransaction();
try {
JSONArray replace = item.getJSONObject("revlog").getJSONArray("replace");
if (replace.length() > 0) {
for (int i = 0; i < replace.length(); i++) {
log(replace.getJSONArray(i).get(0), replace.getJSONArray(i).get(1), replace.getJSONArray(i).get(2), replace.getJSONArray(i).get(3), replace.getJSONArray(i).get(4), replace.getJSONArray(i).get(5), replace.getJSONArray(i).get(6), replace.getJSONArray(i).get(7), replace.getJSONArray(i).get(8));
}
db.getDatabase().setTransactionSuccessful();
mCol.save();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
db.getDatabase().endTransaction();
}
// Timber.e("看看是null还是null:%s,%s", (item.getJSONObject("dconf").get("replace")==JSONObject.NULL), (item.getJSONObject("dconf").getString("replace").equals("null")));
try {
JSONObject replaceDConf = item.getJSONObject("dconf").getJSONObject("replace");
if (replaceDConf.length() > 0) {
double percent = 2.0 / replaceDConf.length();
Iterator<String> it = replaceDConf.keys();
while (it.hasNext()) {
String next = it.next();
try {
Long.parseLong(next);
mCol.getDecks().updateConf(new DeckConfig(replaceDConf.getJSONObject(next)));
updateDialogProgress(SYNCING_DATA, "同步牌组配置数据中", mCurrentProgress + percent);
} catch (Exception e) {
// 只遍历model id
}
}
mCol.save();
}
} catch (Exception e) {
e.printStackTrace();
}
try {
JSONObject replaceModels = item.getJSONObject("models").getJSONObject("replace");
if (replaceModels.length() > 0) {
double percent = 5.0 / replaceModels.length();
Iterator<String> it = replaceModels.keys();
while (it.hasNext()) {
String next = it.next();
try {
Long.parseLong(next);
mCol.getModels().update(new Model(replaceModels.getJSONObject(next)));
updateDialogProgress(SYNCING_DATA, "同步模板数据中", mCurrentProgress + percent);
} catch (Exception e) {
// 只遍历model id
}
}
mCol.save();
}
} catch (Exception e) {
e.printStackTrace();
}
db.getDatabase().beginTransaction();
try {
JSONArray replace = item.getJSONObject("notes").getJSONArray("replace");
if (replace.length() > 0) {
double percent = mPullNotesPerPercent / replace.length();
for (int i = 0; i < replace.length(); i++) {
// String values = replace.getJSONArray(i).toString().replace("[", "").replace("]", "").replaceAll("\"","'").replaceAll("\u001f","\u001f");
// String sql = "replace into notes(id,guid,mid,mod,usn,tags,flds,sfld,csum,flags,data) values ( " + values + ")";
//
db.execute("insert or replace into notes values (?,?,?,?,?,?,?,?,?,?,?)", replace.getJSONArray(i).get(0), replace.getJSONArray(i).get(1), replace.getJSONArray(i).get(2), replace.getJSONArray(i).get(3), replace.getJSONArray(i).get(4), replace.getJSONArray(i).get(5), replace.getJSONArray(i).get(6), replace.getJSONArray(i).get(7), replace.getJSONArray(i).get(8), replace.getJSONArray(i).get(9), replace.getJSONArray(i).get(10));
updateDialogProgress(SYNCING_DATA, "同步笔记数据中", mCurrentProgress + percent);
}
db.getDatabase().setTransactionSuccessful();
mCol.save();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
db.getDatabase().endTransaction();
}
db.getDatabase().beginTransaction();
try {
JSONArray replace = item.getJSONObject("cards").getJSONArray("replace");
if (replace.length() > 0) {
double percent = 5.0 / replace.length();
for (int i = 0; i < replace.length(); i++) {
// String values = replace.getJSONArray(i).toString().replace("[", "").replace("]", "").replaceAll("\"","'").replaceAll("\u001f","\u001f");
// String sql = "replace into cards(id,nid,did,ord,mod,usn,type,queue,due,ivl,factor,reps,lapses,left,odue,odid,flags,data) values ( " + values + ")";
// Timber.i("update dialog progress:%d", percent);
db.execute("insert or replace into cards values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", replace.getJSONArray(i).get(0), replace.getJSONArray(i).get(1), replace.getJSONArray(i).get(2), replace.getJSONArray(i).get(3), replace.getJSONArray(i).get(4), replace.getJSONArray(i).get(5), replace.getJSONArray(i).get(6), replace.getJSONArray(i).get(7), replace.getJSONArray(i).get(8), replace.getJSONArray(i).get(9), replace.getJSONArray(i).get(10), replace.getJSONArray(i).get(11), replace.getJSONArray(i).get(12), replace.getJSONArray(i).get(13), replace.getJSONArray(i).get(14), replace.getJSONArray(i).get(15), replace.getJSONArray(i).get(16), replace.getJSONArray(i).get(17));
updateDialogProgress(SYNCING_DATA, "同步卡牌数据中", mCurrentProgress + percent);
}
db.getDatabase().setTransactionSuccessful();
mCol.save();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
db.getDatabase().endTransaction();
}
CollectionHelper.getInstance().unlockCollection();
}
use of com.ichi2.anki.CardBrowser.Column.LAPSES in project Anki-Android by ankidroid.
the class Anki2Importer method _importCards.
/**
* Cards
* ***********************************************************
*/
private void _importCards() {
if (mMustResetLearning) {
try {
mSrc.changeSchedulerVer(2);
} catch (ConfirmModSchemaException e) {
throw new RuntimeException("Changing the scheduler of an import should not cause schema modification", e);
}
}
// build map of guid -> (ord -> cid) and used id cache
/*
* Since we can't use a tuple as a key in Java, we resort to indexing twice with nested maps.
* Python: (guid, ord) -> cid
* Java: guid -> ord -> cid
*/
int nbCard = mDst.cardCount();
Map<String, Map<Integer, Long>> cardsByGuid = HashUtil.HashMapInit(nbCard);
Set<Long> existing = HashUtil.HashSetInit(nbCard);
try (Cursor cur = mDst.getDb().query("select f.guid, c.ord, c.id from cards c, notes f " + "where c.nid = f.id")) {
while (cur.moveToNext()) {
String guid = cur.getString(0);
int ord = cur.getInt(1);
long cid = cur.getLong(2);
existing.add(cid);
if (cardsByGuid.containsKey(guid)) {
cardsByGuid.get(guid).put(ord, cid);
} else {
// The size is at most the number of card type in the note type.
Map<Integer, Long> map = new HashMap<>();
map.put(ord, cid);
cardsByGuid.put(guid, map);
}
}
}
// loop through src
int nbCardsToImport = mSrc.cardCount();
List<Object[]> cards = new ArrayList<>(nbCardsToImport);
int totalCardCount = 0;
final int thresExecCards = 1000;
List<Object[]> revlog = new ArrayList<>(mSrc.getSched().logCount());
int totalRevlogCount = 0;
final int thresExecRevlog = 1000;
int usn = mDst.usn();
long aheadBy = mSrc.getSched().getToday() - mDst.getSched().getToday();
mDst.getDb().getDatabase().beginTransaction();
try (Cursor cur = mSrc.getDb().query("select f.guid, c.id, c.did, c.ord, c.type, c.queue, c.due, c.ivl, c.factor, c.reps, c.lapses, c.left, c.odue, c.odid, c.flags, c.data from cards c, notes f " + "where c.nid = f.id")) {
// Counters for progress updates
int total = cur.getCount();
boolean largeCollection = total > 200;
int onePercent = total / 100;
int i = 0;
while (cur.moveToNext()) {
String guid = cur.getString(0);
long cid = cur.getLong(1);
// To keep track of card id in source
long scid = cid;
long did = cur.getLong(2);
int ord = cur.getInt(3);
@Consts.CARD_TYPE int type = cur.getInt(4);
@Consts.CARD_QUEUE int queue = cur.getInt(5);
long due = cur.getLong(6);
long ivl = cur.getLong(7);
long factor = cur.getLong(8);
int reps = cur.getInt(9);
int lapses = cur.getInt(10);
int left = cur.getInt(11);
long odue = cur.getLong(12);
long odid = cur.getLong(13);
int flags = cur.getInt(14);
String data = cur.getString(15);
if (mIgnoredGuids.contains(guid)) {
continue;
}
// does the card's note exist in dst col?
if (!mNotes.containsKey(guid)) {
continue;
}
NoteTriple dnid = mNotes.get(guid);
// does the card already exist in the dst col?
if (cardsByGuid.containsKey(guid) && cardsByGuid.get(guid).containsKey(ord)) {
// fixme: in future, could update if newer mod time
continue;
}
// ensure the card id is unique
while (existing.contains(cid)) {
cid += 999;
}
existing.add(cid);
// update cid, nid, etc
long nid = mNotes.get(guid).mNid;
did = _did(did);
long mod = mCol.getTime().intTime();
// review cards have a due date relative to collection
if (queue == QUEUE_TYPE_REV || queue == QUEUE_TYPE_DAY_LEARN_RELEARN || type == CARD_TYPE_REV) {
due -= aheadBy;
}
// odue needs updating too
if (odue != 0) {
odue -= aheadBy;
}
// if odid true, convert card from filtered to normal
if (odid != 0) {
// odid
odid = 0;
// odue
due = odue;
odue = 0;
// queue
if (type == CARD_TYPE_LRN) {
// type
queue = QUEUE_TYPE_NEW;
} else {
queue = type;
}
// type
if (type == CARD_TYPE_LRN) {
type = CARD_TYPE_NEW;
}
}
cards.add(new Object[] { cid, nid, did, ord, mod, usn, type, queue, due, ivl, factor, reps, lapses, left, odue, odid, flags, data });
// we need to import revlog, rewriting card ids and bumping usn
try (Cursor cur2 = mSrc.getDb().query("select * from revlog where cid = " + scid)) {
while (cur2.moveToNext()) {
Object[] rev = new Object[] { cur2.getLong(0), cur2.getLong(1), cur2.getInt(2), cur2.getInt(3), cur2.getLong(4), cur2.getLong(5), cur2.getLong(6), cur2.getLong(7), cur2.getInt(8) };
rev[1] = cid;
rev[2] = mDst.usn();
revlog.add(rev);
}
}
i++;
// apply card changes partially
if (cards.size() >= thresExecCards) {
totalCardCount += cards.size();
insertCards(cards);
cards.clear();
Timber.d("add cards: %d", totalCardCount);
}
// apply revlog changes partially
if (revlog.size() >= thresExecRevlog) {
totalRevlogCount += revlog.size();
insertRevlog(revlog);
revlog.clear();
Timber.d("add revlog: %d", totalRevlogCount);
}
if (total != 0 && (!largeCollection || i % onePercent == 0)) {
publishProgress(100, i * 100 / total, 0);
}
}
publishProgress(100, 100, 0);
// count total values
totalCardCount += cards.size();
totalRevlogCount += revlog.size();
Timber.d("add cards total: %d", totalCardCount);
Timber.d("add revlog total: %d", totalRevlogCount);
// apply (for last chunk)
insertCards(cards);
cards.clear();
insertRevlog(revlog);
revlog.clear();
mLog.add(getRes().getString(R.string.import_complete_count, totalCardCount));
mDst.getDb().getDatabase().setTransactionSuccessful();
} finally {
DB.safeEndInTransaction(mDst.getDb());
}
}
Aggregations