This commit is contained in:
@@ -1,17 +1,23 @@
|
||||
import 'package:drift/drift.dart';
|
||||
import 'package:drift/native.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
import 'package:trainhub_flutter/core/constants/app_constants.dart';
|
||||
import 'package:trainhub_flutter/data/database/daos/exercise_dao.dart';
|
||||
import 'package:trainhub_flutter/data/database/daos/training_plan_dao.dart';
|
||||
import 'package:trainhub_flutter/data/database/daos/program_dao.dart';
|
||||
import 'package:trainhub_flutter/data/database/daos/analysis_dao.dart';
|
||||
import 'package:trainhub_flutter/data/database/daos/chat_dao.dart';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:drift/drift.dart';
|
||||
import 'package:drift/native.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:trainhub_flutter/core/constants/app_constants.dart';
|
||||
import 'package:trainhub_flutter/data/database/daos/analysis_dao.dart';
|
||||
import 'package:trainhub_flutter/data/database/daos/chat_dao.dart';
|
||||
import 'package:trainhub_flutter/data/database/daos/exercise_dao.dart';
|
||||
import 'package:trainhub_flutter/data/database/daos/knowledge_chunk_dao.dart';
|
||||
import 'package:trainhub_flutter/data/database/daos/program_dao.dart';
|
||||
import 'package:trainhub_flutter/data/database/daos/training_plan_dao.dart';
|
||||
|
||||
part 'app_database.g.dart';
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Existing tables (unchanged)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
class Exercises extends Table {
|
||||
TextColumn get id => text()();
|
||||
TextColumn get name => text()();
|
||||
@@ -116,6 +122,35 @@ class ChatMessages extends Table {
|
||||
Set<Column> get primaryKey => {id};
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// v2: Knowledge base chunks
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/// Stores text chunks and their JSON-encoded embedding vectors.
|
||||
/// Used for Retrieval-Augmented Generation (RAG) in the AI chat.
|
||||
class KnowledgeChunks extends Table {
|
||||
/// UUID for this individual chunk.
|
||||
TextColumn get id => text()();
|
||||
|
||||
/// All chunks from the same `addNote()` call share this ID.
|
||||
TextColumn get sourceId => text()();
|
||||
|
||||
/// The raw text of the chunk (max ~500 chars).
|
||||
TextColumn get content => text()();
|
||||
|
||||
/// JSON-encoded `List<double>` — the 768-dim Nomic embedding vector.
|
||||
TextColumn get embedding => text()();
|
||||
|
||||
TextColumn get createdAt => text()();
|
||||
|
||||
@override
|
||||
Set<Column> get primaryKey => {id};
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Database class
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@DriftDatabase(
|
||||
tables: [
|
||||
Exercises,
|
||||
@@ -127,6 +162,7 @@ class ChatMessages extends Table {
|
||||
Annotations,
|
||||
ChatSessions,
|
||||
ChatMessages,
|
||||
KnowledgeChunks, // added in schema v2
|
||||
],
|
||||
daos: [
|
||||
ExerciseDao,
|
||||
@@ -134,13 +170,24 @@ class ChatMessages extends Table {
|
||||
ProgramDao,
|
||||
AnalysisDao,
|
||||
ChatDao,
|
||||
KnowledgeChunkDao, // added in schema v2
|
||||
],
|
||||
)
|
||||
class AppDatabase extends _$AppDatabase {
|
||||
AppDatabase() : super(_openConnection());
|
||||
|
||||
@override
|
||||
int get schemaVersion => 1;
|
||||
int get schemaVersion => 2;
|
||||
|
||||
@override
|
||||
MigrationStrategy get migration => MigrationStrategy(
|
||||
onUpgrade: (migrator, from, to) async {
|
||||
// v1 → v2: add knowledge chunks table
|
||||
if (from < 2) {
|
||||
await migrator.createTable(knowledgeChunks);
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
LazyDatabase _openConnection() {
|
||||
|
||||
@@ -3250,6 +3250,375 @@ class ChatMessagesCompanion extends UpdateCompanion<ChatMessage> {
|
||||
}
|
||||
}
|
||||
|
||||
class $KnowledgeChunksTable extends KnowledgeChunks
|
||||
with TableInfo<$KnowledgeChunksTable, KnowledgeChunk> {
|
||||
@override
|
||||
final GeneratedDatabase attachedDatabase;
|
||||
final String? _alias;
|
||||
$KnowledgeChunksTable(this.attachedDatabase, [this._alias]);
|
||||
static const VerificationMeta _idMeta = const VerificationMeta('id');
|
||||
@override
|
||||
late final GeneratedColumn<String> id = GeneratedColumn<String>(
|
||||
'id',
|
||||
aliasedName,
|
||||
false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
);
|
||||
static const VerificationMeta _sourceIdMeta = const VerificationMeta(
|
||||
'sourceId',
|
||||
);
|
||||
@override
|
||||
late final GeneratedColumn<String> sourceId = GeneratedColumn<String>(
|
||||
'source_id',
|
||||
aliasedName,
|
||||
false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
);
|
||||
static const VerificationMeta _contentMeta = const VerificationMeta(
|
||||
'content',
|
||||
);
|
||||
@override
|
||||
late final GeneratedColumn<String> content = GeneratedColumn<String>(
|
||||
'content',
|
||||
aliasedName,
|
||||
false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
);
|
||||
static const VerificationMeta _embeddingMeta = const VerificationMeta(
|
||||
'embedding',
|
||||
);
|
||||
@override
|
||||
late final GeneratedColumn<String> embedding = GeneratedColumn<String>(
|
||||
'embedding',
|
||||
aliasedName,
|
||||
false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
);
|
||||
static const VerificationMeta _createdAtMeta = const VerificationMeta(
|
||||
'createdAt',
|
||||
);
|
||||
@override
|
||||
late final GeneratedColumn<String> createdAt = GeneratedColumn<String>(
|
||||
'created_at',
|
||||
aliasedName,
|
||||
false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: true,
|
||||
);
|
||||
@override
|
||||
List<GeneratedColumn> get $columns => [
|
||||
id,
|
||||
sourceId,
|
||||
content,
|
||||
embedding,
|
||||
createdAt,
|
||||
];
|
||||
@override
|
||||
String get aliasedName => _alias ?? actualTableName;
|
||||
@override
|
||||
String get actualTableName => $name;
|
||||
static const String $name = 'knowledge_chunks';
|
||||
@override
|
||||
VerificationContext validateIntegrity(
|
||||
Insertable<KnowledgeChunk> instance, {
|
||||
bool isInserting = false,
|
||||
}) {
|
||||
final context = VerificationContext();
|
||||
final data = instance.toColumns(true);
|
||||
if (data.containsKey('id')) {
|
||||
context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta));
|
||||
} else if (isInserting) {
|
||||
context.missing(_idMeta);
|
||||
}
|
||||
if (data.containsKey('source_id')) {
|
||||
context.handle(
|
||||
_sourceIdMeta,
|
||||
sourceId.isAcceptableOrUnknown(data['source_id']!, _sourceIdMeta),
|
||||
);
|
||||
} else if (isInserting) {
|
||||
context.missing(_sourceIdMeta);
|
||||
}
|
||||
if (data.containsKey('content')) {
|
||||
context.handle(
|
||||
_contentMeta,
|
||||
content.isAcceptableOrUnknown(data['content']!, _contentMeta),
|
||||
);
|
||||
} else if (isInserting) {
|
||||
context.missing(_contentMeta);
|
||||
}
|
||||
if (data.containsKey('embedding')) {
|
||||
context.handle(
|
||||
_embeddingMeta,
|
||||
embedding.isAcceptableOrUnknown(data['embedding']!, _embeddingMeta),
|
||||
);
|
||||
} else if (isInserting) {
|
||||
context.missing(_embeddingMeta);
|
||||
}
|
||||
if (data.containsKey('created_at')) {
|
||||
context.handle(
|
||||
_createdAtMeta,
|
||||
createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta),
|
||||
);
|
||||
} else if (isInserting) {
|
||||
context.missing(_createdAtMeta);
|
||||
}
|
||||
return context;
|
||||
}
|
||||
|
||||
@override
|
||||
Set<GeneratedColumn> get $primaryKey => {id};
|
||||
@override
|
||||
KnowledgeChunk map(Map<String, dynamic> data, {String? tablePrefix}) {
|
||||
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
|
||||
return KnowledgeChunk(
|
||||
id: attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.string,
|
||||
data['${effectivePrefix}id'],
|
||||
)!,
|
||||
sourceId: attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.string,
|
||||
data['${effectivePrefix}source_id'],
|
||||
)!,
|
||||
content: attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.string,
|
||||
data['${effectivePrefix}content'],
|
||||
)!,
|
||||
embedding: attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.string,
|
||||
data['${effectivePrefix}embedding'],
|
||||
)!,
|
||||
createdAt: attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.string,
|
||||
data['${effectivePrefix}created_at'],
|
||||
)!,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
$KnowledgeChunksTable createAlias(String alias) {
|
||||
return $KnowledgeChunksTable(attachedDatabase, alias);
|
||||
}
|
||||
}
|
||||
|
||||
class KnowledgeChunk extends DataClass implements Insertable<KnowledgeChunk> {
|
||||
/// UUID for this individual chunk.
|
||||
final String id;
|
||||
|
||||
/// All chunks from the same `addNote()` call share this ID.
|
||||
final String sourceId;
|
||||
|
||||
/// The raw text of the chunk (max ~500 chars).
|
||||
final String content;
|
||||
|
||||
/// JSON-encoded `List<double>` — the 768-dim Nomic embedding vector.
|
||||
final String embedding;
|
||||
final String createdAt;
|
||||
const KnowledgeChunk({
|
||||
required this.id,
|
||||
required this.sourceId,
|
||||
required this.content,
|
||||
required this.embedding,
|
||||
required this.createdAt,
|
||||
});
|
||||
@override
|
||||
Map<String, Expression> toColumns(bool nullToAbsent) {
|
||||
final map = <String, Expression>{};
|
||||
map['id'] = Variable<String>(id);
|
||||
map['source_id'] = Variable<String>(sourceId);
|
||||
map['content'] = Variable<String>(content);
|
||||
map['embedding'] = Variable<String>(embedding);
|
||||
map['created_at'] = Variable<String>(createdAt);
|
||||
return map;
|
||||
}
|
||||
|
||||
KnowledgeChunksCompanion toCompanion(bool nullToAbsent) {
|
||||
return KnowledgeChunksCompanion(
|
||||
id: Value(id),
|
||||
sourceId: Value(sourceId),
|
||||
content: Value(content),
|
||||
embedding: Value(embedding),
|
||||
createdAt: Value(createdAt),
|
||||
);
|
||||
}
|
||||
|
||||
factory KnowledgeChunk.fromJson(
|
||||
Map<String, dynamic> json, {
|
||||
ValueSerializer? serializer,
|
||||
}) {
|
||||
serializer ??= driftRuntimeOptions.defaultSerializer;
|
||||
return KnowledgeChunk(
|
||||
id: serializer.fromJson<String>(json['id']),
|
||||
sourceId: serializer.fromJson<String>(json['sourceId']),
|
||||
content: serializer.fromJson<String>(json['content']),
|
||||
embedding: serializer.fromJson<String>(json['embedding']),
|
||||
createdAt: serializer.fromJson<String>(json['createdAt']),
|
||||
);
|
||||
}
|
||||
@override
|
||||
Map<String, dynamic> toJson({ValueSerializer? serializer}) {
|
||||
serializer ??= driftRuntimeOptions.defaultSerializer;
|
||||
return <String, dynamic>{
|
||||
'id': serializer.toJson<String>(id),
|
||||
'sourceId': serializer.toJson<String>(sourceId),
|
||||
'content': serializer.toJson<String>(content),
|
||||
'embedding': serializer.toJson<String>(embedding),
|
||||
'createdAt': serializer.toJson<String>(createdAt),
|
||||
};
|
||||
}
|
||||
|
||||
KnowledgeChunk copyWith({
|
||||
String? id,
|
||||
String? sourceId,
|
||||
String? content,
|
||||
String? embedding,
|
||||
String? createdAt,
|
||||
}) => KnowledgeChunk(
|
||||
id: id ?? this.id,
|
||||
sourceId: sourceId ?? this.sourceId,
|
||||
content: content ?? this.content,
|
||||
embedding: embedding ?? this.embedding,
|
||||
createdAt: createdAt ?? this.createdAt,
|
||||
);
|
||||
KnowledgeChunk copyWithCompanion(KnowledgeChunksCompanion data) {
|
||||
return KnowledgeChunk(
|
||||
id: data.id.present ? data.id.value : this.id,
|
||||
sourceId: data.sourceId.present ? data.sourceId.value : this.sourceId,
|
||||
content: data.content.present ? data.content.value : this.content,
|
||||
embedding: data.embedding.present ? data.embedding.value : this.embedding,
|
||||
createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return (StringBuffer('KnowledgeChunk(')
|
||||
..write('id: $id, ')
|
||||
..write('sourceId: $sourceId, ')
|
||||
..write('content: $content, ')
|
||||
..write('embedding: $embedding, ')
|
||||
..write('createdAt: $createdAt')
|
||||
..write(')'))
|
||||
.toString();
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hash(id, sourceId, content, embedding, createdAt);
|
||||
@override
|
||||
bool operator ==(Object other) =>
|
||||
identical(this, other) ||
|
||||
(other is KnowledgeChunk &&
|
||||
other.id == this.id &&
|
||||
other.sourceId == this.sourceId &&
|
||||
other.content == this.content &&
|
||||
other.embedding == this.embedding &&
|
||||
other.createdAt == this.createdAt);
|
||||
}
|
||||
|
||||
class KnowledgeChunksCompanion extends UpdateCompanion<KnowledgeChunk> {
|
||||
final Value<String> id;
|
||||
final Value<String> sourceId;
|
||||
final Value<String> content;
|
||||
final Value<String> embedding;
|
||||
final Value<String> createdAt;
|
||||
final Value<int> rowid;
|
||||
const KnowledgeChunksCompanion({
|
||||
this.id = const Value.absent(),
|
||||
this.sourceId = const Value.absent(),
|
||||
this.content = const Value.absent(),
|
||||
this.embedding = const Value.absent(),
|
||||
this.createdAt = const Value.absent(),
|
||||
this.rowid = const Value.absent(),
|
||||
});
|
||||
KnowledgeChunksCompanion.insert({
|
||||
required String id,
|
||||
required String sourceId,
|
||||
required String content,
|
||||
required String embedding,
|
||||
required String createdAt,
|
||||
this.rowid = const Value.absent(),
|
||||
}) : id = Value(id),
|
||||
sourceId = Value(sourceId),
|
||||
content = Value(content),
|
||||
embedding = Value(embedding),
|
||||
createdAt = Value(createdAt);
|
||||
static Insertable<KnowledgeChunk> custom({
|
||||
Expression<String>? id,
|
||||
Expression<String>? sourceId,
|
||||
Expression<String>? content,
|
||||
Expression<String>? embedding,
|
||||
Expression<String>? createdAt,
|
||||
Expression<int>? rowid,
|
||||
}) {
|
||||
return RawValuesInsertable({
|
||||
if (id != null) 'id': id,
|
||||
if (sourceId != null) 'source_id': sourceId,
|
||||
if (content != null) 'content': content,
|
||||
if (embedding != null) 'embedding': embedding,
|
||||
if (createdAt != null) 'created_at': createdAt,
|
||||
if (rowid != null) 'rowid': rowid,
|
||||
});
|
||||
}
|
||||
|
||||
KnowledgeChunksCompanion copyWith({
|
||||
Value<String>? id,
|
||||
Value<String>? sourceId,
|
||||
Value<String>? content,
|
||||
Value<String>? embedding,
|
||||
Value<String>? createdAt,
|
||||
Value<int>? rowid,
|
||||
}) {
|
||||
return KnowledgeChunksCompanion(
|
||||
id: id ?? this.id,
|
||||
sourceId: sourceId ?? this.sourceId,
|
||||
content: content ?? this.content,
|
||||
embedding: embedding ?? this.embedding,
|
||||
createdAt: createdAt ?? this.createdAt,
|
||||
rowid: rowid ?? this.rowid,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Map<String, Expression> toColumns(bool nullToAbsent) {
|
||||
final map = <String, Expression>{};
|
||||
if (id.present) {
|
||||
map['id'] = Variable<String>(id.value);
|
||||
}
|
||||
if (sourceId.present) {
|
||||
map['source_id'] = Variable<String>(sourceId.value);
|
||||
}
|
||||
if (content.present) {
|
||||
map['content'] = Variable<String>(content.value);
|
||||
}
|
||||
if (embedding.present) {
|
||||
map['embedding'] = Variable<String>(embedding.value);
|
||||
}
|
||||
if (createdAt.present) {
|
||||
map['created_at'] = Variable<String>(createdAt.value);
|
||||
}
|
||||
if (rowid.present) {
|
||||
map['rowid'] = Variable<int>(rowid.value);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return (StringBuffer('KnowledgeChunksCompanion(')
|
||||
..write('id: $id, ')
|
||||
..write('sourceId: $sourceId, ')
|
||||
..write('content: $content, ')
|
||||
..write('embedding: $embedding, ')
|
||||
..write('createdAt: $createdAt, ')
|
||||
..write('rowid: $rowid')
|
||||
..write(')'))
|
||||
.toString();
|
||||
}
|
||||
}
|
||||
|
||||
abstract class _$AppDatabase extends GeneratedDatabase {
|
||||
_$AppDatabase(QueryExecutor e) : super(e);
|
||||
$AppDatabaseManager get managers => $AppDatabaseManager(this);
|
||||
@@ -3266,6 +3635,9 @@ abstract class _$AppDatabase extends GeneratedDatabase {
|
||||
late final $AnnotationsTable annotations = $AnnotationsTable(this);
|
||||
late final $ChatSessionsTable chatSessions = $ChatSessionsTable(this);
|
||||
late final $ChatMessagesTable chatMessages = $ChatMessagesTable(this);
|
||||
late final $KnowledgeChunksTable knowledgeChunks = $KnowledgeChunksTable(
|
||||
this,
|
||||
);
|
||||
late final ExerciseDao exerciseDao = ExerciseDao(this as AppDatabase);
|
||||
late final TrainingPlanDao trainingPlanDao = TrainingPlanDao(
|
||||
this as AppDatabase,
|
||||
@@ -3273,6 +3645,9 @@ abstract class _$AppDatabase extends GeneratedDatabase {
|
||||
late final ProgramDao programDao = ProgramDao(this as AppDatabase);
|
||||
late final AnalysisDao analysisDao = AnalysisDao(this as AppDatabase);
|
||||
late final ChatDao chatDao = ChatDao(this as AppDatabase);
|
||||
late final KnowledgeChunkDao knowledgeChunkDao = KnowledgeChunkDao(
|
||||
this as AppDatabase,
|
||||
);
|
||||
@override
|
||||
Iterable<TableInfo<Table, Object?>> get allTables =>
|
||||
allSchemaEntities.whereType<TableInfo<Table, Object?>>();
|
||||
@@ -3287,6 +3662,7 @@ abstract class _$AppDatabase extends GeneratedDatabase {
|
||||
annotations,
|
||||
chatSessions,
|
||||
chatMessages,
|
||||
knowledgeChunks,
|
||||
];
|
||||
@override
|
||||
StreamQueryUpdateRules get streamUpdateRules => const StreamQueryUpdateRules([
|
||||
@@ -6224,6 +6600,212 @@ typedef $$ChatMessagesTableProcessedTableManager =
|
||||
ChatMessage,
|
||||
PrefetchHooks Function({bool sessionId})
|
||||
>;
|
||||
typedef $$KnowledgeChunksTableCreateCompanionBuilder =
|
||||
KnowledgeChunksCompanion Function({
|
||||
required String id,
|
||||
required String sourceId,
|
||||
required String content,
|
||||
required String embedding,
|
||||
required String createdAt,
|
||||
Value<int> rowid,
|
||||
});
|
||||
typedef $$KnowledgeChunksTableUpdateCompanionBuilder =
|
||||
KnowledgeChunksCompanion Function({
|
||||
Value<String> id,
|
||||
Value<String> sourceId,
|
||||
Value<String> content,
|
||||
Value<String> embedding,
|
||||
Value<String> createdAt,
|
||||
Value<int> rowid,
|
||||
});
|
||||
|
||||
class $$KnowledgeChunksTableFilterComposer
|
||||
extends Composer<_$AppDatabase, $KnowledgeChunksTable> {
|
||||
$$KnowledgeChunksTableFilterComposer({
|
||||
required super.$db,
|
||||
required super.$table,
|
||||
super.joinBuilder,
|
||||
super.$addJoinBuilderToRootComposer,
|
||||
super.$removeJoinBuilderFromRootComposer,
|
||||
});
|
||||
ColumnFilters<String> get id => $composableBuilder(
|
||||
column: $table.id,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
ColumnFilters<String> get sourceId => $composableBuilder(
|
||||
column: $table.sourceId,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
ColumnFilters<String> get content => $composableBuilder(
|
||||
column: $table.content,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
ColumnFilters<String> get embedding => $composableBuilder(
|
||||
column: $table.embedding,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
ColumnFilters<String> get createdAt => $composableBuilder(
|
||||
column: $table.createdAt,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
}
|
||||
|
||||
class $$KnowledgeChunksTableOrderingComposer
|
||||
extends Composer<_$AppDatabase, $KnowledgeChunksTable> {
|
||||
$$KnowledgeChunksTableOrderingComposer({
|
||||
required super.$db,
|
||||
required super.$table,
|
||||
super.joinBuilder,
|
||||
super.$addJoinBuilderToRootComposer,
|
||||
super.$removeJoinBuilderFromRootComposer,
|
||||
});
|
||||
ColumnOrderings<String> get id => $composableBuilder(
|
||||
column: $table.id,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
ColumnOrderings<String> get sourceId => $composableBuilder(
|
||||
column: $table.sourceId,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
ColumnOrderings<String> get content => $composableBuilder(
|
||||
column: $table.content,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
ColumnOrderings<String> get embedding => $composableBuilder(
|
||||
column: $table.embedding,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
ColumnOrderings<String> get createdAt => $composableBuilder(
|
||||
column: $table.createdAt,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
}
|
||||
|
||||
class $$KnowledgeChunksTableAnnotationComposer
|
||||
extends Composer<_$AppDatabase, $KnowledgeChunksTable> {
|
||||
$$KnowledgeChunksTableAnnotationComposer({
|
||||
required super.$db,
|
||||
required super.$table,
|
||||
super.joinBuilder,
|
||||
super.$addJoinBuilderToRootComposer,
|
||||
super.$removeJoinBuilderFromRootComposer,
|
||||
});
|
||||
GeneratedColumn<String> get id =>
|
||||
$composableBuilder(column: $table.id, builder: (column) => column);
|
||||
|
||||
GeneratedColumn<String> get sourceId =>
|
||||
$composableBuilder(column: $table.sourceId, builder: (column) => column);
|
||||
|
||||
GeneratedColumn<String> get content =>
|
||||
$composableBuilder(column: $table.content, builder: (column) => column);
|
||||
|
||||
GeneratedColumn<String> get embedding =>
|
||||
$composableBuilder(column: $table.embedding, builder: (column) => column);
|
||||
|
||||
GeneratedColumn<String> get createdAt =>
|
||||
$composableBuilder(column: $table.createdAt, builder: (column) => column);
|
||||
}
|
||||
|
||||
class $$KnowledgeChunksTableTableManager
|
||||
extends
|
||||
RootTableManager<
|
||||
_$AppDatabase,
|
||||
$KnowledgeChunksTable,
|
||||
KnowledgeChunk,
|
||||
$$KnowledgeChunksTableFilterComposer,
|
||||
$$KnowledgeChunksTableOrderingComposer,
|
||||
$$KnowledgeChunksTableAnnotationComposer,
|
||||
$$KnowledgeChunksTableCreateCompanionBuilder,
|
||||
$$KnowledgeChunksTableUpdateCompanionBuilder,
|
||||
(
|
||||
KnowledgeChunk,
|
||||
BaseReferences<
|
||||
_$AppDatabase,
|
||||
$KnowledgeChunksTable,
|
||||
KnowledgeChunk
|
||||
>,
|
||||
),
|
||||
KnowledgeChunk,
|
||||
PrefetchHooks Function()
|
||||
> {
|
||||
$$KnowledgeChunksTableTableManager(
|
||||
_$AppDatabase db,
|
||||
$KnowledgeChunksTable table,
|
||||
) : super(
|
||||
TableManagerState(
|
||||
db: db,
|
||||
table: table,
|
||||
createFilteringComposer: () =>
|
||||
$$KnowledgeChunksTableFilterComposer($db: db, $table: table),
|
||||
createOrderingComposer: () =>
|
||||
$$KnowledgeChunksTableOrderingComposer($db: db, $table: table),
|
||||
createComputedFieldComposer: () =>
|
||||
$$KnowledgeChunksTableAnnotationComposer($db: db, $table: table),
|
||||
updateCompanionCallback:
|
||||
({
|
||||
Value<String> id = const Value.absent(),
|
||||
Value<String> sourceId = const Value.absent(),
|
||||
Value<String> content = const Value.absent(),
|
||||
Value<String> embedding = const Value.absent(),
|
||||
Value<String> createdAt = const Value.absent(),
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) => KnowledgeChunksCompanion(
|
||||
id: id,
|
||||
sourceId: sourceId,
|
||||
content: content,
|
||||
embedding: embedding,
|
||||
createdAt: createdAt,
|
||||
rowid: rowid,
|
||||
),
|
||||
createCompanionCallback:
|
||||
({
|
||||
required String id,
|
||||
required String sourceId,
|
||||
required String content,
|
||||
required String embedding,
|
||||
required String createdAt,
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) => KnowledgeChunksCompanion.insert(
|
||||
id: id,
|
||||
sourceId: sourceId,
|
||||
content: content,
|
||||
embedding: embedding,
|
||||
createdAt: createdAt,
|
||||
rowid: rowid,
|
||||
),
|
||||
withReferenceMapper: (p0) => p0
|
||||
.map((e) => (e.readTable(table), BaseReferences(db, table, e)))
|
||||
.toList(),
|
||||
prefetchHooksCallback: null,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
typedef $$KnowledgeChunksTableProcessedTableManager =
|
||||
ProcessedTableManager<
|
||||
_$AppDatabase,
|
||||
$KnowledgeChunksTable,
|
||||
KnowledgeChunk,
|
||||
$$KnowledgeChunksTableFilterComposer,
|
||||
$$KnowledgeChunksTableOrderingComposer,
|
||||
$$KnowledgeChunksTableAnnotationComposer,
|
||||
$$KnowledgeChunksTableCreateCompanionBuilder,
|
||||
$$KnowledgeChunksTableUpdateCompanionBuilder,
|
||||
(
|
||||
KnowledgeChunk,
|
||||
BaseReferences<_$AppDatabase, $KnowledgeChunksTable, KnowledgeChunk>,
|
||||
),
|
||||
KnowledgeChunk,
|
||||
PrefetchHooks Function()
|
||||
>;
|
||||
|
||||
class $AppDatabaseManager {
|
||||
final _$AppDatabase _db;
|
||||
@@ -6246,4 +6828,6 @@ class $AppDatabaseManager {
|
||||
$$ChatSessionsTableTableManager(_db, _db.chatSessions);
|
||||
$$ChatMessagesTableTableManager get chatMessages =>
|
||||
$$ChatMessagesTableTableManager(_db, _db.chatMessages);
|
||||
$$KnowledgeChunksTableTableManager get knowledgeChunks =>
|
||||
$$KnowledgeChunksTableTableManager(_db, _db.knowledgeChunks);
|
||||
}
|
||||
|
||||
@@ -27,6 +27,20 @@ class AnalysisDao extends DatabaseAccessor<AppDatabase>
|
||||
Future<void> insertAnnotation(AnnotationsCompanion entry) =>
|
||||
into(annotations).insert(entry);
|
||||
|
||||
Future<void> updateAnnotation({
|
||||
required String id,
|
||||
required String name,
|
||||
required String description,
|
||||
required String color,
|
||||
}) =>
|
||||
(update(annotations)..where((t) => t.id.equals(id))).write(
|
||||
AnnotationsCompanion(
|
||||
name: Value(name),
|
||||
description: Value(description),
|
||||
color: Value(color),
|
||||
),
|
||||
);
|
||||
|
||||
Future<void> deleteAnnotation(String id) =>
|
||||
(delete(annotations)..where((t) => t.id.equals(id))).go();
|
||||
}
|
||||
|
||||
35
lib/data/database/daos/knowledge_chunk_dao.dart
Normal file
35
lib/data/database/daos/knowledge_chunk_dao.dart
Normal file
@@ -0,0 +1,35 @@
|
||||
import 'package:drift/drift.dart';
|
||||
import 'package:trainhub_flutter/data/database/app_database.dart';
|
||||
|
||||
part 'knowledge_chunk_dao.g.dart';
|
||||
|
||||
@DriftAccessor(tables: [KnowledgeChunks])
|
||||
class KnowledgeChunkDao extends DatabaseAccessor<AppDatabase>
|
||||
with _$KnowledgeChunkDaoMixin {
|
||||
KnowledgeChunkDao(super.db);
|
||||
|
||||
Future<void> insertChunk(KnowledgeChunksCompanion entry) =>
|
||||
into(knowledgeChunks).insert(entry);
|
||||
|
||||
/// Returns every stored chunk, including its JSON-encoded embedding.
|
||||
/// Loaded into memory for in-process cosine similarity scoring.
|
||||
Future<List<KnowledgeChunk>> getAllChunks() =>
|
||||
(select(knowledgeChunks)
|
||||
..orderBy([
|
||||
(t) =>
|
||||
OrderingTerm(expression: t.createdAt, mode: OrderingMode.asc)
|
||||
]))
|
||||
.get();
|
||||
|
||||
Future<int> getCount() async {
|
||||
final rows = await select(knowledgeChunks).get();
|
||||
return rows.length;
|
||||
}
|
||||
|
||||
Future<void> deleteAll() => delete(knowledgeChunks).go();
|
||||
|
||||
Future<void> deleteBySourceId(String sourceId) =>
|
||||
(delete(knowledgeChunks)
|
||||
..where((t) => t.sourceId.equals(sourceId)))
|
||||
.go();
|
||||
}
|
||||
8
lib/data/database/daos/knowledge_chunk_dao.g.dart
Normal file
8
lib/data/database/daos/knowledge_chunk_dao.g.dart
Normal file
@@ -0,0 +1,8 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'knowledge_chunk_dao.dart';
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
mixin _$KnowledgeChunkDaoMixin on DatabaseAccessor<AppDatabase> {
|
||||
$KnowledgeChunksTable get knowledgeChunks => attachedDatabase.knowledgeChunks;
|
||||
}
|
||||
Reference in New Issue
Block a user