Example #1
0
 public void SetFrom(MainFromClause from)
 {
     MainFrom = from;
     if (from != QuerySourceConverterFactory.GetOriginalSource(from))
     {
         TryToSimplifyMainFrom();
     }
 }
        private void CreateSelector(IQuerySource qs)
        {
            var index = Query.CurrentSelectIndex;

            if (qs.ItemType.IsGrouping())
            {
                var factoryKey   = QuerySourceConverterFactory.CreateResult("Key", qs.ItemType.GetGenericArguments()[0], qs, Query);
                var factoryValue = QuerySourceConverterFactory.Create(qs, Query);
                var genericType  = qs.ItemType.CreateGrouping();
                if (Query.AddSelectPart(
                        qs,
                        "\"{0}\".\"Key\" AS \"{0}.Key\", \"{0}\".\"Values\" AS \"{0}\"".With(factoryValue.Name),
                        factoryValue.Name,
                        qs.ItemType,
                        (_, reader, dr) =>
                {
                    var keyInstance = factoryKey.Instancer(dr.GetValue(index), reader);
                    object[] array;
                    if (dr.IsDBNull(index + 1))
                    {
                        array = new string[0];
                    }
                    else
                    {
                        var obj = dr.GetValue(index + 1);
                        var tr = obj as TextReader;
                        if (tr != null)
                        {
                            array = PostgresRecordConverter.ParseArray(tr.ReadToEnd());
                        }
                        else
                        {
                            array = PostgresRecordConverter.ParseArray(obj as string);
                        }
                    };
                    var valueInstances = array.Select(it => factoryValue.Instancer(it, reader));
                    return(Activator.CreateInstance(genericType, keyInstance, valueInstances));
                }))
                {
                    Query.CurrentSelectIndex++;
                }
            }
            else
            {
                var factory = QuerySourceConverterFactory.Create(qs, Query);
                Query.AddSelectPart(
                    factory.QuerySource,
                    "\"{0}\"".With(factory.Name),
                    factory.Name,
                    factory.Type,
                    (_, reader, dr) => dr.IsDBNull(index) ? null : factory.Instancer(dr.GetValue(index), reader));
            }
        }
        private void CreateSelector(IQuerySource qs)
        {
            var index = Query.CurrentSelectIndex;

            if (qs.ItemType.IsGrouping())
            {
                var factoryKey =
                    QuerySourceConverterFactory.CreateResult(
                        "Key",
                        qs.ItemType.GetGenericArguments()[0],
                        qs,
                        Query,
                        false);
                var factoryValue = QuerySourceConverterFactory.Create(qs, Query);
                var genericType  = qs.ItemType.CreateGrouping();
                if (Query.AddSelectPart(
                        qs,
                        "\"{0}\".\"Key\" AS \"{0}.Key\", \"{0}\".\"Values\" AS \"{0}\"".With(factoryValue.Name),
                        factoryValue.Name,
                        qs.ItemType,
                        (_, dr) =>
                {
                    var keyInstance = factoryKey.Instancer(dr.GetValue(index));
                    //TODO fix later
                    return(null);

                    /*var array = dr.IsDBNull(index + 1) ? new string[0] : OracleRecordConverter.ParseArray(dr.GetString(index + 1));
                     * var valueInstances = array.Select(it => factoryValue.Instancer(it));
                     * return Activator.CreateInstance(genericType, keyInstance, valueInstances);*/
                }))
                {
                    Query.CurrentSelectIndex++;
                }
            }
            else if (typeof(IOracleReader).IsAssignableFrom(qs.ItemType))
            {
                var props     = qs.ItemType.GetProperties();
                var selectors = new PropertySource[props.Length];
                for (int i = 0; i < selectors.Length; i++)
                {
                    var s = selectors[i] = new PropertySource(qs, props[i]);
                    Query.AddSelectPart(
                        s,
                        "\"{0}\".\"{1}\" AS \"{0}.{1}\"".With(s.Parent.ItemName, s.Property.Name),
                        s.ItemName,
                        s.ItemType,
                        null);
                }
                Query.AddSelectPart(
                    qs,
                    null,
                    qs.ItemName,
                    qs.ItemType,
                    (_, dr) =>
                {
                    var inst = (IOracleReader)Activator.CreateInstance(qs.ItemType);
                    inst.Read(qs.ItemName, dr, Query.Locator);
                    return(inst);
                });
            }
            else
            {
                var factory = QuerySourceConverterFactory.Create(qs, Query);
                var ii      = factory.CanBeNull && factory.AsValue;
                Query.AddSelectPart(
                    factory.QuerySource,
                    ii ? "CASE WHEN \"{0}\".URI IS NULL THEN NULL ELSE VALUE(\"{0}\") END".With(factory.Name)
                                                : factory.AsValue ? "VALUE(\"{0}\")".With(factory.Name)
                                                : "\"{0}\"".With(factory.Name),
                    factory.Name,
                    factory.Type,
                    (_, dr) => dr.IsDBNull(index) ? null : factory.Instancer(dr.GetValue(index)));
            }
        }