public void equivalency_negative_column_type_changed() { var users = new DocumentMapping(typeof(User)); var table1 = users.ToTable(null); var table2 = users.ToTable(null); table2.PrimaryKey.Type = "int"; table2.ShouldNotBe(table1); }
public void equivalency_negative_different_numbers_of_columns() { var users = new DocumentMapping(typeof(User)); var table1 = users.ToTable(null); var table2 = users.ToTable(null); table2.Columns.Add(new TableColumn("user_name", "character varying")); table2.ShouldNotBe(table1); }
public void equivalency_positive() { var users = new DocumentMapping(typeof(User)); var table1 = users.ToTable(null); var table2 = users.ToTable(null); table2.ShouldBe(table1); table1.ShouldBe(table2); table1.ShouldNotBeSameAs(table2); }
public SchemaDiff(IDocumentSchema schema, SchemaObjects existing, DocumentMapping mapping) { if (existing.HasNone()) { AllMissing = true; } else { var expectedTable = mapping.ToTable(schema); TableDiff = new TableDiff(expectedTable, existing.Table); // TODO -- drop obsolete indices? mapping.Indexes.Each(index => { if (existing.ActualIndices.ContainsKey(index.IndexName)) { var actualIndex = existing.ActualIndices[index.IndexName]; if (!index.Matches(actualIndex)) { IndexChanges.Add($"drop index {expectedTable.Table.Schema}.{index.IndexName};{index.ToDDL()}"); } } else { IndexChanges.Add(index.ToDDL()); } }); } _existing = existing; _mapping = mapping; _schema = schema; }
public static void WriteSchemaObjects(DocumentMapping mapping, IDocumentSchema schema, StringWriter writer) { var table = mapping.ToTable(schema); table.Write(writer); writer.WriteLine(); writer.WriteLine(); var pgIdType = TypeMappings.GetPgType(mapping.IdMember.GetMemberType()); var args = new List<UpsertArgument> { new UpsertArgument {Arg = "docId", PostgresType = pgIdType}, new UpsertArgument {Arg = "doc", PostgresType = "JSON"} }; var duplicates = mapping.DuplicatedFields.Select(x => x.UpsertArgument).ToArray(); args.AddRange(duplicates); var argList = args.Select(x => x.ArgumentDeclaration()).Join(", "); var valueList = args.Select(x => x.Arg).Join(", "); var updates = "data = doc"; if (duplicates.Any()) { updates += ", " + duplicates.Select(x => $"{x.Column} = {x.Arg}").Join(", "); } writer.WriteLine($"CREATE OR REPLACE FUNCTION {mapping.UpsertName}({argList}) RETURNS VOID AS"); writer.WriteLine("$$"); writer.WriteLine("BEGIN"); writer.WriteLine($"INSERT INTO {mapping.TableName} VALUES ({valueList})"); writer.WriteLine($" ON CONFLICT ON CONSTRAINT pk_{mapping.TableName}"); writer.WriteLine($" DO UPDATE SET {updates};"); writer.WriteLine("END;"); writer.WriteLine("$$ LANGUAGE plpgsql;"); writer.WriteLine(); writer.WriteLine(); }
public static void WriteSchemaObjects(DocumentMapping mapping, IDocumentSchema schema, StringWriter writer) { var table = mapping.ToTable(schema); table.Write(writer); writer.WriteLine(); writer.WriteLine(); var pgIdType = TypeMappings.GetPgType(mapping.IdMember.GetMemberType()); var args = new List<UpsertArgument> { new UpsertArgument {Arg = "docId", PostgresType = pgIdType}, new UpsertArgument {Arg = "doc", PostgresType = "JSONB"} }; var duplicates = mapping.DuplicatedFields.Select(x => x.UpsertArgument).ToArray(); args.AddRange(duplicates); var argList = args.Select(x => x.ArgumentDeclaration()).Join(", "); var valueList = args.Select(x => x.Arg).Join(", "); var updates = "data = doc"; if (duplicates.Any()) { updates += ", " + duplicates.Select(x => $"{x.Column} = {x.Arg}").Join(", "); } if (schema != null && schema.UpsertType == PostgresUpsertType.Legacy) { var inserts = "id, data"; if (duplicates.Any()) { inserts += ", " + duplicates.Select(x => x.Column).Join(", "); } writer.WriteLine($"CREATE OR REPLACE FUNCTION {mapping.UpsertName}({argList}) RETURNS VOID AS"); writer.WriteLine("$$"); writer.WriteLine("BEGIN"); writer.WriteLine($"LOCK TABLE {mapping.TableName} IN SHARE ROW EXCLUSIVE MODE;"); writer.WriteLine($" WITH upsert AS (UPDATE {mapping.TableName} SET {updates} WHERE id=docId RETURNING *) "); writer.WriteLine($" INSERT INTO {mapping.TableName} ({inserts})"); writer.WriteLine($" SELECT {valueList} WHERE NOT EXISTS (SELECT * FROM upsert);"); writer.WriteLine("END;"); writer.WriteLine("$$ LANGUAGE plpgsql;"); } else { writer.WriteLine($"CREATE OR REPLACE FUNCTION {mapping.UpsertName}({argList}) RETURNS VOID AS"); writer.WriteLine("$$"); writer.WriteLine("BEGIN"); writer.WriteLine($"INSERT INTO {mapping.TableName} VALUES ({valueList})"); writer.WriteLine($" ON CONFLICT ON CONSTRAINT pk_{mapping.TableName}"); writer.WriteLine($" DO UPDATE SET {updates};"); writer.WriteLine("END;"); writer.WriteLine("$$ LANGUAGE plpgsql;"); } mapping.Indexes.Each(x => { writer.WriteLine(); writer.WriteLine(x.ToDDL()); }); writer.WriteLine(); writer.WriteLine(); }
public TableDefinition ToTable(IDocumentSchema schema) { return(_parent.ToTable(schema)); }