public NpgsqlCommand ToCommand() { if (_query.ResultOperators.OfType <LastResultOperator>().Any()) { throw new InvalidOperationException("Marten does not support the Last() or LastOrDefault() operations. Use a combination of ordering and First/FirstOrDefault() instead"); } var command = new NpgsqlCommand(); var select = _mapping.SelectFields("d"); var sql = $"select {select} from {_mapping.TableName} as d"; var where = buildWhereClause(); var orderBy = toOrderClause(); sql = appendLateralJoin(sql); if (@where != null) { sql += " where " + @where.ToSql(command); } if (orderBy.IsNotEmpty()) { sql += orderBy; } sql = appendLimit(sql); sql = appendOffset(sql); command.CommandText = sql; return(command); }
public static void GenerateDocumentStorage(IDocumentMapping mapping, SourceWriter writer) { var upsertFunction = mapping.ToUpsertFunction(); var id_NpgsqlDbType = TypeMappings.ToDbType(mapping.IdMember.GetMemberType()); var typeName = mapping.DocumentType.GetTypeName(); var storageArguments = mapping.ToArguments().ToArray(); var ctorArgs = storageArguments.Select(x => x.ToCtorArgument()).Join(", "); var ctorLines = storageArguments.Select(x => x.ToCtorLine()).Join("\n"); var fields = storageArguments.Select(x => x.ToFieldDeclaration()).Join("\n"); writer.Write( $@" BLOCK:public class {mapping.DocumentType.Name}Storage : IDocumentStorage, IBulkLoader<{typeName}>, IdAssignment<{typeName}>, IResolver<{typeName}> {fields} BLOCK:public {mapping.DocumentType.Name}Storage({ctorArgs}) {ctorLines} END public Type DocumentType => typeof ({typeName}); BLOCK:public NpgsqlCommand UpsertCommand(object document, string json) return UpsertCommand(({typeName})document, json); END BLOCK:public NpgsqlCommand LoaderCommand(object id) return new NpgsqlCommand(`select {mapping.SelectFields("d")} from {mapping.TableName} as d where id = :id`).With(`id`, id); END BLOCK:public NpgsqlCommand DeleteCommandForId(object id) return new NpgsqlCommand(`delete from {mapping.TableName} where id = :id`).With(`id`, id); END BLOCK:public NpgsqlCommand DeleteCommandForEntity(object entity) return DeleteCommandForId((({typeName})entity).{mapping.IdMember.Name}); END BLOCK:public NpgsqlCommand LoadByArrayCommand<T>(T[] ids) return new NpgsqlCommand(`select {mapping.SelectFields("d")} from {mapping.TableName} as d where id = ANY(:ids)`).With(`ids`, ids); END BLOCK:public void Remove(IIdentityMap map, object entity) var id = Identity(entity); map.Remove<{typeName}>(id); END BLOCK:public void Delete(IIdentityMap map, object id) map.Remove<{typeName}>(id); END BLOCK:public void Store(IIdentityMap map, object id, object entity) map.Store<{typeName}>(id, ({typeName})entity); END BLOCK:public object Assign({typeName} document) {mapping.IdStrategy.AssignmentBodyCode(mapping.IdMember)} return document.{mapping.IdMember.Name}; END BLOCK:public object Retrieve({typeName} document) return document.{mapping.IdMember.Name}; END BLOCK:public {typeName} Build(DbDataReader reader, ISerializer serializer) return serializer.FromJson<{typeName}>(reader.GetString(0)); END public NpgsqlDbType IdType => NpgsqlDbType.{id_NpgsqlDbType}; BLOCK:public object Identity(object document) return (({typeName})document).{mapping.IdMember.Name}; END BLOCK:public {typeName} Resolve(IIdentityMap map, ILoader loader, object id) return map.Get(id, () => loader.LoadDocument<{typeName}>(id)) as {typeName}; END BLOCK:public Task<{typeName}> ResolveAsync(IIdentityMap map, ILoader loader, CancellationToken token, object id) return map.GetAsync(id, (tk => loader.LoadDocumentAsync<{typeName}>(id, tk)), token).ContinueWith(x => x.Result as {typeName}, token); END {mapping.ToResolveMethod(typeName)} {upsertFunction.ToUpdateBatchMethod(typeName)} {upsertFunction.ToBulkInsertMethod(typeName)} END "); }