package de.superx.bianalysis.metadata.models.json; import java.util.List; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.annotation.JsonInclude.Include; import de.superx.bianalysis.FaultyMetadataException; import de.superx.bianalysis.metadata.UpsertStringBuilder; import de.superx.bianalysis.models.CriteriaGroup; @JsonInclude(Include.NON_DEFAULT) @JsonPropertyOrder({ "id", "default_release", "position", "caption", "criteria_group", "dim_column", "sort_order_column", "ref_to", "description", "fact_column" }) public class MetaDimensionAttribute extends MetaObject { @JsonProperty("dim_column") private String dimColumn; @JsonProperty("sort_order_column") private String sortOrderColumn; @JsonProperty("hierarchical_filter") private boolean hierarchicalFilter; private Integer position; @JsonIgnore private MetaDimension dimension; @JsonIgnore private MetaDimensionAttribute confDimAttrRef; @JsonProperty("ref_to") private String refTo; @JsonProperty("filter_selection") private String filterSelection; @JsonProperty("is_hidden") private boolean isHidden; @JsonProperty("criteria_groups") private List criteriaGroups; public MetaDimensionAttribute() { super("dimension_attribute"); } public MetaDimensionAttribute(String attrColumn) { super("dimension_attribute"); this.refTo = attrColumn; //this.refTo = dimensionTable + "." + attrColumn; } public void setConformedDimensionAttribute(MetaDimensionAttribute attribute) { this.confDimAttrRef = attribute; } @Override public UpsertStringBuilder getUpsertBuilder() { UpsertStringBuilder builder = new UpsertStringBuilder(); if(confDimAttrRef == null) { builder = super.getUpsert() .withIdCol("dimension_id", this.dimension.id) .withStringCol("columnname", this.dimColumn) .withCriteriaGroup("criteria_groups", this.criteriaGroups) .withStringCol("sort_order_column", this.sortOrderColumn) .withStringCol("filter_selection", getFilterSelectionWithDefault()) .withIntCol("position", this.position) .withStringCol("is_hidden", String.valueOf(this.isHidden)); } else { builder = new UpsertStringBuilder() .forTable("metadata", this.sourceTable) .withStringCol("namespace", this.namespace) .withIdCol("id", this.id) .withStringCol("default_release", this.defaultRelease); if(this.isHidden) { builder = builder.withStringCol("is_hidden", String.valueOf(isHidden)); } else { builder = builder.withStringCol("is_hidden", String.valueOf(confDimAttrRef.isHidden)); } if(this.position != null) { builder = builder.withIntCol("position", position); } else { builder = builder.withIntCol("position", this.confDimAttrRef.getPosition()); } if(getCaption() != null && !getCaption().isBlank()) { builder = builder.withStringCol("caption", caption); } else { builder = builder.withStringCol("caption", confDimAttrRef.getCaption()); } if(getDimColumn() != null && !getDimColumn().isBlank()) { builder = builder.withStringCol("columnname", this.dimColumn); } else { builder = builder.withStringCol("columnname", confDimAttrRef.getDimColumn()); } if(getFilterSelection() != null && !getFilterSelection().isBlank()) { builder = builder.withStringCol("filter_selection", this.filterSelection); } else { builder = builder.withStringCol("filter_selection", confDimAttrRef.getFilterSelectionWithDefault()); } if(getSortOrderColumn() != null && !getSortOrderColumn().isBlank()) { builder = builder.withStringCol("sort_order_column", this.sortOrderColumn); } else { builder = builder.withStringCol("sort_order_column", confDimAttrRef.getSortOrderColumn()); } if(getCriteriaGroups() != null && !getCriteriaGroups().isEmpty()) { builder = builder.withCriteriaGroup("criteria_groups", this.criteriaGroups); } else { builder = builder.withCriteriaGroup("criteria_groups", confDimAttrRef.getCriteriaGroups()); } builder = builder.withIdCol("dimension_id", this.dimension.id); builder = builder.withIdCol("conformed", this.confDimAttrRef.id); } if(this.dimColumn == null && criteriaGroups != null && criteriaGroups.size() >0) { String newColumnName = this.caption.toLowerCase() .replaceAll("\\s+", "_") .replaceAll("[^a-z0-9-]", "_"); builder = builder.withStringCol("columnname", "custom_" + newColumnName); } if(confDimAttrRef != null && confDimAttrRef.hierarchicalFilter) { builder = builder.withStringCol("hierarchical_filter", String.valueOf(confDimAttrRef.hierarchicalFilter)); } else { builder = builder.withStringCol("hierarchical_filter", String.valueOf(hierarchicalFilter)); } if(this.description != null && !this.description.isBlank()) { builder = builder.withStringCol("description", this.description); } else { if(confDimAttrRef != null) { builder = builder.withStringCol("description", confDimAttrRef.getDescription()); } else { builder = builder.withStringCol("description", ""); } } return builder; } public Integer getPosition() { return position; } public void setPosition(Integer position) { this.position = position; } public String getDimColumn() { return dimColumn; } public void setDimColumn(String dimColumn) { this.dimColumn = dimColumn; } public String getSortOrderColumn() { return sortOrderColumn; } public void setSortOrderColumn(String sortOrderColumn) { this.sortOrderColumn = sortOrderColumn; } public String getFilterSelection() { return filterSelection; } public void setFilterSelection(String filterSelection) { this.filterSelection = filterSelection; } public MetaDimension getDimension() { return dimension; } public void setDimension(MetaDimension dimension) { this.dimension = dimension; } public MetaDimensionAttribute getConfDimAttrRef() { return confDimAttrRef; } public void setConfDimAttrRef(MetaDimensionAttribute confDimAttrRef) { this.confDimAttrRef = confDimAttrRef; } public String getRefTo() { return refTo; } public void setRefTo(String refTo) { this.refTo = refTo; } public List getCriteriaGroups() { return criteriaGroups; } public void setCriteriaGroups(List criteriaGroups) { this.criteriaGroups = criteriaGroups; } @JsonIgnore @Override public String getDocIdentifier() { if(refTo != null) { if(this.confDimAttrRef == null) { throw new FaultyMetadataException("The Object with the id '" + this.id + "' references a conformed attribute with the name '" + this.refTo + "'. This Object cannot be found."); } return this.confDimAttrRef.getDocIdentifier(); } return this.dimension.getDocIdentifier()+"."+this.dimColumn; } public boolean isHierarchicalFilter() { return hierarchicalFilter; } public void setHierarchicalFilter(boolean hierarchicalFilter) { this.hierarchicalFilter = hierarchicalFilter; } @JsonIgnore public boolean isHidden() { return isHidden; } @JsonIgnore public String getFilterSelectionWithDefault() { if(this.filterSelection == null || this.filterSelection.isBlank()) { return "show_existing_only"; } return this.filterSelection; } @JsonIgnore public void setHidden(boolean isHidden) { this.isHidden = isHidden; } }