/// <summary> /// Formata o texto de uma <see cref="QueryInfo" /> /// </summary> /// <param name="queryInfo"></param> /// <param name="ignoreContainerFormat">Identifica que é para ignorar a formatação de de container para a consulta.</param> /// <returns></returns> private MySqlQueryParser Format(QueryInfo queryInfo, bool ignoreContainerFormat = false) { var parser = new MySqlQueryParser(this.Translator, this.TypeSchema) { Query = queryInfo, Owner = this, UseTakeParameter = true }; foreach (var parameter in queryInfo.Parameters) { if (!this.Query.Parameters.Any(f => f.Name == parameter.Name)) { this.Query.Parameters.Add(parameter); } } if (!ignoreContainerFormat) { Append('('); } Append(parser.GetText()); if (!ignoreContainerFormat) { Append(')'); } return(this); }
/// <summary> /// Adiciona ao campo string builder o texto correspondente a parte SELECT da query /// </summary> /// <returns>Retorna o próprio objeto</returns> private MySqlQueryParser SelectParser() { if (Query.IsSelectDistinct) { Append("SELECT DISTINCT "); } else { Append("SELECT "); } ITypeMetadata mainTypeMetadata = null; for (int i = 0; i < Query.Entities.Length; i++) { if (string.IsNullOrEmpty(Query.Entities[i].FullName)) { continue; } ITypeMetadata typeMetadata = null; if (!Query.IgnoreTypeSchema) { typeMetadata = TypeSchema.GetTypeMetadata(Query.Entities[i].FullName); if (typeMetadata == null) { throw new InvalidOperationException(ResourceMessageFormatter.Create(() => Properties.Resources.InvalidOperationException_TypeMetadataNotFoundByFullName, Query.Entities[i].FullName).Format()); } } if (i == 0) { mainTypeMetadata = typeMetadata; if (string.IsNullOrEmpty(Query.Entities[i].Alias)) { Query.Entities[i].Alias = "main"; } } else if (string.IsNullOrEmpty(Query.Entities[i].Alias)) { Query.Entities[i].Alias = "main" + i.ToString(); } } EntityInfo entity = Query.Entities[0]; if (!string.IsNullOrEmpty(entity.FullName)) { if (Query.Projection == null) { if (mainTypeMetadata != null && mainTypeMetadata.IsVersioned) { Query.HasRowVersion = true; } var properties = mainTypeMetadata != null?mainTypeMetadata.Where(f => f.Direction == Data.Schema.DirectionParameter.Input || f.Direction == Data.Schema.DirectionParameter.InputOutput).ToArray() : new IPropertyMetadata[0]; if (properties.Length == 0) { throw new InvalidOperationException(ResourceMessageFormatter.Create(() => Properties.Resources.InvalidOperationException_NotFoundPropertiesForTypeMetadata, entity.FullName).Format()); } Query.Projection = new Projection(); for (var i = 0; i < properties.Length; i++) { var prop = properties[i]; Query.Projection.Add(new ProjectionEntry(string.Format("{0}.{1}", entity.Alias, prop.Name), prop.Name)); var translateName = Translator.GetName(entity, prop.Name, Query.IgnoreTypeSchema); var translateColumnName = translateName as TranslatedColumnName; if (translateColumnName != null) { if (!string.IsNullOrEmpty(translateColumnName.TableAlias)) { AppendQuoteExpression(translateColumnName.TableAlias).Append('.'); } AppendQuoteExpression(translateColumnName.Name); } if (prop.ColumnName != prop.Name) { Append(" AS ").AppendQuoteExpression(FormatProjectionAlias(prop.Name)); } if (i + 1 < properties.Length) { Append(','); } } Append(' '); } else { ProjectionParser(); } if (Query.HasRowVersion) { } var tableName = Translator.GetName(entity, Query.IgnoreTypeSchema); if (tableName == null) { throw new InvalidOperationException(string.Format("Not found table name for entity '{0}'", entity.FullName)); } Append("FROM ").AppendTranslatedName(tableName).Append(' ').AppendQuoteExpression(entity.Alias).Append(' '); } else { var sqlParser = new MySqlQueryParser(Translator, TypeSchema) { Query = entity.SubQuery, UseTakeParameter = true }; var subQueryText = sqlParser.GetText(); if (Query.Projection == null) { Query.Projection = new Projection(); foreach (var column in entity.SubQuery.Projection) { Query.Projection.Add(new ProjectionEntry(!string.IsNullOrEmpty(entity.Alias) ? string.Format("{0}.{1}", entity.Alias, string.IsNullOrEmpty(column.Alias) ? (string.IsNullOrEmpty(column.GetColumnInfo().Alias) ? column.GetColumnInfo().Name : column.GetColumnInfo().Alias) : column.Alias) : column.Alias, column.Alias)); } } ProjectionParser(); Append("FROM (").Append(subQueryText).Append(") ").AppendQuoteExpression(entity.Alias); } return(this); }