private string BuildSqlWithClasses(ExtentStatement statement) { if (statement.IsRoot) { for (var i = 0; i < this.objectType.Classes.Count(); i++) { var alias = statement.CreateAlias(); var rootClass = this.objectType.Classes.ToArray()[i]; statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject); if (statement.Sorter != null) { statement.Sorter.BuildSelect(statement); } statement.Append(" FROM " + this.Mapping.TableNameForObjectByClass[rootClass] + " " + alias); statement.AddJoins(rootClass, alias); statement.AddWhere(rootClass, alias); if (this.filter != null) { this.filter.BuildWhere(statement, alias); } if (i < this.objectType.Classes.Count() - 1) { statement.Append("\nUNION\n"); } } } else { var inStatement = (ExtentStatementChild)statement; if (inStatement.RoleType != null) { var useUnion = false; foreach (var rootClass in this.objectType.Classes) { var inRole = inStatement.RoleType; var inIRelationType = inRole.RelationType; if (!((IComposite)inRole.ObjectType).Classes.Contains(rootClass)) { continue; } if (useUnion) { statement.Append("\nUNION\n"); } else { useUnion = true; } var alias = statement.CreateAlias(); if (inIRelationType.Multiplicity == Multiplicity.ManyToMany || !inIRelationType.ExistExclusiveClasses) { statement.Append("SELECT " + inRole.AssociationType.SingularFullName + "_A." + Mapping.ColumnNameForAssociation); } else { if (inRole.IsMany) { statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject); } else { statement.Append("SELECT " + inRole.AssociationType.SingularFullName + "_A." + this.Mapping.ColumnNameByRelationType[inRole.RelationType]); } } statement.Append(" FROM " + this.Mapping.TableNameForObjectByClass[rootClass] + " " + alias); statement.AddJoins(rootClass, alias); var wherePresent = statement.AddWhere(rootClass, alias); var filterUsed = false; if (this.filter != null) { filterUsed = this.filter.BuildWhere(statement, alias); } if (wherePresent || filterUsed) { statement.Append(" AND "); } else { statement.Append(" WHERE "); } if (inIRelationType.Multiplicity == Multiplicity.ManyToMany || !inIRelationType.ExistExclusiveClasses) { statement.Append(inRole.AssociationType.SingularFullName + "_A." + Mapping.ColumnNameForAssociation + " IS NOT NULL "); } else { if (inRole.IsMany) { statement.Append(alias + "." + this.Mapping.ColumnNameByRelationType[inRole.RelationType] + " IS NOT NULL "); } else { statement.Append(inRole.AssociationType.SingularFullName + "_A." + this.Mapping.ColumnNameByRelationType[inRole.RelationType] + " IS NOT NULL "); } } } } else { for (var i = 0; i < this.objectType.Classes.Count(); i++) { var alias = statement.CreateAlias(); var rootClass = this.objectType.Classes.ToArray()[i]; if (statement.IsRoot) { statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject); if (statement.Sorter != null) { statement.Sorter.BuildSelect(statement); } } else { statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject); } statement.Append(" FROM " + this.Mapping.TableNameForObjectByClass[rootClass] + " " + alias); statement.AddJoins(rootClass, alias); statement.AddWhere(rootClass, alias); if (this.filter != null) { this.filter.BuildWhere(statement, alias); } if (i < this.objectType.Classes.Count() - 1) { statement.Append("\nUNION\n"); } } } } return(null); }
private string BuildSqlWithExclusiveClass(ExtentStatement statement) { var alias = statement.CreateAlias(); var rootClass = this.objectType.ExclusiveClass; if (statement.IsRoot) { statement.Append("SELECT DISTINCT " + alias + "." + Mapping.ColumnNameForObject); if (statement.Sorter != null) { statement.Sorter.BuildSelect(statement, alias); } statement.Append(" FROM " + this.Mapping.TableNameForObjectByClass[rootClass] + " " + alias); statement.AddJoins(rootClass, alias); statement.AddWhere(rootClass, alias); if (this.filter != null) { this.filter.BuildWhere(statement, alias); } } else { // ContainedIn var inStatement = (ExtentStatementChild)statement; if (inStatement.RoleType != null) { var inRole = inStatement.RoleType; var inIRelationType = inRole.RelationType; if (inIRelationType.Multiplicity == Multiplicity.ManyToMany || !inIRelationType.ExistExclusiveClasses) { statement.Append("SELECT " + inRole.AssociationType.SingularFullName + "_A." + Mapping.ColumnNameForAssociation); } else { if (inRole.IsMany) { statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject); } else { statement.Append("SELECT " + inRole.AssociationType.SingularFullName + "_A." + this.Mapping.ColumnNameByRelationType[inRole.RelationType]); } } statement.Append(" FROM " + this.Mapping.TableNameForObjectByClass[rootClass] + " " + alias); statement.AddJoins(rootClass, alias); var wherePresent = statement.AddWhere(rootClass, alias); var filterUsed = false; if (this.filter != null) { filterUsed = this.filter.BuildWhere(statement, alias); } if (wherePresent || filterUsed) { statement.Append(" AND "); } else { statement.Append(" WHERE "); } if (inIRelationType.Multiplicity == Multiplicity.ManyToMany || !inIRelationType.ExistExclusiveClasses) { statement.Append(inRole.AssociationType.SingularFullName + "_A." + Mapping.ColumnNameForAssociation + " IS NOT NULL "); } else { if (inRole.IsMany) { statement.Append(alias + "." + this.Mapping.ColumnNameByRelationType[inRole.RelationType] + " IS NOT NULL "); } else { statement.Append(inRole.AssociationType.SingularFullName + "_A." + this.Mapping.ColumnNameByRelationType[inRole.RelationType] + " IS NOT NULL "); } } } else { var inAssociation = inStatement.AssociationType; var inIRelationType = inAssociation.RelationType; if (inIRelationType.Multiplicity == Multiplicity.ManyToMany || !inIRelationType.ExistExclusiveClasses) { statement.Append("SELECT " + inAssociation.RoleType.SingularFullName + "_R." + Mapping.ColumnNameForRole); } else { if (inAssociation.RoleType.IsMany) { statement.Append("SELECT " + inAssociation.RoleType.SingularFullName + "_R." + this.Mapping.ColumnNameByRelationType[inAssociation.RelationType]); } else { statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject); } } statement.Append(" FROM " + this.Mapping.TableNameForObjectByClass[rootClass] + " " + alias); statement.AddJoins(rootClass, alias); var wherePresent = statement.AddWhere(rootClass, alias); var filterUsed = false; if (this.filter != null) { filterUsed = this.filter.BuildWhere(statement, alias); } if (wherePresent || filterUsed) { statement.Append(" AND "); } else { statement.Append(" WHERE "); } if (inIRelationType.Multiplicity == Multiplicity.ManyToMany || !inIRelationType.ExistExclusiveClasses) { statement.Append(inAssociation.RoleType.SingularFullName + "_R." + Mapping.ColumnNameForRole + " IS NOT NULL "); } else { if (inAssociation.RoleType.IsMany) { statement.Append(inAssociation.RoleType.SingularFullName + "_R." + this.Mapping.ColumnNameByRelationType[inAssociation.RelationType] + " IS NOT NULL "); } else { statement.Append(alias + "." + inAssociation.RoleType.SingularFullName + " IS NOT NULL "); } } } } return alias; }
private string BuildSqlWithExclusiveClass(ExtentStatement statement) { var alias = statement.CreateAlias(); var rootClass = this.objectType.ExclusiveClass; if (statement.IsRoot) { statement.Append("SELECT DISTINCT " + alias + "." + Mapping.ColumnNameForObject); statement.Sorter?.BuildSelect(statement, alias); statement.Append(" FROM " + this.Mapping.TableNameForObjectByClass[rootClass] + " " + alias); statement.AddJoins(rootClass, alias); statement.AddWhere(rootClass, alias); this.filter?.BuildWhere(statement, alias); } else { // ContainedIn var inStatement = (ExtentStatementChild)statement; if (inStatement.RoleType != null) { var inRole = inStatement.RoleType; var inIRelationType = inRole.RelationType; if (inIRelationType.Multiplicity == Multiplicity.ManyToMany || !inIRelationType.ExistExclusiveClasses) { statement.Append("SELECT " + inRole.AssociationType.SingularFullName + "_A." + Mapping.ColumnNameForAssociation); } else { if (inRole.IsMany) { statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject); } else { statement.Append("SELECT " + inRole.AssociationType.SingularFullName + "_A." + this.Mapping.ColumnNameByRelationType[inRole.RelationType]); } } statement.Append(" FROM " + this.Mapping.TableNameForObjectByClass[rootClass] + " " + alias); statement.AddJoins(rootClass, alias); var wherePresent = statement.AddWhere(rootClass, alias); var filterUsed = false; if (this.filter != null) { filterUsed = this.filter.BuildWhere(statement, alias); } if (wherePresent || filterUsed) { statement.Append(" AND "); } else { statement.Append(" WHERE "); } if (inIRelationType.Multiplicity == Multiplicity.ManyToMany || !inIRelationType.ExistExclusiveClasses) { statement.Append(inRole.AssociationType.SingularFullName + "_A." + Mapping.ColumnNameForAssociation + " IS NOT NULL "); } else { if (inRole.IsMany) { statement.Append(alias + "." + this.Mapping.ColumnNameByRelationType[inRole.RelationType] + " IS NOT NULL "); } else { statement.Append(inRole.AssociationType.SingularFullName + "_A." + this.Mapping.ColumnNameByRelationType[inRole.RelationType] + " IS NOT NULL "); } } } else { if (statement.IsRoot) { statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject); if (statement.Sorter != null) { statement.Sorter.BuildSelect(statement); } } else { statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject); } statement.Append(" FROM " + this.Mapping.TableNameForObjectByClass[rootClass] + " " + alias); statement.AddJoins(rootClass, alias); statement.AddWhere(rootClass, alias); if (this.filter != null) { this.filter.BuildWhere(statement, alias); } } } return(alias); }
private string BuildSqlWithClasses(ExtentStatement statement) { if (statement.IsRoot) { for (var i = 0; i < this.objectType.Classes.Count(); i++) { var alias = statement.CreateAlias(); var rootClass = this.objectType.Classes.ToArray()[i]; statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject); if (statement.Sorter != null) { statement.Sorter.BuildSelect(statement); } statement.Append(" FROM " + this.Mapping.TableNameForObjectByClass[rootClass] + " " + alias); statement.AddJoins(rootClass, alias); statement.AddWhere(rootClass, alias); if (this.filter != null) { this.filter.BuildWhere(statement, alias); } if (i < this.objectType.Classes.Count() - 1) { statement.Append("\nUNION\n"); } } } else { var inStatement = (ExtentStatementChild)statement; if (inStatement.RoleType != null) { var useUnion = false; foreach (var rootClass in this.objectType.Classes) { var inRole = inStatement.RoleType; var inIRelationType = inRole.RelationType; if (!((IComposite)inRole.ObjectType).Classes.Contains(rootClass)) { continue; } if (useUnion) { statement.Append("\nUNION\n"); } else { useUnion = true; } var alias = statement.CreateAlias(); if (inIRelationType.Multiplicity == Multiplicity.ManyToMany || !inIRelationType.ExistExclusiveClasses) { statement.Append("SELECT " + inRole.AssociationType.SingularFullName + "_A." + Mapping.ColumnNameForAssociation); } else { if (inRole.IsMany) { statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject); } else { statement.Append("SELECT " + inRole.AssociationType.SingularFullName + "_A." + this.Mapping.ColumnNameByRelationType[inRole.RelationType]); } } statement.Append(" FROM " + this.Mapping.TableNameForObjectByClass[rootClass] + " " + alias); statement.AddJoins(rootClass, alias); var wherePresent = statement.AddWhere(rootClass, alias); var filterUsed = false; if (this.filter != null) { filterUsed = this.filter.BuildWhere(statement, alias); } if (wherePresent || filterUsed) { statement.Append(" AND "); } else { statement.Append(" WHERE "); } if (inIRelationType.Multiplicity == Multiplicity.ManyToMany || !inIRelationType.ExistExclusiveClasses) { statement.Append(inRole.AssociationType.SingularFullName + "_A." + Mapping.ColumnNameForAssociation + " IS NOT NULL "); } else { if (inRole.IsMany) { statement.Append(alias + "." + this.Mapping.ColumnNameByRelationType[inRole.RelationType] + " IS NOT NULL "); } else { statement.Append(inRole.AssociationType.SingularFullName + "_A." + this.Mapping.ColumnNameByRelationType[inRole.RelationType] + " IS NOT NULL "); } } } } else { for (var i = 0; i < this.objectType.Classes.Count(); i++) { var alias = statement.CreateAlias(); var rootClass = this.objectType.Classes.ToArray()[i]; if (statement.IsRoot) { statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject); if (statement.Sorter != null) { statement.Sorter.BuildSelect(statement); } } else { statement.Append("SELECT " + alias + "." + Mapping.ColumnNameForObject); } statement.Append(" FROM " + this.Mapping.TableNameForObjectByClass[rootClass] + " " + alias); statement.AddJoins(rootClass, alias); statement.AddWhere(rootClass, alias); if (this.filter != null) { this.filter.BuildWhere(statement, alias); } if (i < this.objectType.Classes.Count() - 1) { statement.Append("\nUNION\n"); } } } } return null; }