Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Version 14 merge into master #16

Merged
merged 16 commits into from
Oct 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Install sqlite3
run: sudo apt-get install -y sqlite3 libsqlite3-dev

- uses: actions/checkout@v4

- name: Flutter set up
Expand Down
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
migrate_working_dir/

# https://dart.dev/guides/libraries/private-files
# Created by `dart pub`
.dart_tool/
Expand Down
3 changes: 2 additions & 1 deletion lib/sagase_dictionary.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ export 'src/database.dart';
export 'src/datamodels/dictionary_item_ids_result.dart';
export 'src/datamodels/dictionary_item.dart';
export 'src/datamodels/dictionary_list.dart';
export 'src/datamodels/flashcard_sets.dart' show FlashcardSet;
export 'src/datamodels/flashcard_sets.dart'
show FlashcardSet, FlashcardSetReport;
export 'src/datamodels/japanese_text_token.dart';
export 'src/datamodels/kanjis.dart' show Kanji, KanjiReading;
export 'src/datamodels/my_dictionary_lists.dart' show MyDictionaryList;
Expand Down
82 changes: 79 additions & 3 deletions lib/src/dao/flashcard_sets_dao.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'package:sagase_dictionary/src/utils/string_utils.dart';

part 'flashcard_sets_dao.g.dart';

@DriftAccessor(tables: [FlashcardSets])
@DriftAccessor(tables: [FlashcardSets, FlashcardSetReports])
class FlashcardSetsDao extends DatabaseAccessor<AppDatabase>
with _$FlashcardSetsDaoMixin {
FlashcardSetsDao(super.db);
Expand Down Expand Up @@ -35,6 +35,8 @@ class FlashcardSetsDao extends DatabaseAccessor<AppDatabase>
}

