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))); } }