diff --git a/moor/example/example.g.dart b/moor/example/example.g.dart deleted file mode 100644 index 6aa1788f..00000000 --- a/moor/example/example.g.dart +++ /dev/null @@ -1,788 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'example.dart'; - -// ************************************************************************** -// MoorGenerator -// ************************************************************************** - -// ignore_for_file: unnecessary_brace_in_string_interps -class Category extends DataClass implements Insertable { - final int id; - final String description; - Category({@required this.id, this.description}); - factory Category.fromData(Map data, GeneratedDatabase db, - {String prefix}) { - final effectivePrefix = prefix ?? ''; - final intType = db.typeSystem.forDartType(); - final stringType = db.typeSystem.forDartType(); - return Category( - id: intType.mapFromDatabaseResponse(data['${effectivePrefix}id']), - description: stringType - .mapFromDatabaseResponse(data['${effectivePrefix}description']), - ); - } - factory Category.fromJson(Map json, - {ValueSerializer serializer = const ValueSerializer.defaults()}) { - return Category( - id: serializer.fromJson(json['id']), - description: serializer.fromJson(json['description']), - ); - } - @override - Map toJson( - {ValueSerializer serializer = const ValueSerializer.defaults()}) { - return { - 'id': serializer.toJson(id), - 'description': serializer.toJson(description), - }; - } - - @override - T createCompanion>(bool nullToAbsent) { - return CategoriesCompanion( - id: id == null && nullToAbsent ? const Value.absent() : Value(id), - description: description == null && nullToAbsent - ? const Value.absent() - : Value(description), - ) as T; - } - - Category copyWith({int id, String description}) => Category( - id: id ?? this.id, - description: description ?? this.description, - ); - @override - String toString() { - return (StringBuffer('Category(') - ..write('id: $id, ') - ..write('description: $description') - ..write(')')) - .toString(); - } - - @override - int get hashCode => $mrjf($mrjc($mrjc(0, id.hashCode), description.hashCode)); - @override - bool operator ==(other) => - identical(this, other) || - (other is Category && other.id == id && other.description == description); -} - -class CategoriesCompanion extends UpdateCompanion { - final Value id; - final Value description; - const CategoriesCompanion({ - this.id = const Value.absent(), - this.description = const Value.absent(), - }); -} - -class $CategoriesTable extends Categories - with TableInfo<$CategoriesTable, Category> { - final GeneratedDatabase _db; - final String _alias; - $CategoriesTable(this._db, [this._alias]); - final VerificationMeta _idMeta = const VerificationMeta('id'); - GeneratedIntColumn _id; - @override - GeneratedIntColumn get id => _id ??= _constructId(); - GeneratedIntColumn _constructId() { - return GeneratedIntColumn('id', $tableName, false, hasAutoIncrement: true); - } - - final VerificationMeta _descriptionMeta = - const VerificationMeta('description'); - GeneratedTextColumn _description; - @override - GeneratedTextColumn get description => - _description ??= _constructDescription(); - GeneratedTextColumn _constructDescription() { - return GeneratedTextColumn( - 'description', - $tableName, - true, - ); - } - - @override - List get $columns => [id, description]; - @override - $CategoriesTable get asDslTable => this; - @override - String get $tableName => _alias ?? 'categories'; - @override - final String actualTableName = 'categories'; - @override - VerificationContext validateIntegrity(CategoriesCompanion d, - {bool isInserting = false}) { - final context = VerificationContext(); - if (d.id.present) { - context.handle(_idMeta, id.isAcceptableValue(d.id.value, _idMeta)); - } else if (id.isRequired && isInserting) { - context.missing(_idMeta); - } - if (d.description.present) { - context.handle(_descriptionMeta, - description.isAcceptableValue(d.description.value, _descriptionMeta)); - } else if (description.isRequired && isInserting) { - context.missing(_descriptionMeta); - } - return context; - } - - @override - Set get $primaryKey => {id}; - @override - Category map(Map data, {String tablePrefix}) { - final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : null; - return Category.fromData(data, _db, prefix: effectivePrefix); - } - - @override - Map entityToSql(CategoriesCompanion d) { - final map = {}; - if (d.id.present) { - map['id'] = Variable(d.id.value); - } - if (d.description.present) { - map['description'] = Variable(d.description.value); - } - return map; - } - - @override - $CategoriesTable createAlias(String alias) { - return $CategoriesTable(_db, alias); - } -} - -class Recipe extends DataClass implements Insertable { - final int id; - final String title; - final String instructions; - final int category; - Recipe( - {@required this.id, - @required this.title, - @required this.instructions, - this.category}); - factory Recipe.fromData(Map data, GeneratedDatabase db, - {String prefix}) { - final effectivePrefix = prefix ?? ''; - final intType = db.typeSystem.forDartType(); - final stringType = db.typeSystem.forDartType(); - return Recipe( - id: intType.mapFromDatabaseResponse(data['${effectivePrefix}id']), - title: - stringType.mapFromDatabaseResponse(data['${effectivePrefix}title']), - instructions: stringType - .mapFromDatabaseResponse(data['${effectivePrefix}instructions']), - category: - intType.mapFromDatabaseResponse(data['${effectivePrefix}category']), - ); - } - factory Recipe.fromJson(Map json, - {ValueSerializer serializer = const ValueSerializer.defaults()}) { - return Recipe( - id: serializer.fromJson(json['id']), - title: serializer.fromJson(json['title']), - instructions: serializer.fromJson(json['instructions']), - category: serializer.fromJson(json['category']), - ); - } - @override - Map toJson( - {ValueSerializer serializer = const ValueSerializer.defaults()}) { - return { - 'id': serializer.toJson(id), - 'title': serializer.toJson(title), - 'instructions': serializer.toJson(instructions), - 'category': serializer.toJson(category), - }; - } - - @override - T createCompanion>(bool nullToAbsent) { - return RecipesCompanion( - id: id == null && nullToAbsent ? const Value.absent() : Value(id), - title: - title == null && nullToAbsent ? const Value.absent() : Value(title), - instructions: instructions == null && nullToAbsent - ? const Value.absent() - : Value(instructions), - category: category == null && nullToAbsent - ? const Value.absent() - : Value(category), - ) as T; - } - - Recipe copyWith({int id, String title, String instructions, int category}) => - Recipe( - id: id ?? this.id, - title: title ?? this.title, - instructions: instructions ?? this.instructions, - category: category ?? this.category, - ); - @override - String toString() { - return (StringBuffer('Recipe(') - ..write('id: $id, ') - ..write('title: $title, ') - ..write('instructions: $instructions, ') - ..write('category: $category') - ..write(')')) - .toString(); - } - - @override - int get hashCode => $mrjf($mrjc( - $mrjc( - $mrjc($mrjc(0, id.hashCode), title.hashCode), instructions.hashCode), - category.hashCode)); - @override - bool operator ==(other) => - identical(this, other) || - (other is Recipe && - other.id == id && - other.title == title && - other.instructions == instructions && - other.category == category); -} - -class RecipesCompanion extends UpdateCompanion { - final Value id; - final Value title; - final Value instructions; - final Value category; - const RecipesCompanion({ - this.id = const Value.absent(), - this.title = const Value.absent(), - this.instructions = const Value.absent(), - this.category = const Value.absent(), - }); -} - -class $RecipesTable extends Recipes with TableInfo<$RecipesTable, Recipe> { - final GeneratedDatabase _db; - final String _alias; - $RecipesTable(this._db, [this._alias]); - final VerificationMeta _idMeta = const VerificationMeta('id'); - GeneratedIntColumn _id; - @override - GeneratedIntColumn get id => _id ??= _constructId(); - GeneratedIntColumn _constructId() { - return GeneratedIntColumn('id', $tableName, false, hasAutoIncrement: true); - } - - final VerificationMeta _titleMeta = const VerificationMeta('title'); - GeneratedTextColumn _title; - @override - GeneratedTextColumn get title => _title ??= _constructTitle(); - GeneratedTextColumn _constructTitle() { - return GeneratedTextColumn('title', $tableName, false, maxTextLength: 16); - } - - final VerificationMeta _instructionsMeta = - const VerificationMeta('instructions'); - GeneratedTextColumn _instructions; - @override - GeneratedTextColumn get instructions => - _instructions ??= _constructInstructions(); - GeneratedTextColumn _constructInstructions() { - return GeneratedTextColumn( - 'instructions', - $tableName, - false, - ); - } - - final VerificationMeta _categoryMeta = const VerificationMeta('category'); - GeneratedIntColumn _category; - @override - GeneratedIntColumn get category => _category ??= _constructCategory(); - GeneratedIntColumn _constructCategory() { - return GeneratedIntColumn( - 'category', - $tableName, - true, - ); - } - - @override - List get $columns => [id, title, instructions, category]; - @override - $RecipesTable get asDslTable => this; - @override - String get $tableName => _alias ?? 'recipes'; - @override - final String actualTableName = 'recipes'; - @override - VerificationContext validateIntegrity(RecipesCompanion d, - {bool isInserting = false}) { - final context = VerificationContext(); - if (d.id.present) { - context.handle(_idMeta, id.isAcceptableValue(d.id.value, _idMeta)); - } else if (id.isRequired && isInserting) { - context.missing(_idMeta); - } - if (d.title.present) { - context.handle( - _titleMeta, title.isAcceptableValue(d.title.value, _titleMeta)); - } else if (title.isRequired && isInserting) { - context.missing(_titleMeta); - } - if (d.instructions.present) { - context.handle( - _instructionsMeta, - instructions.isAcceptableValue( - d.instructions.value, _instructionsMeta)); - } else if (instructions.isRequired && isInserting) { - context.missing(_instructionsMeta); - } - if (d.category.present) { - context.handle(_categoryMeta, - category.isAcceptableValue(d.category.value, _categoryMeta)); - } else if (category.isRequired && isInserting) { - context.missing(_categoryMeta); - } - return context; - } - - @override - Set get $primaryKey => {id}; - @override - Recipe map(Map data, {String tablePrefix}) { - final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : null; - return Recipe.fromData(data, _db, prefix: effectivePrefix); - } - - @override - Map entityToSql(RecipesCompanion d) { - final map = {}; - if (d.id.present) { - map['id'] = Variable(d.id.value); - } - if (d.title.present) { - map['title'] = Variable(d.title.value); - } - if (d.instructions.present) { - map['instructions'] = Variable(d.instructions.value); - } - if (d.category.present) { - map['category'] = Variable(d.category.value); - } - return map; - } - - @override - $RecipesTable createAlias(String alias) { - return $RecipesTable(_db, alias); - } -} - -class Ingredient extends DataClass implements Insertable { - final int id; - final String name; - final int caloriesPer100g; - Ingredient( - {@required this.id, @required this.name, @required this.caloriesPer100g}); - factory Ingredient.fromData(Map data, GeneratedDatabase db, - {String prefix}) { - final effectivePrefix = prefix ?? ''; - final intType = db.typeSystem.forDartType(); - final stringType = db.typeSystem.forDartType(); - return Ingredient( - id: intType.mapFromDatabaseResponse(data['${effectivePrefix}id']), - name: stringType.mapFromDatabaseResponse(data['${effectivePrefix}name']), - caloriesPer100g: - intType.mapFromDatabaseResponse(data['${effectivePrefix}calories']), - ); - } - factory Ingredient.fromJson(Map json, - {ValueSerializer serializer = const ValueSerializer.defaults()}) { - return Ingredient( - id: serializer.fromJson(json['id']), - name: serializer.fromJson(json['name']), - caloriesPer100g: serializer.fromJson(json['caloriesPer100g']), - ); - } - @override - Map toJson( - {ValueSerializer serializer = const ValueSerializer.defaults()}) { - return { - 'id': serializer.toJson(id), - 'name': serializer.toJson(name), - 'caloriesPer100g': serializer.toJson(caloriesPer100g), - }; - } - - @override - T createCompanion>(bool nullToAbsent) { - return IngredientsCompanion( - id: id == null && nullToAbsent ? const Value.absent() : Value(id), - name: name == null && nullToAbsent ? const Value.absent() : Value(name), - caloriesPer100g: caloriesPer100g == null && nullToAbsent - ? const Value.absent() - : Value(caloriesPer100g), - ) as T; - } - - Ingredient copyWith({int id, String name, int caloriesPer100g}) => Ingredient( - id: id ?? this.id, - name: name ?? this.name, - caloriesPer100g: caloriesPer100g ?? this.caloriesPer100g, - ); - @override - String toString() { - return (StringBuffer('Ingredient(') - ..write('id: $id, ') - ..write('name: $name, ') - ..write('caloriesPer100g: $caloriesPer100g') - ..write(')')) - .toString(); - } - - @override - int get hashCode => $mrjf($mrjc( - $mrjc($mrjc(0, id.hashCode), name.hashCode), caloriesPer100g.hashCode)); - @override - bool operator ==(other) => - identical(this, other) || - (other is Ingredient && - other.id == id && - other.name == name && - other.caloriesPer100g == caloriesPer100g); -} - -class IngredientsCompanion extends UpdateCompanion { - final Value id; - final Value name; - final Value caloriesPer100g; - const IngredientsCompanion({ - this.id = const Value.absent(), - this.name = const Value.absent(), - this.caloriesPer100g = const Value.absent(), - }); -} - -class $IngredientsTable extends Ingredients - with TableInfo<$IngredientsTable, Ingredient> { - final GeneratedDatabase _db; - final String _alias; - $IngredientsTable(this._db, [this._alias]); - final VerificationMeta _idMeta = const VerificationMeta('id'); - GeneratedIntColumn _id; - @override - GeneratedIntColumn get id => _id ??= _constructId(); - GeneratedIntColumn _constructId() { - return GeneratedIntColumn('id', $tableName, false, hasAutoIncrement: true); - } - - final VerificationMeta _nameMeta = const VerificationMeta('name'); - GeneratedTextColumn _name; - @override - GeneratedTextColumn get name => _name ??= _constructName(); - GeneratedTextColumn _constructName() { - return GeneratedTextColumn( - 'name', - $tableName, - false, - ); - } - - final VerificationMeta _caloriesPer100gMeta = - const VerificationMeta('caloriesPer100g'); - GeneratedIntColumn _caloriesPer100g; - @override - GeneratedIntColumn get caloriesPer100g => - _caloriesPer100g ??= _constructCaloriesPer100g(); - GeneratedIntColumn _constructCaloriesPer100g() { - return GeneratedIntColumn( - 'calories', - $tableName, - false, - ); - } - - @override - List get $columns => [id, name, caloriesPer100g]; - @override - $IngredientsTable get asDslTable => this; - @override - String get $tableName => _alias ?? 'ingredients'; - @override - final String actualTableName = 'ingredients'; - @override - VerificationContext validateIntegrity(IngredientsCompanion d, - {bool isInserting = false}) { - final context = VerificationContext(); - if (d.id.present) { - context.handle(_idMeta, id.isAcceptableValue(d.id.value, _idMeta)); - } else if (id.isRequired && isInserting) { - context.missing(_idMeta); - } - if (d.name.present) { - context.handle( - _nameMeta, name.isAcceptableValue(d.name.value, _nameMeta)); - } else if (name.isRequired && isInserting) { - context.missing(_nameMeta); - } - if (d.caloriesPer100g.present) { - context.handle( - _caloriesPer100gMeta, - caloriesPer100g.isAcceptableValue( - d.caloriesPer100g.value, _caloriesPer100gMeta)); - } else if (caloriesPer100g.isRequired && isInserting) { - context.missing(_caloriesPer100gMeta); - } - return context; - } - - @override - Set get $primaryKey => {id}; - @override - Ingredient map(Map data, {String tablePrefix}) { - final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : null; - return Ingredient.fromData(data, _db, prefix: effectivePrefix); - } - - @override - Map entityToSql(IngredientsCompanion d) { - final map = {}; - if (d.id.present) { - map['id'] = Variable(d.id.value); - } - if (d.name.present) { - map['name'] = Variable(d.name.value); - } - if (d.caloriesPer100g.present) { - map['calories'] = Variable(d.caloriesPer100g.value); - } - return map; - } - - @override - $IngredientsTable createAlias(String alias) { - return $IngredientsTable(_db, alias); - } -} - -class IngredientInRecipe extends DataClass - implements Insertable { - final int recipe; - final int ingredient; - final int amountInGrams; - IngredientInRecipe( - {@required this.recipe, - @required this.ingredient, - @required this.amountInGrams}); - factory IngredientInRecipe.fromData( - Map data, GeneratedDatabase db, - {String prefix}) { - final effectivePrefix = prefix ?? ''; - final intType = db.typeSystem.forDartType(); - return IngredientInRecipe( - recipe: intType.mapFromDatabaseResponse(data['${effectivePrefix}recipe']), - ingredient: - intType.mapFromDatabaseResponse(data['${effectivePrefix}ingredient']), - amountInGrams: - intType.mapFromDatabaseResponse(data['${effectivePrefix}amount']), - ); - } - factory IngredientInRecipe.fromJson(Map json, - {ValueSerializer serializer = const ValueSerializer.defaults()}) { - return IngredientInRecipe( - recipe: serializer.fromJson(json['recipe']), - ingredient: serializer.fromJson(json['ingredient']), - amountInGrams: serializer.fromJson(json['amountInGrams']), - ); - } - @override - Map toJson( - {ValueSerializer serializer = const ValueSerializer.defaults()}) { - return { - 'recipe': serializer.toJson(recipe), - 'ingredient': serializer.toJson(ingredient), - 'amountInGrams': serializer.toJson(amountInGrams), - }; - } - - @override - T createCompanion>( - bool nullToAbsent) { - return IngredientInRecipesCompanion( - recipe: - recipe == null && nullToAbsent ? const Value.absent() : Value(recipe), - ingredient: ingredient == null && nullToAbsent - ? const Value.absent() - : Value(ingredient), - amountInGrams: amountInGrams == null && nullToAbsent - ? const Value.absent() - : Value(amountInGrams), - ) as T; - } - - IngredientInRecipe copyWith( - {int recipe, int ingredient, int amountInGrams}) => - IngredientInRecipe( - recipe: recipe ?? this.recipe, - ingredient: ingredient ?? this.ingredient, - amountInGrams: amountInGrams ?? this.amountInGrams, - ); - @override - String toString() { - return (StringBuffer('IngredientInRecipe(') - ..write('recipe: $recipe, ') - ..write('ingredient: $ingredient, ') - ..write('amountInGrams: $amountInGrams') - ..write(')')) - .toString(); - } - - @override - int get hashCode => $mrjf($mrjc( - $mrjc($mrjc(0, recipe.hashCode), ingredient.hashCode), - amountInGrams.hashCode)); - @override - bool operator ==(other) => - identical(this, other) || - (other is IngredientInRecipe && - other.recipe == recipe && - other.ingredient == ingredient && - other.amountInGrams == amountInGrams); -} - -class IngredientInRecipesCompanion extends UpdateCompanion { - final Value recipe; - final Value ingredient; - final Value amountInGrams; - const IngredientInRecipesCompanion({ - this.recipe = const Value.absent(), - this.ingredient = const Value.absent(), - this.amountInGrams = const Value.absent(), - }); -} - -class $IngredientInRecipesTable extends IngredientInRecipes - with TableInfo<$IngredientInRecipesTable, IngredientInRecipe> { - final GeneratedDatabase _db; - final String _alias; - $IngredientInRecipesTable(this._db, [this._alias]); - final VerificationMeta _recipeMeta = const VerificationMeta('recipe'); - GeneratedIntColumn _recipe; - @override - GeneratedIntColumn get recipe => _recipe ??= _constructRecipe(); - GeneratedIntColumn _constructRecipe() { - return GeneratedIntColumn( - 'recipe', - $tableName, - false, - ); - } - - final VerificationMeta _ingredientMeta = const VerificationMeta('ingredient'); - GeneratedIntColumn _ingredient; - @override - GeneratedIntColumn get ingredient => _ingredient ??= _constructIngredient(); - GeneratedIntColumn _constructIngredient() { - return GeneratedIntColumn( - 'ingredient', - $tableName, - false, - ); - } - - final VerificationMeta _amountInGramsMeta = - const VerificationMeta('amountInGrams'); - GeneratedIntColumn _amountInGrams; - @override - GeneratedIntColumn get amountInGrams => - _amountInGrams ??= _constructAmountInGrams(); - GeneratedIntColumn _constructAmountInGrams() { - return GeneratedIntColumn( - 'amount', - $tableName, - false, - ); - } - - @override - List get $columns => [recipe, ingredient, amountInGrams]; - @override - $IngredientInRecipesTable get asDslTable => this; - @override - String get $tableName => _alias ?? 'recipe_ingredients'; - @override - final String actualTableName = 'recipe_ingredients'; - @override - VerificationContext validateIntegrity(IngredientInRecipesCompanion d, - {bool isInserting = false}) { - final context = VerificationContext(); - if (d.recipe.present) { - context.handle( - _recipeMeta, recipe.isAcceptableValue(d.recipe.value, _recipeMeta)); - } else if (recipe.isRequired && isInserting) { - context.missing(_recipeMeta); - } - if (d.ingredient.present) { - context.handle(_ingredientMeta, - ingredient.isAcceptableValue(d.ingredient.value, _ingredientMeta)); - } else if (ingredient.isRequired && isInserting) { - context.missing(_ingredientMeta); - } - if (d.amountInGrams.present) { - context.handle( - _amountInGramsMeta, - amountInGrams.isAcceptableValue( - d.amountInGrams.value, _amountInGramsMeta)); - } else if (amountInGrams.isRequired && isInserting) { - context.missing(_amountInGramsMeta); - } - return context; - } - - @override - Set get $primaryKey => {recipe, ingredient}; - @override - IngredientInRecipe map(Map data, {String tablePrefix}) { - final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : null; - return IngredientInRecipe.fromData(data, _db, prefix: effectivePrefix); - } - - @override - Map entityToSql(IngredientInRecipesCompanion d) { - final map = {}; - if (d.recipe.present) { - map['recipe'] = Variable(d.recipe.value); - } - if (d.ingredient.present) { - map['ingredient'] = Variable(d.ingredient.value); - } - if (d.amountInGrams.present) { - map['amount'] = Variable(d.amountInGrams.value); - } - return map; - } - - @override - $IngredientInRecipesTable createAlias(String alias) { - return $IngredientInRecipesTable(_db, alias); - } -} - -abstract class _$Database extends GeneratedDatabase { - _$Database(QueryExecutor e) : super(const SqlTypeSystem.withDefaults(), e); - $CategoriesTable _categories; - $CategoriesTable get categories => _categories ??= $CategoriesTable(this); - $RecipesTable _recipes; - $RecipesTable get recipes => _recipes ??= $RecipesTable(this); - $IngredientsTable _ingredients; - $IngredientsTable get ingredients => _ingredients ??= $IngredientsTable(this); - $IngredientInRecipesTable _ingredientInRecipes; - $IngredientInRecipesTable get ingredientInRecipes => - _ingredientInRecipes ??= $IngredientInRecipesTable(this); - @override - List get allTables => - [categories, recipes, ingredients, ingredientInRecipes]; -} diff --git a/moor/lib/src/dsl/database.dart b/moor/lib/src/dsl/database.dart index aab66657..ed5b3d2a 100644 --- a/moor/lib/src/dsl/database.dart +++ b/moor/lib/src/dsl/database.dart @@ -28,6 +28,7 @@ class UseMoor { /// Optionally, a list of queries. Moor will generate matching methods for the /// variables and return types. // todo better documentation + @experimental final List queries; /// Use this class as an annotation to inform moor_generator that a database @@ -64,6 +65,7 @@ class UseDao { /// The tables accessed by this DAO. final List tables; // todo better documentation + @experimental final List queries; const UseDao({@required this.tables, this.queries}); diff --git a/moor/test/data/tables/todos.dart b/moor/test/data/tables/todos.dart index 3bcdf77e..d1a683fa 100644 --- a/moor/test/data/tables/todos.dart +++ b/moor/test/data/tables/todos.dart @@ -52,7 +52,15 @@ class TableWithoutPK extends Table { RealColumn get someFloat => real()(); } -@UseMoor(tables: [TodosTable, Categories, Users, SharedTodos, TableWithoutPK]) +@UseMoor( + tables: [TodosTable, Categories, Users, SharedTodos, TableWithoutPK], + queries: [ + Sql( + 'allTodosWithCategory', + 'SELECT t.*, c.id as catId, c."desc" as catDesc ' + 'FROM todos t INNER JOIN categories c ON c.id = t.category'), + ], +) class TodoDb extends _$TodoDb { TodoDb(QueryExecutor e) : super(e); diff --git a/moor/test/data/tables/todos.g.dart b/moor/test/data/tables/todos.g.dart deleted file mode 100644 index 45cad1dc..00000000 --- a/moor/test/data/tables/todos.g.dart +++ /dev/null @@ -1,1024 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'todos.dart'; - -// ************************************************************************** -// MoorGenerator -// ************************************************************************** - -// ignore_for_file: unnecessary_brace_in_string_interps -class TodoEntry extends DataClass implements Insertable { - final int id; - final String title; - final String content; - final DateTime targetDate; - final int category; - TodoEntry( - {@required this.id, - this.title, - @required this.content, - this.targetDate, - this.category}); - factory TodoEntry.fromData(Map data, GeneratedDatabase db, - {String prefix}) { - final effectivePrefix = prefix ?? ''; - final intType = db.typeSystem.forDartType(); - final stringType = db.typeSystem.forDartType(); - final dateTimeType = db.typeSystem.forDartType(); - return TodoEntry( - id: intType.mapFromDatabaseResponse(data['${effectivePrefix}id']), - title: - stringType.mapFromDatabaseResponse(data['${effectivePrefix}title']), - content: - stringType.mapFromDatabaseResponse(data['${effectivePrefix}content']), - targetDate: dateTimeType - .mapFromDatabaseResponse(data['${effectivePrefix}target_date']), - category: - intType.mapFromDatabaseResponse(data['${effectivePrefix}category']), - ); - } - factory TodoEntry.fromJson(Map json, - {ValueSerializer serializer = const ValueSerializer.defaults()}) { - return TodoEntry( - id: serializer.fromJson(json['id']), - title: serializer.fromJson(json['title']), - content: serializer.fromJson(json['content']), - targetDate: serializer.fromJson(json['target_date']), - category: serializer.fromJson(json['category']), - ); - } - @override - Map toJson( - {ValueSerializer serializer = const ValueSerializer.defaults()}) { - return { - 'id': serializer.toJson(id), - 'title': serializer.toJson(title), - 'content': serializer.toJson(content), - 'target_date': serializer.toJson(targetDate), - 'category': serializer.toJson(category), - }; - } - - @override - T createCompanion>(bool nullToAbsent) { - return TodosTableCompanion( - id: id == null && nullToAbsent ? const Value.absent() : Value(id), - title: - title == null && nullToAbsent ? const Value.absent() : Value(title), - content: content == null && nullToAbsent - ? const Value.absent() - : Value(content), - targetDate: targetDate == null && nullToAbsent - ? const Value.absent() - : Value(targetDate), - category: category == null && nullToAbsent - ? const Value.absent() - : Value(category), - ) as T; - } - - TodoEntry copyWith( - {int id, - String title, - String content, - DateTime targetDate, - int category}) => - TodoEntry( - id: id ?? this.id, - title: title ?? this.title, - content: content ?? this.content, - targetDate: targetDate ?? this.targetDate, - category: category ?? this.category, - ); - @override - String toString() { - return (StringBuffer('TodoEntry(') - ..write('id: $id, ') - ..write('title: $title, ') - ..write('content: $content, ') - ..write('targetDate: $targetDate, ') - ..write('category: $category') - ..write(')')) - .toString(); - } - - @override - int get hashCode => $mrjf($mrjc( - $mrjc( - $mrjc($mrjc($mrjc(0, id.hashCode), title.hashCode), content.hashCode), - targetDate.hashCode), - category.hashCode)); - @override - bool operator ==(other) => - identical(this, other) || - (other is TodoEntry && - other.id == id && - other.title == title && - other.content == content && - other.targetDate == targetDate && - other.category == category); -} - -class TodosTableCompanion extends UpdateCompanion { - final Value id; - final Value title; - final Value content; - final Value targetDate; - final Value category; - const TodosTableCompanion({ - this.id = const Value.absent(), - this.title = const Value.absent(), - this.content = const Value.absent(), - this.targetDate = const Value.absent(), - this.category = const Value.absent(), - }); -} - -class $TodosTableTable extends TodosTable - with TableInfo<$TodosTableTable, TodoEntry> { - final GeneratedDatabase _db; - final String _alias; - $TodosTableTable(this._db, [this._alias]); - final VerificationMeta _idMeta = const VerificationMeta('id'); - GeneratedIntColumn _id; - @override - GeneratedIntColumn get id => _id ??= _constructId(); - GeneratedIntColumn _constructId() { - return GeneratedIntColumn('id', $tableName, false, hasAutoIncrement: true); - } - - final VerificationMeta _titleMeta = const VerificationMeta('title'); - GeneratedTextColumn _title; - @override - GeneratedTextColumn get title => _title ??= _constructTitle(); - GeneratedTextColumn _constructTitle() { - return GeneratedTextColumn('title', $tableName, true, - minTextLength: 4, maxTextLength: 16); - } - - final VerificationMeta _contentMeta = const VerificationMeta('content'); - GeneratedTextColumn _content; - @override - GeneratedTextColumn get content => _content ??= _constructContent(); - GeneratedTextColumn _constructContent() { - return GeneratedTextColumn( - 'content', - $tableName, - false, - ); - } - - final VerificationMeta _targetDateMeta = const VerificationMeta('targetDate'); - GeneratedDateTimeColumn _targetDate; - @override - GeneratedDateTimeColumn get targetDate => - _targetDate ??= _constructTargetDate(); - GeneratedDateTimeColumn _constructTargetDate() { - return GeneratedDateTimeColumn( - 'target_date', - $tableName, - true, - ); - } - - final VerificationMeta _categoryMeta = const VerificationMeta('category'); - GeneratedIntColumn _category; - @override - GeneratedIntColumn get category => _category ??= _constructCategory(); - GeneratedIntColumn _constructCategory() { - return GeneratedIntColumn( - 'category', - $tableName, - true, - ); - } - - @override - List get $columns => - [id, title, content, targetDate, category]; - @override - $TodosTableTable get asDslTable => this; - @override - String get $tableName => _alias ?? 'todos'; - @override - final String actualTableName = 'todos'; - @override - VerificationContext validateIntegrity(TodosTableCompanion d, - {bool isInserting = false}) { - final context = VerificationContext(); - if (d.id.present) { - context.handle(_idMeta, id.isAcceptableValue(d.id.value, _idMeta)); - } else if (id.isRequired && isInserting) { - context.missing(_idMeta); - } - if (d.title.present) { - context.handle( - _titleMeta, title.isAcceptableValue(d.title.value, _titleMeta)); - } else if (title.isRequired && isInserting) { - context.missing(_titleMeta); - } - if (d.content.present) { - context.handle(_contentMeta, - content.isAcceptableValue(d.content.value, _contentMeta)); - } else if (content.isRequired && isInserting) { - context.missing(_contentMeta); - } - if (d.targetDate.present) { - context.handle(_targetDateMeta, - targetDate.isAcceptableValue(d.targetDate.value, _targetDateMeta)); - } else if (targetDate.isRequired && isInserting) { - context.missing(_targetDateMeta); - } - if (d.category.present) { - context.handle(_categoryMeta, - category.isAcceptableValue(d.category.value, _categoryMeta)); - } else if (category.isRequired && isInserting) { - context.missing(_categoryMeta); - } - return context; - } - - @override - Set get $primaryKey => {id}; - @override - TodoEntry map(Map data, {String tablePrefix}) { - final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : null; - return TodoEntry.fromData(data, _db, prefix: effectivePrefix); - } - - @override - Map entityToSql(TodosTableCompanion d) { - final map = {}; - if (d.id.present) { - map['id'] = Variable(d.id.value); - } - if (d.title.present) { - map['title'] = Variable(d.title.value); - } - if (d.content.present) { - map['content'] = Variable(d.content.value); - } - if (d.targetDate.present) { - map['target_date'] = Variable(d.targetDate.value); - } - if (d.category.present) { - map['category'] = Variable(d.category.value); - } - return map; - } - - @override - $TodosTableTable createAlias(String alias) { - return $TodosTableTable(_db, alias); - } -} - -class Category extends DataClass implements Insertable { - final int id; - final String description; - Category({@required this.id, @required this.description}); - factory Category.fromData(Map data, GeneratedDatabase db, - {String prefix}) { - final effectivePrefix = prefix ?? ''; - final intType = db.typeSystem.forDartType(); - final stringType = db.typeSystem.forDartType(); - return Category( - id: intType.mapFromDatabaseResponse(data['${effectivePrefix}id']), - description: - stringType.mapFromDatabaseResponse(data['${effectivePrefix}desc']), - ); - } - factory Category.fromJson(Map json, - {ValueSerializer serializer = const ValueSerializer.defaults()}) { - return Category( - id: serializer.fromJson(json['id']), - description: serializer.fromJson(json['description']), - ); - } - @override - Map toJson( - {ValueSerializer serializer = const ValueSerializer.defaults()}) { - return { - 'id': serializer.toJson(id), - 'description': serializer.toJson(description), - }; - } - - @override - T createCompanion>(bool nullToAbsent) { - return CategoriesCompanion( - id: id == null && nullToAbsent ? const Value.absent() : Value(id), - description: description == null && nullToAbsent - ? const Value.absent() - : Value(description), - ) as T; - } - - Category copyWith({int id, String description}) => Category( - id: id ?? this.id, - description: description ?? this.description, - ); - @override - String toString() { - return (StringBuffer('Category(') - ..write('id: $id, ') - ..write('description: $description') - ..write(')')) - .toString(); - } - - @override - int get hashCode => $mrjf($mrjc($mrjc(0, id.hashCode), description.hashCode)); - @override - bool operator ==(other) => - identical(this, other) || - (other is Category && other.id == id && other.description == description); -} - -class CategoriesCompanion extends UpdateCompanion { - final Value id; - final Value description; - const CategoriesCompanion({ - this.id = const Value.absent(), - this.description = const Value.absent(), - }); -} - -class $CategoriesTable extends Categories - with TableInfo<$CategoriesTable, Category> { - final GeneratedDatabase _db; - final String _alias; - $CategoriesTable(this._db, [this._alias]); - final VerificationMeta _idMeta = const VerificationMeta('id'); - GeneratedIntColumn _id; - @override - GeneratedIntColumn get id => _id ??= _constructId(); - GeneratedIntColumn _constructId() { - return GeneratedIntColumn('id', $tableName, false, hasAutoIncrement: true); - } - - final VerificationMeta _descriptionMeta = - const VerificationMeta('description'); - GeneratedTextColumn _description; - @override - GeneratedTextColumn get description => - _description ??= _constructDescription(); - GeneratedTextColumn _constructDescription() { - return GeneratedTextColumn('desc', $tableName, false, - $customConstraints: 'NOT NULL UNIQUE'); - } - - @override - List get $columns => [id, description]; - @override - $CategoriesTable get asDslTable => this; - @override - String get $tableName => _alias ?? 'categories'; - @override - final String actualTableName = 'categories'; - @override - VerificationContext validateIntegrity(CategoriesCompanion d, - {bool isInserting = false}) { - final context = VerificationContext(); - if (d.id.present) { - context.handle(_idMeta, id.isAcceptableValue(d.id.value, _idMeta)); - } else if (id.isRequired && isInserting) { - context.missing(_idMeta); - } - if (d.description.present) { - context.handle(_descriptionMeta, - description.isAcceptableValue(d.description.value, _descriptionMeta)); - } else if (description.isRequired && isInserting) { - context.missing(_descriptionMeta); - } - return context; - } - - @override - Set get $primaryKey => {id}; - @override - Category map(Map data, {String tablePrefix}) { - final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : null; - return Category.fromData(data, _db, prefix: effectivePrefix); - } - - @override - Map entityToSql(CategoriesCompanion d) { - final map = {}; - if (d.id.present) { - map['id'] = Variable(d.id.value); - } - if (d.description.present) { - map['desc'] = Variable(d.description.value); - } - return map; - } - - @override - $CategoriesTable createAlias(String alias) { - return $CategoriesTable(_db, alias); - } -} - -class User extends DataClass implements Insertable { - final int id; - final String name; - final bool isAwesome; - final Uint8List profilePicture; - final DateTime creationTime; - User( - {@required this.id, - @required this.name, - @required this.isAwesome, - @required this.profilePicture, - @required this.creationTime}); - factory User.fromData(Map data, GeneratedDatabase db, - {String prefix}) { - final effectivePrefix = prefix ?? ''; - final intType = db.typeSystem.forDartType(); - final stringType = db.typeSystem.forDartType(); - final boolType = db.typeSystem.forDartType(); - final uint8ListType = db.typeSystem.forDartType(); - final dateTimeType = db.typeSystem.forDartType(); - return User( - id: intType.mapFromDatabaseResponse(data['${effectivePrefix}id']), - name: stringType.mapFromDatabaseResponse(data['${effectivePrefix}name']), - isAwesome: boolType - .mapFromDatabaseResponse(data['${effectivePrefix}is_awesome']), - profilePicture: uint8ListType - .mapFromDatabaseResponse(data['${effectivePrefix}profile_picture']), - creationTime: dateTimeType - .mapFromDatabaseResponse(data['${effectivePrefix}creation_time']), - ); - } - factory User.fromJson(Map json, - {ValueSerializer serializer = const ValueSerializer.defaults()}) { - return User( - id: serializer.fromJson(json['id']), - name: serializer.fromJson(json['name']), - isAwesome: serializer.fromJson(json['isAwesome']), - profilePicture: serializer.fromJson(json['profilePicture']), - creationTime: serializer.fromJson(json['creationTime']), - ); - } - @override - Map toJson( - {ValueSerializer serializer = const ValueSerializer.defaults()}) { - return { - 'id': serializer.toJson(id), - 'name': serializer.toJson(name), - 'isAwesome': serializer.toJson(isAwesome), - 'profilePicture': serializer.toJson(profilePicture), - 'creationTime': serializer.toJson(creationTime), - }; - } - - @override - T createCompanion>(bool nullToAbsent) { - return UsersCompanion( - id: id == null && nullToAbsent ? const Value.absent() : Value(id), - name: name == null && nullToAbsent ? const Value.absent() : Value(name), - isAwesome: isAwesome == null && nullToAbsent - ? const Value.absent() - : Value(isAwesome), - profilePicture: profilePicture == null && nullToAbsent - ? const Value.absent() - : Value(profilePicture), - creationTime: creationTime == null && nullToAbsent - ? const Value.absent() - : Value(creationTime), - ) as T; - } - - User copyWith( - {int id, - String name, - bool isAwesome, - Uint8List profilePicture, - DateTime creationTime}) => - User( - id: id ?? this.id, - name: name ?? this.name, - isAwesome: isAwesome ?? this.isAwesome, - profilePicture: profilePicture ?? this.profilePicture, - creationTime: creationTime ?? this.creationTime, - ); - @override - String toString() { - return (StringBuffer('User(') - ..write('id: $id, ') - ..write('name: $name, ') - ..write('isAwesome: $isAwesome, ') - ..write('profilePicture: $profilePicture, ') - ..write('creationTime: $creationTime') - ..write(')')) - .toString(); - } - - @override - int get hashCode => $mrjf($mrjc( - $mrjc( - $mrjc( - $mrjc($mrjc(0, id.hashCode), name.hashCode), isAwesome.hashCode), - profilePicture.hashCode), - creationTime.hashCode)); - @override - bool operator ==(other) => - identical(this, other) || - (other is User && - other.id == id && - other.name == name && - other.isAwesome == isAwesome && - other.profilePicture == profilePicture && - other.creationTime == creationTime); -} - -class UsersCompanion extends UpdateCompanion { - final Value id; - final Value name; - final Value isAwesome; - final Value profilePicture; - final Value creationTime; - const UsersCompanion({ - this.id = const Value.absent(), - this.name = const Value.absent(), - this.isAwesome = const Value.absent(), - this.profilePicture = const Value.absent(), - this.creationTime = const Value.absent(), - }); -} - -class $UsersTable extends Users with TableInfo<$UsersTable, User> { - final GeneratedDatabase _db; - final String _alias; - $UsersTable(this._db, [this._alias]); - final VerificationMeta _idMeta = const VerificationMeta('id'); - GeneratedIntColumn _id; - @override - GeneratedIntColumn get id => _id ??= _constructId(); - GeneratedIntColumn _constructId() { - return GeneratedIntColumn('id', $tableName, false, hasAutoIncrement: true); - } - - final VerificationMeta _nameMeta = const VerificationMeta('name'); - GeneratedTextColumn _name; - @override - GeneratedTextColumn get name => _name ??= _constructName(); - GeneratedTextColumn _constructName() { - return GeneratedTextColumn('name', $tableName, false, - minTextLength: 6, maxTextLength: 32); - } - - final VerificationMeta _isAwesomeMeta = const VerificationMeta('isAwesome'); - GeneratedBoolColumn _isAwesome; - @override - GeneratedBoolColumn get isAwesome => _isAwesome ??= _constructIsAwesome(); - GeneratedBoolColumn _constructIsAwesome() { - return GeneratedBoolColumn('is_awesome', $tableName, false, - defaultValue: const Constant(true)); - } - - final VerificationMeta _profilePictureMeta = - const VerificationMeta('profilePicture'); - GeneratedBlobColumn _profilePicture; - @override - GeneratedBlobColumn get profilePicture => - _profilePicture ??= _constructProfilePicture(); - GeneratedBlobColumn _constructProfilePicture() { - return GeneratedBlobColumn( - 'profile_picture', - $tableName, - false, - ); - } - - final VerificationMeta _creationTimeMeta = - const VerificationMeta('creationTime'); - GeneratedDateTimeColumn _creationTime; - @override - GeneratedDateTimeColumn get creationTime => - _creationTime ??= _constructCreationTime(); - GeneratedDateTimeColumn _constructCreationTime() { - return GeneratedDateTimeColumn('creation_time', $tableName, false, - defaultValue: currentDateAndTime); - } - - @override - List get $columns => - [id, name, isAwesome, profilePicture, creationTime]; - @override - $UsersTable get asDslTable => this; - @override - String get $tableName => _alias ?? 'users'; - @override - final String actualTableName = 'users'; - @override - VerificationContext validateIntegrity(UsersCompanion d, - {bool isInserting = false}) { - final context = VerificationContext(); - if (d.id.present) { - context.handle(_idMeta, id.isAcceptableValue(d.id.value, _idMeta)); - } else if (id.isRequired && isInserting) { - context.missing(_idMeta); - } - if (d.name.present) { - context.handle( - _nameMeta, name.isAcceptableValue(d.name.value, _nameMeta)); - } else if (name.isRequired && isInserting) { - context.missing(_nameMeta); - } - if (d.isAwesome.present) { - context.handle(_isAwesomeMeta, - isAwesome.isAcceptableValue(d.isAwesome.value, _isAwesomeMeta)); - } else if (isAwesome.isRequired && isInserting) { - context.missing(_isAwesomeMeta); - } - if (d.profilePicture.present) { - context.handle( - _profilePictureMeta, - profilePicture.isAcceptableValue( - d.profilePicture.value, _profilePictureMeta)); - } else if (profilePicture.isRequired && isInserting) { - context.missing(_profilePictureMeta); - } - if (d.creationTime.present) { - context.handle( - _creationTimeMeta, - creationTime.isAcceptableValue( - d.creationTime.value, _creationTimeMeta)); - } else if (creationTime.isRequired && isInserting) { - context.missing(_creationTimeMeta); - } - return context; - } - - @override - Set get $primaryKey => {id}; - @override - User map(Map data, {String tablePrefix}) { - final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : null; - return User.fromData(data, _db, prefix: effectivePrefix); - } - - @override - Map entityToSql(UsersCompanion d) { - final map = {}; - if (d.id.present) { - map['id'] = Variable(d.id.value); - } - if (d.name.present) { - map['name'] = Variable(d.name.value); - } - if (d.isAwesome.present) { - map['is_awesome'] = Variable(d.isAwesome.value); - } - if (d.profilePicture.present) { - map['profile_picture'] = - Variable(d.profilePicture.value); - } - if (d.creationTime.present) { - map['creation_time'] = - Variable(d.creationTime.value); - } - return map; - } - - @override - $UsersTable createAlias(String alias) { - return $UsersTable(_db, alias); - } -} - -class SharedTodo extends DataClass implements Insertable { - final int todo; - final int user; - SharedTodo({@required this.todo, @required this.user}); - factory SharedTodo.fromData(Map data, GeneratedDatabase db, - {String prefix}) { - final effectivePrefix = prefix ?? ''; - final intType = db.typeSystem.forDartType(); - return SharedTodo( - todo: intType.mapFromDatabaseResponse(data['${effectivePrefix}todo']), - user: intType.mapFromDatabaseResponse(data['${effectivePrefix}user']), - ); - } - factory SharedTodo.fromJson(Map json, - {ValueSerializer serializer = const ValueSerializer.defaults()}) { - return SharedTodo( - todo: serializer.fromJson(json['todo']), - user: serializer.fromJson(json['user']), - ); - } - @override - Map toJson( - {ValueSerializer serializer = const ValueSerializer.defaults()}) { - return { - 'todo': serializer.toJson(todo), - 'user': serializer.toJson(user), - }; - } - - @override - T createCompanion>(bool nullToAbsent) { - return SharedTodosCompanion( - todo: todo == null && nullToAbsent ? const Value.absent() : Value(todo), - user: user == null && nullToAbsent ? const Value.absent() : Value(user), - ) as T; - } - - SharedTodo copyWith({int todo, int user}) => SharedTodo( - todo: todo ?? this.todo, - user: user ?? this.user, - ); - @override - String toString() { - return (StringBuffer('SharedTodo(') - ..write('todo: $todo, ') - ..write('user: $user') - ..write(')')) - .toString(); - } - - @override - int get hashCode => $mrjf($mrjc($mrjc(0, todo.hashCode), user.hashCode)); - @override - bool operator ==(other) => - identical(this, other) || - (other is SharedTodo && other.todo == todo && other.user == user); -} - -class SharedTodosCompanion extends UpdateCompanion { - final Value todo; - final Value user; - const SharedTodosCompanion({ - this.todo = const Value.absent(), - this.user = const Value.absent(), - }); -} - -class $SharedTodosTable extends SharedTodos - with TableInfo<$SharedTodosTable, SharedTodo> { - final GeneratedDatabase _db; - final String _alias; - $SharedTodosTable(this._db, [this._alias]); - final VerificationMeta _todoMeta = const VerificationMeta('todo'); - GeneratedIntColumn _todo; - @override - GeneratedIntColumn get todo => _todo ??= _constructTodo(); - GeneratedIntColumn _constructTodo() { - return GeneratedIntColumn( - 'todo', - $tableName, - false, - ); - } - - final VerificationMeta _userMeta = const VerificationMeta('user'); - GeneratedIntColumn _user; - @override - GeneratedIntColumn get user => _user ??= _constructUser(); - GeneratedIntColumn _constructUser() { - return GeneratedIntColumn( - 'user', - $tableName, - false, - ); - } - - @override - List get $columns => [todo, user]; - @override - $SharedTodosTable get asDslTable => this; - @override - String get $tableName => _alias ?? 'shared_todos'; - @override - final String actualTableName = 'shared_todos'; - @override - VerificationContext validateIntegrity(SharedTodosCompanion d, - {bool isInserting = false}) { - final context = VerificationContext(); - if (d.todo.present) { - context.handle( - _todoMeta, todo.isAcceptableValue(d.todo.value, _todoMeta)); - } else if (todo.isRequired && isInserting) { - context.missing(_todoMeta); - } - if (d.user.present) { - context.handle( - _userMeta, user.isAcceptableValue(d.user.value, _userMeta)); - } else if (user.isRequired && isInserting) { - context.missing(_userMeta); - } - return context; - } - - @override - Set get $primaryKey => {todo, user}; - @override - SharedTodo map(Map data, {String tablePrefix}) { - final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : null; - return SharedTodo.fromData(data, _db, prefix: effectivePrefix); - } - - @override - Map entityToSql(SharedTodosCompanion d) { - final map = {}; - if (d.todo.present) { - map['todo'] = Variable(d.todo.value); - } - if (d.user.present) { - map['user'] = Variable(d.user.value); - } - return map; - } - - @override - $SharedTodosTable createAlias(String alias) { - return $SharedTodosTable(_db, alias); - } -} - -class TableWithoutPKData extends DataClass - implements Insertable { - final int notReallyAnId; - final double someFloat; - TableWithoutPKData({@required this.notReallyAnId, @required this.someFloat}); - factory TableWithoutPKData.fromData( - Map data, GeneratedDatabase db, - {String prefix}) { - final effectivePrefix = prefix ?? ''; - final intType = db.typeSystem.forDartType(); - final doubleType = db.typeSystem.forDartType(); - return TableWithoutPKData( - notReallyAnId: intType - .mapFromDatabaseResponse(data['${effectivePrefix}not_really_an_id']), - someFloat: doubleType - .mapFromDatabaseResponse(data['${effectivePrefix}some_float']), - ); - } - factory TableWithoutPKData.fromJson(Map json, - {ValueSerializer serializer = const ValueSerializer.defaults()}) { - return TableWithoutPKData( - notReallyAnId: serializer.fromJson(json['notReallyAnId']), - someFloat: serializer.fromJson(json['someFloat']), - ); - } - @override - Map toJson( - {ValueSerializer serializer = const ValueSerializer.defaults()}) { - return { - 'notReallyAnId': serializer.toJson(notReallyAnId), - 'someFloat': serializer.toJson(someFloat), - }; - } - - @override - T createCompanion>( - bool nullToAbsent) { - return TableWithoutPKCompanion( - notReallyAnId: notReallyAnId == null && nullToAbsent - ? const Value.absent() - : Value(notReallyAnId), - someFloat: someFloat == null && nullToAbsent - ? const Value.absent() - : Value(someFloat), - ) as T; - } - - TableWithoutPKData copyWith({int notReallyAnId, double someFloat}) => - TableWithoutPKData( - notReallyAnId: notReallyAnId ?? this.notReallyAnId, - someFloat: someFloat ?? this.someFloat, - ); - @override - String toString() { - return (StringBuffer('TableWithoutPKData(') - ..write('notReallyAnId: $notReallyAnId, ') - ..write('someFloat: $someFloat') - ..write(')')) - .toString(); - } - - @override - int get hashCode => - $mrjf($mrjc($mrjc(0, notReallyAnId.hashCode), someFloat.hashCode)); - @override - bool operator ==(other) => - identical(this, other) || - (other is TableWithoutPKData && - other.notReallyAnId == notReallyAnId && - other.someFloat == someFloat); -} - -class TableWithoutPKCompanion extends UpdateCompanion { - final Value notReallyAnId; - final Value someFloat; - const TableWithoutPKCompanion({ - this.notReallyAnId = const Value.absent(), - this.someFloat = const Value.absent(), - }); -} - -class $TableWithoutPKTable extends TableWithoutPK - with TableInfo<$TableWithoutPKTable, TableWithoutPKData> { - final GeneratedDatabase _db; - final String _alias; - $TableWithoutPKTable(this._db, [this._alias]); - final VerificationMeta _notReallyAnIdMeta = - const VerificationMeta('notReallyAnId'); - GeneratedIntColumn _notReallyAnId; - @override - GeneratedIntColumn get notReallyAnId => - _notReallyAnId ??= _constructNotReallyAnId(); - GeneratedIntColumn _constructNotReallyAnId() { - return GeneratedIntColumn( - 'not_really_an_id', - $tableName, - false, - ); - } - - final VerificationMeta _someFloatMeta = const VerificationMeta('someFloat'); - GeneratedRealColumn _someFloat; - @override - GeneratedRealColumn get someFloat => _someFloat ??= _constructSomeFloat(); - GeneratedRealColumn _constructSomeFloat() { - return GeneratedRealColumn( - 'some_float', - $tableName, - false, - ); - } - - @override - List get $columns => [notReallyAnId, someFloat]; - @override - $TableWithoutPKTable get asDslTable => this; - @override - String get $tableName => _alias ?? 'table_without_p_k'; - @override - final String actualTableName = 'table_without_p_k'; - @override - VerificationContext validateIntegrity(TableWithoutPKCompanion d, - {bool isInserting = false}) { - final context = VerificationContext(); - if (d.notReallyAnId.present) { - context.handle( - _notReallyAnIdMeta, - notReallyAnId.isAcceptableValue( - d.notReallyAnId.value, _notReallyAnIdMeta)); - } else if (notReallyAnId.isRequired && isInserting) { - context.missing(_notReallyAnIdMeta); - } - if (d.someFloat.present) { - context.handle(_someFloatMeta, - someFloat.isAcceptableValue(d.someFloat.value, _someFloatMeta)); - } else if (someFloat.isRequired && isInserting) { - context.missing(_someFloatMeta); - } - return context; - } - - @override - Set get $primaryKey => {}; - @override - TableWithoutPKData map(Map data, {String tablePrefix}) { - final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : null; - return TableWithoutPKData.fromData(data, _db, prefix: effectivePrefix); - } - - @override - Map entityToSql(TableWithoutPKCompanion d) { - final map = {}; - if (d.notReallyAnId.present) { - map['not_really_an_id'] = Variable(d.notReallyAnId.value); - } - if (d.someFloat.present) { - map['some_float'] = Variable(d.someFloat.value); - } - return map; - } - - @override - $TableWithoutPKTable createAlias(String alias) { - return $TableWithoutPKTable(_db, alias); - } -} - -abstract class _$TodoDb extends GeneratedDatabase { - _$TodoDb(QueryExecutor e) : super(const SqlTypeSystem.withDefaults(), e); - $TodosTableTable _todosTable; - $TodosTableTable get todosTable => _todosTable ??= $TodosTableTable(this); - $CategoriesTable _categories; - $CategoriesTable get categories => _categories ??= $CategoriesTable(this); - $UsersTable _users; - $UsersTable get users => _users ??= $UsersTable(this); - $SharedTodosTable _sharedTodos; - $SharedTodosTable get sharedTodos => _sharedTodos ??= $SharedTodosTable(this); - $TableWithoutPKTable _tableWithoutPK; - $TableWithoutPKTable get tableWithoutPK => - _tableWithoutPK ??= $TableWithoutPKTable(this); - @override - List get allTables => - [todosTable, categories, users, sharedTodos, tableWithoutPK]; -} diff --git a/moor_generator/lib/src/model/specified_database.dart b/moor_generator/lib/src/model/specified_database.dart index 13433015..84ccf5fd 100644 --- a/moor_generator/lib/src/model/specified_database.dart +++ b/moor_generator/lib/src/model/specified_database.dart @@ -1,11 +1,13 @@ import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:moor_generator/src/model/specified_table.dart'; +import 'package:moor_generator/src/model/sql_query.dart'; class SpecifiedDatabase { final ClassElement fromClass; final List tables; final List daos; + final List queries; - SpecifiedDatabase(this.fromClass, this.tables, this.daos); + SpecifiedDatabase(this.fromClass, this.tables, this.daos, this.queries); } diff --git a/moor_generator/lib/src/model/sql_query.dart b/moor_generator/lib/src/model/sql_query.dart new file mode 100644 index 00000000..7f4d9fb0 --- /dev/null +++ b/moor_generator/lib/src/model/sql_query.dart @@ -0,0 +1,34 @@ +import 'package:moor_generator/src/model/specified_column.dart'; +import 'package:moor_generator/src/model/specified_table.dart'; + +abstract class SqlQuery { + final String name; + + SqlQuery(this.name); +} + +class SqlSelectQuery extends SqlQuery { + final List readsFrom; + final InferredResultSet resultSet; + + SqlSelectQuery(String name, this.readsFrom, this.resultSet) : super(name); +} + +class InferredResultSet { + /// If the result columns of a SELECT statement exactly match one table, we + /// can just use the data class generated for that table. Otherwise, we'd have + /// to create another class. + // todo implement this check + final SpecifiedTable matchingTable; + final List columns; + + InferredResultSet(this.matchingTable, this.columns); +} + +class ResultColumn { + final String name; + final ColumnType type; + final bool nullable; + + ResultColumn(this.name, this.type, this.nullable); +} diff --git a/moor_generator/lib/src/moor_generator.dart b/moor_generator/lib/src/moor_generator.dart index 94e1e7f9..32822e51 100644 --- a/moor_generator/lib/src/moor_generator.dart +++ b/moor_generator/lib/src/moor_generator.dart @@ -13,6 +13,9 @@ import 'package:moor_generator/src/parser/table_parser.dart'; import 'package:moor_generator/src/writer/database_writer.dart'; import 'package:source_gen/source_gen.dart'; +import 'model/sql_query.dart'; +import 'parser/sql/sql_parser.dart'; + class MoorGenerator extends GeneratorForAnnotation { //final Map _astForLibs = {}; final ErrorStore errors = ErrorStore(); @@ -47,11 +50,13 @@ class MoorGenerator extends GeneratorForAnnotation { .listValue .map((obj) => obj.toTypeValue()) .toList(); + final queries = annotation.peek('queries')?.listValue ?? []; tableParser ??= TableParser(this); columnParser ??= ColumnParser(this); final tablesForThisDb = []; + var resolvedQueries = []; for (var table in tableTypes) { if (!tableTypeChecker.isAssignableFrom(table.element)) { @@ -67,7 +72,7 @@ class MoorGenerator extends GeneratorForAnnotation { } if (errors.errors.isNotEmpty) { - print('Warning: There were some errors whily running moor_generator:'); + print('Warning: There were some errors while running moor_generator:'); for (var error in errors.errors) { print(error.message); @@ -80,10 +85,17 @@ class MoorGenerator extends GeneratorForAnnotation { errors.errors.clear(); } + if (queries.isNotEmpty) { + final parser = SqlParser(options, tablesForThisDb, queries)..parse(); + errors.errors.addAll(parser.errors); + + resolvedQueries = parser.foundQueries; + } + if (_foundTables.isEmpty) return ''; - final specifiedDb = - SpecifiedDatabase(element as ClassElement, tablesForThisDb, daoTypes); + final specifiedDb = SpecifiedDatabase( + element as ClassElement, tablesForThisDb, daoTypes, resolvedQueries); final buffer = StringBuffer() ..write('// ignore_for_file: unnecessary_brace_in_string_interps\n'); diff --git a/moor_generator/lib/src/parser/sql/affected_tables_visitor.dart b/moor_generator/lib/src/parser/sql/affected_tables_visitor.dart new file mode 100644 index 00000000..0cc2d7ea --- /dev/null +++ b/moor_generator/lib/src/parser/sql/affected_tables_visitor.dart @@ -0,0 +1,26 @@ +import 'package:sqlparser/sqlparser.dart'; + +/// An AST-visitor that walks sql statements and finds all tables referenced in +/// them. +class AffectedTablesVisitor extends RecursiveVisitor { + final Set foundTables = {}; + + @override + void visitReference(Reference e) { + final column = e.resolved as Column; + if (column is TableColumn) { + foundTables.add(column.table); + } + + visitChildren(e); + } + + @override + void visitQueryable(Queryable e) { + if (e is TableReference) { + foundTables.add(e.resolved as Table); + } + + visitChildren(e); + } +} diff --git a/moor_generator/lib/src/parser/sql/sql_parser.dart b/moor_generator/lib/src/parser/sql/sql_parser.dart new file mode 100644 index 00000000..cab3cbc6 --- /dev/null +++ b/moor_generator/lib/src/parser/sql/sql_parser.dart @@ -0,0 +1,126 @@ +import 'package:analyzer/dart/constant/value.dart'; +import 'package:moor_generator/src/errors.dart'; +import 'package:moor_generator/src/model/specified_column.dart'; +import 'package:moor_generator/src/model/specified_table.dart'; +import 'package:moor_generator/src/model/sql_query.dart'; +import 'package:moor_generator/src/options.dart'; +import 'package:sqlparser/sqlparser.dart' hide ResultColumn; + +import 'affected_tables_visitor.dart'; + +class SqlParser { + final MoorOptions options; + final List tables; + final List definedQueries; + + SqlEngine _engine; + final Map _engineTablesToSpecified = {}; + + final List foundQueries = []; + final List errors = []; + + SqlParser(this.options, this.tables, this.definedQueries); + + void _spawnEngine() { + _engine = SqlEngine(); + tables.map(_extractStructure).forEach(_engine.registerTable); + } + + /// Convert a [SpecifiedTable] from moor into something that can be understood + /// by the sqlparser library. + Table _extractStructure(SpecifiedTable table) { + final columns = []; + for (var specified in table.columns) { + final type = _resolveForColumnType(specified.type) + .withNullable(specified.nullable); + columns.add(TableColumn(specified.name.name, type)); + } + + final engineTable = Table(name: table.sqlName, resolvedColumns: columns); + _engineTablesToSpecified[engineTable] = table; + return engineTable; + } + + ResolvedType _resolveForColumnType(ColumnType type) { + switch (type) { + case ColumnType.integer: + return const ResolvedType(type: BasicType.int); + case ColumnType.text: + return const ResolvedType(type: BasicType.text); + case ColumnType.boolean: + return const ResolvedType(type: BasicType.int, hint: IsBoolean()); + case ColumnType.datetime: + return const ResolvedType(type: BasicType.int, hint: IsDateTime()); + case ColumnType.blob: + return const ResolvedType(type: BasicType.blob); + case ColumnType.real: + return const ResolvedType(type: BasicType.real); + } + throw StateError('cant happen'); + } + + ColumnType _resolvedToMoor(ResolvedType type) { + switch (type.type) { + case BasicType.nullType: + return ColumnType.text; + case BasicType.int: + if (type.hint is IsBoolean) { + return ColumnType.boolean; + } else if (type.hint is IsDateTime) { + return ColumnType.datetime; + } + return ColumnType.integer; + case BasicType.real: + return ColumnType.real; + case BasicType.text: + return ColumnType.text; + case BasicType.blob: + return ColumnType.blob; + } + throw StateError('Unexpected type: $type'); + } + + void parse() { + _spawnEngine(); + + for (var query in definedQueries) { + final name = query.getField('name').toStringValue(); + final sql = query.getField('query').toStringValue(); + + final context = _engine.analyze(sql); + + for (var error in context.errors) { + errors.add(MoorError( + message: 'The sql query $sql is invalid: ${error.message}', + )); + } + + final root = context.root; + if (root is SelectStatement) { + _handleSelect(name, root, context); + } else { + throw StateError('Unexpected sql'); + } + } + } + + void _handleSelect( + String queryName, SelectStatement stmt, AnalysisContext ctx) { + final tableFinder = AffectedTablesVisitor(); + stmt.accept(tableFinder); + + final foundTables = tableFinder.foundTables; + final moorTables = foundTables.map((t) => _engineTablesToSpecified[t]); + final resultColumns = stmt.resolvedColumns; + + final moorColumns = []; + for (var column in resultColumns) { + final type = ctx.typeOf(column).type; + moorColumns + .add(ResultColumn(column.name, _resolvedToMoor(type), type.nullable)); + } + + final resultSet = InferredResultSet(null, moorColumns); + foundQueries.add(SqlSelectQuery(queryName, moorTables.toList(), resultSet)); + } +} diff --git a/moor_generator/pubspec.yaml b/moor_generator/pubspec.yaml index 6026f727..c350e5d3 100644 --- a/moor_generator/pubspec.yaml +++ b/moor_generator/pubspec.yaml @@ -21,7 +21,8 @@ dependencies: build_config: '>=0.3.1 <1.0.0' moor: ^1.4.0 meta: '>= 1.0.0 <2.0.0' - + sqlparser: + path: ../sqlparser dev_dependencies: test: ^1.6.0 test_api: ^0.2.0 diff --git a/sqlparser/lib/src/analysis/schema/column.dart b/sqlparser/lib/src/analysis/schema/column.dart index ce192ad1..c8381ad6 100644 --- a/sqlparser/lib/src/analysis/schema/column.dart +++ b/sqlparser/lib/src/analysis/schema/column.dart @@ -11,7 +11,9 @@ class TableColumn extends Column { final String name; final ResolvedType type; - const TableColumn(this.name, this.type); + Table table; + + TableColumn(this.name, this.type); } class ExpressionColumn extends Column { diff --git a/sqlparser/lib/src/analysis/schema/table.dart b/sqlparser/lib/src/analysis/schema/table.dart index dca8c490..c44789cc 100644 --- a/sqlparser/lib/src/analysis/schema/table.dart +++ b/sqlparser/lib/src/analysis/schema/table.dart @@ -23,5 +23,9 @@ class Table with ResultSet, VisibleToChildren { @override final List resolvedColumns; - Table({@required this.name, this.resolvedColumns}); + Table({@required this.name, this.resolvedColumns}) { + for (var column in resolvedColumns) { + column.table = this; + } + } } diff --git a/sqlparser/lib/src/analysis/steps/column_resolver.dart b/sqlparser/lib/src/analysis/steps/column_resolver.dart index af3ad4fc..76c0333a 100644 --- a/sqlparser/lib/src/analysis/steps/column_resolver.dart +++ b/sqlparser/lib/src/analysis/steps/column_resolver.dart @@ -23,6 +23,7 @@ class ColumnResolver extends RecursiveVisitor { availableColumns.addAll(select.statement.resolvedColumns); }, isJoin: (join) { + _handle(join.primary, availableColumns); for (var query in join.joins.map((j) => j.query)) { _handle(query, availableColumns); } @@ -52,6 +53,7 @@ class ColumnResolver extends RecursiveVisitor { relevantNode: resultColumn, )); }); + usedColumns.addAll(tableResolver.resultSet.resolvedColumns); } else { // we have a * column, that would be all available columns diff --git a/sqlparser/lib/src/ast/ast.dart b/sqlparser/lib/src/ast/ast.dart index a58388a5..cc214fd8 100644 --- a/sqlparser/lib/src/ast/ast.dart +++ b/sqlparser/lib/src/ast/ast.dart @@ -18,6 +18,7 @@ part 'expressions/subquery.dart'; part 'expressions/variables.dart'; part 'statements/select.dart'; +part 'statements/statement.dart'; abstract class AstNode { /// The parent of this node, or null if this is the root node. Will be set diff --git a/sqlparser/lib/src/ast/statements/select.dart b/sqlparser/lib/src/ast/statements/select.dart index 51186c94..5854076f 100644 --- a/sqlparser/lib/src/ast/statements/select.dart +++ b/sqlparser/lib/src/ast/statements/select.dart @@ -1,6 +1,6 @@ part of '../ast.dart'; -class SelectStatement extends AstNode with ResultSet { +class SelectStatement extends Statement with ResultSet { final bool distinct; final List columns; final List from; diff --git a/sqlparser/lib/src/ast/statements/statement.dart b/sqlparser/lib/src/ast/statements/statement.dart new file mode 100644 index 00000000..c37148a3 --- /dev/null +++ b/sqlparser/lib/src/ast/statements/statement.dart @@ -0,0 +1,3 @@ +part of '../ast.dart'; + +abstract class Statement extends AstNode {} diff --git a/sqlparser/lib/src/engine/sql_engine.dart b/sqlparser/lib/src/engine/sql_engine.dart index bee85928..d11f4173 100644 --- a/sqlparser/lib/src/engine/sql_engine.dart +++ b/sqlparser/lib/src/engine/sql_engine.dart @@ -37,7 +37,7 @@ class SqlEngine { // todo error handling from scanner final parser = Parser(tokens); - return parser.select(); + return parser.statement(); } AnalysisContext analyze(String sql) { diff --git a/sqlparser/lib/src/reader/parser/parser.dart b/sqlparser/lib/src/reader/parser/parser.dart index 58e73421..1bef2a29 100644 --- a/sqlparser/lib/src/reader/parser/parser.dart +++ b/sqlparser/lib/src/reader/parser/parser.dart @@ -92,6 +92,12 @@ class Parser { _error(message); } + Statement statement() { + final stmt = select(); + _matchOne(TokenType.semicolon); + return stmt; + } + /// Parses a [SelectStatement], or returns null if there is no select token /// after the current position. /// diff --git a/sqlparser/lib/src/reader/tokenizer/scanner.dart b/sqlparser/lib/src/reader/tokenizer/scanner.dart index a585e275..fc74f3fd 100644 --- a/sqlparser/lib/src/reader/tokenizer/scanner.dart +++ b/sqlparser/lib/src/reader/tokenizer/scanner.dart @@ -112,6 +112,9 @@ class Scanner { case ':': _addToken(TokenType.colon); break; + case ';': + _addToken(TokenType.semicolon); + break; case 'x': if (_match("'")) { diff --git a/sqlparser/lib/src/reader/tokenizer/token.dart b/sqlparser/lib/src/reader/tokenizer/token.dart index 51bed8ab..ed2337f0 100644 --- a/sqlparser/lib/src/reader/tokenizer/token.dart +++ b/sqlparser/lib/src/reader/tokenizer/token.dart @@ -76,6 +76,7 @@ enum TokenType { limit, offset, + semicolon, eof, } diff --git a/sqlparser/test/analysis/reference_resolver_test.dart b/sqlparser/test/analysis/reference_resolver_test.dart index 453802bd..f3c976a2 100644 --- a/sqlparser/test/analysis/reference_resolver_test.dart +++ b/sqlparser/test/analysis/reference_resolver_test.dart @@ -12,9 +12,9 @@ void main() { }); test('correctly resolves return columns', () { - final id = const TableColumn('id', ResolvedType(type: BasicType.int)); + final id = TableColumn('id', const ResolvedType(type: BasicType.int)); final content = - const TableColumn('content', ResolvedType(type: BasicType.text)); + TableColumn('content', const ResolvedType(type: BasicType.text)); final demoTable = Table( name: 'demo', diff --git a/sqlparser/test/analysis/type_resolver_test.dart b/sqlparser/test/analysis/type_resolver_test.dart index 6b9f6730..f38a9443 100644 --- a/sqlparser/test/analysis/type_resolver_test.dart +++ b/sqlparser/test/analysis/type_resolver_test.dart @@ -11,9 +11,9 @@ Map _types = { }; void main() { - final id = const TableColumn('id', ResolvedType(type: BasicType.int)); + final id = TableColumn('id', const ResolvedType(type: BasicType.int)); final content = - const TableColumn('content', ResolvedType(type: BasicType.text)); + TableColumn('content', const ResolvedType(type: BasicType.text)); final demoTable = Table( name: 'demo',