Future<void> deleteFlashcardSet(FlashcardSet flashcardSet) async {
await deleteFlashcardSetReports(flashcardSet);

await (db.delete(db.flashcardSets)
..where((set) => set.id.equals(flashcardSet.id)))
.go();
Expand All @@ -57,8 +59,6 @@ class FlashcardSetsDao extends DatabaseAccessor<AppDatabase>

Future<void> importBackup(String source) async {
final flashcardSet = FlashcardSet.fromBackupJson(source);
flashcardSet.name = flashcardSet.name.sanitizeName();
if (flashcardSet.name.isEmpty) flashcardSet.name = 'Flashcard set';

// Remove predefined dictionary lists that don't exist
for (int i = 0; i < flashcardSet.predefinedDictionaryLists.length; i++) {
Expand All @@ -79,4 +79,80 @@ class FlashcardSetsDao extends DatabaseAccessor<AppDatabase>
// Add flashcard set itself
await setFlashcardSet(flashcardSet);
}

Future<FlashcardSetReport> createFlashcardSetReport(
FlashcardSet flashcardSet,
int date,
) async {
int id = await db.into(db.flashcardSetReports).insert(
FlashcardSetReportsCompanion(
flashcardSetId: Value(flashcardSet.id),
date: Value(date),
),
);

return (db.select(db.flashcardSetReports)
..where((report) => report.id.equals(id)))
.getSingle();
}

Future<void> setFlashcardSetReport(
FlashcardSetReport flashcardSetReport,
) async {
await db
.into(db.flashcardSetReports)
.insert(flashcardSetReport, mode: InsertMode.insertOrReplace);
}

Future<FlashcardSetReport?> getFlashcardSetReport(
FlashcardSet flashcardSet,
int date,
) async {
return (db.select(db.flashcardSetReports)
..where((report) => Expression.and([
report.flashcardSetId.equals(flashcardSet.id),
report.date.equals(date),
])))
.getSingleOrNull();
}

Future<FlashcardSetReport?> getRecentFlashcardSetReport(
FlashcardSet flashcardSet,
) async {
return (db.select(db.flashcardSetReports)
..where((report) => report.flashcardSetId.equals(flashcardSet.id))
..orderBy([(report) => OrderingTerm.desc(report.date)])
..limit(1))
.getSingleOrNull();
}

Future<List<FlashcardSetReport>> getAllFlashcardSetReports() async {
return db.select(db.flashcardSetReports).get();
}

Future<List<FlashcardSetReport>> getFlashcardSetReportRange(
FlashcardSet flashcardSet,
int startDate,
int endDate,
) async {
return (db.select(db.flashcardSetReports)
..where((report) => Expression.and([
report.flashcardSetId.equals(flashcardSet.id),
report.date.isBiggerOrEqualValue(startDate),
report.date.isSmallerOrEqualValue(endDate),
]))
..orderBy([(report) => OrderingTerm.asc(report.date)]))
.get();
}

Future<void> deleteFlashcardSetReports(FlashcardSet flashcardSet) async {
await (db.delete(db.flashcardSetReports)
..where((report) => report.flashcardSetId.equals(flashcardSet.id)))
.go();
}

Future<void> deleteAll() async {
await db.delete(db.flashcardSets).go();
await db.delete(db.flashcardSetReports).go();
}
}
2 changes: 2 additions & 0 deletions lib/src/dao/flashcard_sets_dao.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 13 additions & 9 deletions lib/src/dao/kanjis_dao.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ class KanjisDao extends DatabaseAccessor<AppDatabase> with _$KanjisDaoMixin {

KanjisDao(super.db);

Future<Kanji> get(int id, {FrontType? frontType}) async {
Future<Kanji?> get(int id, {FrontType? frontType}) async {
final baseQuery = db.select(db.kanjis)..where((row) => row.id.equals(id));

late Kanji kanji;
Kanji? kanji;
if (frontType == null) {
// Get kanji only
kanji = await baseQuery.getSingle();
kanji = await baseQuery.getSingleOrNull();
} else {
// If front type is given get that spaced repetition data too
kanji = await baseQuery
Expand All @@ -37,15 +37,17 @@ class KanjisDao extends DatabaseAccessor<AppDatabase> with _$KanjisDaoMixin {
..spacedRepetitionData =
row.readTableOrNull(db.spacedRepetitionDatas),
)
.getSingle();
.getSingleOrNull();
}

if (kanji == null) return null;

List<KanjiReading> onReadings = [];
List<KanjiReading> kunReadings = [];
List<KanjiReading> nanori = [];

final readings = await (db.select(db.kanjiReadings)
..where((reading) => reading.kanjiId.equals(kanji.id))
..where((reading) => reading.kanjiId.equals(kanji!.id))
..orderBy([(reading) => OrderingTerm.asc(reading.id)]))
.get();

Expand All @@ -69,7 +71,7 @@ class KanjisDao extends DatabaseAccessor<AppDatabase> with _$KanjisDaoMixin {
..nanori = nanori.isEmpty ? null : nanori;
}

Future<Kanji> getKanji(String kanji, {FrontType? frontType}) async {
Future<Kanji?> getKanji(String kanji, {FrontType? frontType}) async {
return get(kanji.kanjiCodePoint(), frontType: frontType);
}

Expand Down Expand Up @@ -144,7 +146,8 @@ class KanjisDao extends DatabaseAccessor<AppDatabase> with _$KanjisDaoMixin {
// Put the results in the same order as the input
List<Kanji> kanjiList = [];
for (final id in idList) {
kanjiList.add(kanjiMap[id]!);
final kanji = kanjiMap[id];
if (kanji != null) kanjiList.add(kanji);
}

return kanjiList;
Expand Down Expand Up @@ -231,11 +234,12 @@ class KanjisDao extends DatabaseAccessor<AppDatabase> with _$KanjisDaoMixin {
}

Future<List<Kanji>> search(String text) async {
final cleanedText = RegExp.escape(text).toLowerCase();
final cleanedText = RegExp.escape(text).toLowerCase().removeDiacritics();

// If given a single kanji character return only that
if (cleanedText.length == 1 && _kanaKit.isKanji(cleanedText)) {
return [await getKanji(cleanedText)];
final kanji = await getKanji(cleanedText);
if (kanji != null) return [kanji];
}

if (_kanaKit.isRomaji(cleanedText)) {
Expand Down
16 changes: 15 additions & 1 deletion lib/src/dao/my_dictionary_lists_dao.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import 'package:sagase_dictionary/src/utils/string_utils.dart';

part 'my_dictionary_lists_dao.g.dart';

@DriftAccessor(tables: [MyDictionaryLists])
@DriftAccessor(tables: [MyDictionaryLists, MyDictionaryListItems])
class MyDictionaryListsDao extends DatabaseAccessor<AppDatabase>
with _$MyDictionaryListsDaoMixin {
MyDictionaryListsDao(super.db);
Expand Down Expand Up @@ -242,6 +242,15 @@ class MyDictionaryListsDao extends DatabaseAccessor<AppDatabase>
for (final kanji in kanjiList.reversed) {
await addDictionaryItem(dictionaryList, kanji);
}

// Set original timestamp
await (db.update(db.myDictionaryLists)
..where((list) => list.id.equals(dictionaryList.id)))
.write(
MyDictionaryListsCompanion(
timestamp: Value(dictionaryList.timestamp),
),
);
}

Future<MyDictionaryList?> importShare(String source) async {
Expand Down Expand Up @@ -274,4 +283,9 @@ class MyDictionaryListsDao extends DatabaseAccessor<AppDatabase>
return myList;
});
}

Future<void> deleteAll() async {
await db.delete(db.myDictionaryLists).go();
await db.delete(db.myDictionaryListItems).go();
}
}
2 changes: 2 additions & 0 deletions lib/src/dao/my_dictionary_lists_dao.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions lib/src/dao/spaced_repetition_datas_dao.dart
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,8 @@ class SpacedRepetitionDatasDao extends DatabaseAccessor<AppDatabase>
Future<List<SpacedRepetitionData>> getAll() async {
return db.select(db.spacedRepetitionDatas).get();
}

Future<void> deleteAll() async {
await db.delete(db.spacedRepetitionDatas).go();
}
}
48 changes: 48 additions & 0 deletions lib/src/dao/text_analysis_history_items_dao.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import 'package:drift/drift.dart';
import 'package:sagase_dictionary/src/database.dart';
import 'package:sagase_dictionary/src/datamodels/text_analysis_history_items.dart';

part 'text_analysis_history_items_dao.g.dart';

@DriftAccessor(tables: [TextAnalysisHistoryItems])
class TextAnalysisHistoryItemsDao extends DatabaseAccessor<AppDatabase>
with _$TextAnalysisHistoryItemsDaoMixin {
TextAnalysisHistoryItemsDao(super.db);

Future<TextAnalysisHistoryItem> create(String analysisText) async {
int id = await db.into(db.textAnalysisHistoryItems).insert(
TextAnalysisHistoryItemsCompanion(analysisText: Value(analysisText)));

return (db.select(db.textAnalysisHistoryItems)
..where((item) => item.id.equals(id)))
.getSingle();
}

Future<void> set(TextAnalysisHistoryItem textAnalysisHistoryItem) async {
await db.into(db.textAnalysisHistoryItems).insert(
textAnalysisHistoryItem.toCompanion(true),
mode: InsertMode.insertOrReplace,
);
}

Future<List<TextAnalysisHistoryItem>> getAll() async {
// TODO maybe remove old items?

return (db.select(db.textAnalysisHistoryItems)
..orderBy([(item) => OrderingTerm.desc(item.id)])
..limit(50))
.get();
}

Future<void> deleteItem(
TextAnalysisHistoryItem textAnalysisHistoryItem,
) async {
await (db.delete(db.textAnalysisHistoryItems)
..where((item) => item.id.equals(textAnalysisHistoryItem.id)))
.go();
}

Future<void> deleteAll() async {
await db.textAnalysisHistoryItems.deleteAll();
}
}
9 changes: 9 additions & 0 deletions lib/src/dao/text_analysis_history_items_dao.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions lib/src/dao/vocabs_dao.dart
Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,7 @@ class VocabsDao extends DatabaseAccessor<AppDatabase> with _$VocabsDaoMixin {
}

Future<List<Vocab>> search(String text) async {
final cleanedText = RegExp.escape(text).toLowerCase();
final cleanedText = RegExp.escape(text).toLowerCase().removeDiacritics();

if (_kanaKit.isRomaji(cleanedText)) {
// Romaji
Expand Down Expand Up @@ -643,7 +643,7 @@ class VocabsDao extends DatabaseAccessor<AppDatabase> with _$VocabsDaoMixin {
outer:
for (var vocab in vocabList) {
for (int i = 0; i < vocab.definitions.length; i++) {
final definition = vocab.definitions[i].definition;
final definition = vocab.definitions[i].definition.removeDiacritics();
if (definition.contains(searchTextRegExp)) {
if (i == 0) {
int foundIndex = definition.indexOf(startingRegExp);
Expand Down
5 changes: 5 additions & 0 deletions lib/src/database.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import 'package:sagase_dictionary/src/dao/proper_nouns_dao.dart';
import 'package:sagase_dictionary/src/dao/radicals_dao.dart';
import 'package:sagase_dictionary/src/dao/search_history_items_dao.dart';
import 'package:sagase_dictionary/src/dao/spaced_repetition_datas_dao.dart';
import 'package:sagase_dictionary/src/dao/text_analysis_history_items_dao.dart';
import 'package:sagase_dictionary/src/dao/vocabs_dao.dart';
import 'package:sagase_dictionary/src/datamodels/dictionary_infos.dart';
import 'package:sagase_dictionary/src/datamodels/flashcard_sets.dart';
Expand All @@ -18,6 +19,7 @@ import 'package:sagase_dictionary/src/datamodels/proper_nouns.dart';
import 'package:sagase_dictionary/src/datamodels/radicals.dart';
import 'package:sagase_dictionary/src/datamodels/search_history_items.dart';
import 'package:sagase_dictionary/src/datamodels/spaced_repetition_datas.dart';
import 'package:sagase_dictionary/src/datamodels/text_analysis_history_items.dart';
import 'package:sagase_dictionary/src/datamodels/vocabs.dart';
import 'package:drift/native.dart';
// Start imports required for the generated database.g.dart
Expand All @@ -31,6 +33,7 @@ part 'database.g.dart';
tables: [
DictionaryInfos,
FlashcardSets,
FlashcardSetReports,
Kanjis,
KanjiReadings,
KanjiMeaningWords,
Expand All @@ -42,6 +45,7 @@ part 'database.g.dart';
Radicals,
SearchHistoryItems,
SpacedRepetitionDatas,
TextAnalysisHistoryItems,
Vocabs,
VocabWritings,
VocabReadings,
Expand All @@ -65,6 +69,7 @@ part 'database.g.dart';
RadicalsDao,
SearchHistoryItemsDao,
SpacedRepetitionDatasDao,
TextAnalysisHistoryItemsDao,
VocabsDao,
],
)
Expand Down
Loading