/// <summary>
        /// Recupera as propriedades de persistencia que são usadas pela ação de inserção.
        /// </summary>
        /// <param name="instanceType"></param>
        /// <param name="propertyNames"></param>
        /// <param name="direction"></param>
        /// <param name="typeMetadata"></param>
        /// <returns></returns>
        private IEnumerable <System.Reflection.PropertyInfo> GetInsertPersistenceProperties(Type instanceType, string[] propertyNames, DirectionPropertiesName direction, ITypeMetadata typeMetadata)
        {
            var parameterTypes = new PersistenceParameterType[] {
                PersistenceParameterType.Field
            };
            var directions = new DirectionParameter[] {
                DirectionParameter.Output,
                DirectionParameter.InputOptionalOutput,
                DirectionParameter.InputOutput,
                DirectionParameter.OutputOnlyInsert,
                DirectionParameter.OnlyInsert,
                DirectionParameter.InputOptionalOutputOnlyInsert
            };
            var mapping = typeMetadata.Where(f => directions.Contains(f.Direction) && parameterTypes.Contains(f.ParameterType)).ToList();

            FilterMapping(propertyNames, direction, mapping, typeMetadata, PersistenceActionType.Insert);
            var keyMapping = typeMetadata.GetKeyProperties();

            return(mapping.Union(keyMapping, PropertyMetadataEqualityComparer.Instance).Select(f => instanceType.GetProperty(f.Name)).Where(f => f != null));
        }
Exemplo n.º 2
0
        /// <summary>
        /// Adiciona ao campo string builder o texto correspondente a parte SELECT da query
        /// </summary>
        /// <returns>Retorna o próprio objeto</returns>
        private DefaultSqlQueryParser SelectParser()
        {
            if (Query.IsSelectDistinct)
            {
                Append("SELECT DISTINCT ");
            }
            else
            {
                Append("SELECT ");
            }
            if (Query.Entities == null)
            {
                throw new InvalidOperationException(string.Format("Not found entities in query '{0}'", Query));
            }
            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)
                {
                    Append(", ").Append("CAST(").Append(Query.Entities[0].Alias).Append(".[").Append(DataAccessConstants.RowVersionColumnName).Append("] AS BIGINT) AS [").Append(DataAccessConstants.RowVersionColumnName).Append("] ");
                }
                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 DefaultSqlQueryParser(Translator, TypeSchema, _takeParametersParser)
                {
                    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);
        }
Exemplo n.º 3
0
        private OracleQueryParser SelectParser()
        {
            if (Query.IsSelectDistinct)
            {
                Append("SELECT DISTINCT ");
            }
            else
            {
                Append("SELECT ");
            }
            if (Query.Entities == null)
            {
                throw new InvalidOperationException(string.Format("Not found entities in query '{0}'", Query));
            }
            ITypeMetadata a = null;

            for (int b = 0; b < Query.Entities.Length; b++)
            {
                if (string.IsNullOrEmpty(Query.Entities [b].FullName))
                {
                    continue;
                }
                ITypeMetadata c = null;
                if (!Query.IgnoreTypeSchema)
                {
                    c = TypeSchema.GetTypeMetadata(Query.Entities [b].FullName);
                    if (c == null)
                    {
                        throw new InvalidOperationException(ResourceMessageFormatter.Create(() => Properties.Resources.InvalidOperationException_TypeMetadataNotFoundByFullName, Query.Entities [b].FullName).Format());
                    }
                }
                if (b == 0)
                {
                    a = c;
                    if (string.IsNullOrEmpty(Query.Entities [b].Alias))
                    {
                        Query.Entities [b].Alias = "main";
                    }
                }
                else if (string.IsNullOrEmpty(Query.Entities [b].Alias))
                {
                    Query.Entities [b].Alias = "main" + b.ToString();
                }
            }
            bool       d = false;
            EntityInfo e = Query.Entities [0];

            if (!string.IsNullOrEmpty(e.FullName))
            {
                if (Query.Projection == null)
                {
                    if (a != null && a.IsVersioned)
                    {
                        Query.HasRowVersion = true;
                    }
                    var f = a != null?a.Where(g => g.Direction == Data.Schema.DirectionParameter.Input || g.Direction == Data.Schema.DirectionParameter.InputOutput).ToArray() : new IPropertyMetadata[0];

                    if (f.Length == 0)
                    {
                        throw new InvalidOperationException(ResourceMessageFormatter.Create(() => Properties.Resources.InvalidOperationException_NotFoundPropertiesForTypeMetadata, e.FullName).Format());
                    }
                    Query.Projection = new Projection();
                    for (var b = 0; b < f.Length; b++)
                    {
                        var h = f [b];
                        if (h.Name == DataAccessConstants.RowVersionPropertyName)
                        {
                            d = true;
                        }
                        Query.Projection.Add(new ProjectionEntry(string.Format("{0}.{1}", e.Alias, h.Name), h.Name));
                        var j = Translator.GetName(e, h.Name, Query.IgnoreTypeSchema);
                        var k = j as TranslatedColumnName;
                        if (k != null)
                        {
                            if (!string.IsNullOrEmpty(k.TableAlias))
                            {
                                AppendQuoteExpression(k.TableAlias).Append('.');
                            }
                            AppendQuoteExpression(k.Name);
                        }
                        if (h.ColumnName != h.Name)
                        {
                            Append(" AS ").AppendQuoteExpression(FormatProjectionAlias(h.Name));
                        }
                        if (b + 1 < f.Length)
                        {
                            Append(',');
                        }
                    }
                    Append(' ');
                }
                else
                {
                    ProjectionParser();
                }
                if (Query.HasRowVersion && !d)
                {
                    Append(", ").Append("CAST(ORA_ROWSCN AS NUMBER(18,0)) AS \"").Append(DataAccessConstants.RowVersionColumnName.ToUpper()).Append("\" ");
                }
                var l = Translator.GetName(e, Query.IgnoreTypeSchema);
                if (l == null)
                {
                    throw new InvalidOperationException(string.Format("Not found table name for entity '{0}'", e.FullName));
                }
                Append("FROM ").AppendTranslatedName(l).Append(' ').AppendQuoteExpression(e.Alias).Append(' ');
            }
            else
            {
                var m = new OracleQueryParser(Translator, TypeSchema, _takeParametersParser)
                {
                    Query            = e.SubQuery,
                    UseTakeParameter = true
                };
                var n = m.GetText();
                if (Query.Projection == null)
                {
                    Query.Projection = new Projection();
                    foreach (var column in e.SubQuery.Projection)
                    {
                        Query.Projection.Add(new ProjectionEntry(!string.IsNullOrEmpty(e.Alias) ? string.Format("{0}.{1}", e.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(n).Append(") ").AppendQuoteExpression(e.Alias);
            }
            return(this);
        }