public SelectorStatement ToSelectMany(IField collectionField, IMartenSession session, bool isComplex, Type elementType) { if (elementType.IsSimple()) { var selection = $"jsonb_array_elements_text({collectionField.JSONBLocator})"; SelectClause = typeof(DataSelectClause <>).CloseAndBuildAs <ISelectClause>(SelectClause.FromObject, selection, elementType); Mode = StatementMode.CommonTableExpression; ExportName = session.NextTempTableName() + "CTE"; var next = elementType == typeof(string) ? new ScalarSelectManyStringStatement(this) : typeof(ScalarSelectManyStatement <>).CloseAndBuildAs <Statement>(this, session.Serializer, elementType); InsertAfter(next); return((SelectorStatement)next); } var childFields = session.Options.ChildTypeMappingFor(elementType); if (isComplex) { var selection = $"jsonb_array_elements({collectionField.JSONBLocator})"; SelectClause = typeof(DataSelectClause <>).CloseAndBuildAs <ISelectClause>(SelectClause.FromObject, selection, elementType); Mode = StatementMode.CommonTableExpression; ExportName = session.NextTempTableName() + "CTE"; var statement = new JsonStatement(elementType, childFields, this); InsertAfter(statement); return(statement); } else { var selection = $"jsonb_array_elements_text({collectionField.JSONBLocator})"; SelectClause = typeof(DataSelectClause <>).CloseAndBuildAs <ISelectClause>(SelectClause.FromObject, selection, elementType); return(this); } }
public override SelectorStatement UseAsEndOfTempTableAndClone(IncludeIdentitySelectorStatement includeIdentitySelectorStatement) { includeIdentitySelectorStatement.IncludeDataInTempTable = true; var clone = new JsonStatement(SelectClause, Fields) { SelectClause = SelectClause.As <IScalarSelectClause>().CloneToOtherTable(includeIdentitySelectorStatement.ExportName), Orderings = Orderings, Mode = StatementMode.Select, ExportName = ExportName }; SelectClause = includeIdentitySelectorStatement; Limit = Offset = 0; return(clone); }