internal static void SetTableRelationProperty(this TableRelationProperty property, string propertyValue) { while (propertyValue.Length > 0) { var conditions = GetTableRelationConditions(ref propertyValue); var tableName = GetTableRelationTableName(ref propertyValue); var fieldName = GetTableRelationFieldName(ref propertyValue); var filters = GetTableRelationFilters(ref propertyValue); var tableRelationLine = property.Value.Add(new TableRelationLine(tableName)); tableRelationLine.FieldName = fieldName; foreach (var condition in conditions) { tableRelationLine.Conditions.Add(new TableRelationCondition(condition.FieldName, condition.Type.ToEnum <SimpleTableFilterType>(), condition.Value)); } foreach (var filter in filters) { tableRelationLine.TableFilter.Add(new TableRelationTableFilterLine(filter.FieldName, filter.Type.ToEnum <TableFilterType>(), filter.Value)); } Parsing.TryMatch(ref propertyValue, @"^\sELSE\s"); } }
public static void Write(this TableRelationProperty property, bool isLastProperty, PropertiesStyle style, CSideWriter writer) { var indentations = 0; writer.Write("{0}=", property.Name); writer.Indent(writer.Column); indentations++; foreach (var tableRelationLine in property.Value) { if (tableRelationLine != property.Value.First()) { writer.Write("ELSE "); } if (tableRelationLine.Conditions.Any()) { writer.Write("IF ("); // Only indent if multiple conditions exist. Note that C/SIDE doesn't properly unindent. if (tableRelationLine.Conditions.Count() > 1) { writer.Indent(writer.Column); // conditions indentations++; } foreach (var condition in tableRelationLine.Conditions) { writer.Write("{0}={1}({2})", condition.FieldName, condition.Type.ToString().ToUpper(), condition.Value); var isLastCondition = (condition == tableRelationLine.Conditions.Last()); switch (isLastCondition) { case false: writer.WriteLine(","); break; } } writer.Write(") "); } writer.Write(tableRelationLine.TableName.QuotedExcept('/', '.', '-')); if (!string.IsNullOrEmpty(tableRelationLine.FieldName)) { writer.Write(".{0}", tableRelationLine.FieldName.QuotedExcept('/', '.', '-')); } if (tableRelationLine.TableFilter.Any()) { writer.Write(" WHERE ("); if (tableRelationLine.TableFilter.Count() > 1) { writer.Indent(writer.Column); // filters indentations++; } foreach (var tableFilterLine in tableRelationLine.TableFilter) { writer.Write("{0}={1}({2})", tableFilterLine.FieldName, tableFilterLine.Type.AsString(), tableFilterLine.Value); switch (tableFilterLine == tableRelationLine.TableFilter.Last()) { case true: writer.Write(")"); break; default: writer.WriteLine(","); break; } } } var isLastLine = (tableRelationLine == property.Value.Last()); if (!isLastLine) { writer.WriteLine(""); } else if (isLastProperty) { writer.Write(" "); } else { writer.WriteLine(";"); } //switch (tableRelationLine == property.Value.Last() && !isLastProperty) //{ // case true: // writer.WriteLine(";"); // break; // default: // writer.Write(" "); // break; //} } for (var i = 0; i < indentations; i++) { writer.Unindent(); } }