| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| package org.apache.lens.cube.metadata; |
| |
| import java.text.DateFormat; |
| import java.util.*; |
| |
| import org.apache.lens.server.api.error.LensException; |
| |
| import com.google.common.collect.ImmutableMap; |
| import lombok.EqualsAndHashCode; |
| import lombok.Getter; |
| import lombok.Setter; |
| |
| @EqualsAndHashCode |
| public class FactPartition implements Comparable<FactPartition> { |
| @Getter |
| private final String partCol; |
| @Getter |
| private final Date partSpec; |
| @Getter |
| private final Set<String> storageTables = new LinkedHashSet<String>(); |
| @Getter |
| private final UpdatePeriod period; |
| @Getter |
| @Setter |
| private FactPartition containingPart; |
| @Getter |
| private final DateFormat partFormat; |
| @Getter |
| @Setter |
| private boolean found = false; |
| |
| public FactPartition(String partCol, Date partSpec, UpdatePeriod period, |
| FactPartition containingPart, DateFormat partFormat) { |
| this.partCol = partCol; |
| this.partSpec = partSpec; |
| this.period = period; |
| this.containingPart = containingPart; |
| this.partFormat = partFormat; |
| } |
| |
| public FactPartition(String partCol, Date partSpec, UpdatePeriod period, FactPartition containingPart, |
| DateFormat partFormat, Set<String> storageTables) { |
| this(partCol, partSpec, period, containingPart, partFormat); |
| if (storageTables != null) { |
| this.storageTables.addAll(storageTables); |
| } |
| } |
| |
| /** |
| * Partition should not be used a indicative of the class itself. |
| * New Fact partition created includes more final partitions with that creation. |
| * @return |
| */ |
| |
| public FactPartition withoutContaining() { |
| return new FactPartition(this.getPartCol(), this.getPartSpec(), this.getPeriod(), null, this |
| .getPartFormat(), this.getStorageTables()); |
| } |
| public FactPartition(String partCol, TimePartition timePartition) { |
| this(partCol, timePartition, null, null); |
| } |
| |
| public FactPartition(String partCol, TimePartition timePartition, FactPartition containingPart, Set<String> |
| storageTables) { |
| this(partCol, timePartition.getDate(), timePartition.getUpdatePeriod(), containingPart, null, storageTables); |
| } |
| |
| public boolean hasContainingPart() { |
| return containingPart != null; |
| } |
| |
| public String getFormattedPartSpec() { |
| if (partFormat == null) { |
| return getPartString(); |
| } else { |
| return partFormat.format(partSpec); |
| } |
| } |
| |
| public FactPartition previous() throws LensException { |
| return new FactPartition(getPartCol(), getTimePartition().previous(), getContainingPart(), getStorageTables()); |
| |
| } |
| |
| public FactPartition next() throws LensException { |
| return new FactPartition(getPartCol(), getTimePartition().next(), getContainingPart(), getStorageTables()); |
| |
| } |
| |
| public String getPartString() { |
| return period.format(partSpec); |
| } |
| |
| public String getFormattedFilter(String tableName) { |
| return getFormattedFilter(partCol, tableName); |
| } |
| |
| public String getFormattedFilter(String partCol, String tableName) { |
| StringBuilder builder = new StringBuilder(); |
| if (containingPart != null) { |
| builder.append(containingPart.getFormattedFilter(tableName)); |
| builder.append(" AND "); |
| } |
| if (tableName != null) { |
| builder.append(tableName); |
| builder.append("."); |
| } |
| builder.append(partCol); |
| builder.append(" = '").append(getFormattedPartSpec()).append("'"); |
| return builder.toString(); |
| } |
| |
| public String getFilter() { |
| StringBuilder builder = new StringBuilder(); |
| if (containingPart != null) { |
| builder.append(containingPart.getFilter()); |
| builder.append(" AND "); |
| } |
| builder.append(partCol); |
| builder.append(" = '").append(getPartString()).append("'"); |
| return builder.toString(); |
| } |
| |
| @Override |
| public String toString() { |
| return getFilter(); |
| } |
| |
| public int compareTo(FactPartition o) { |
| int colComp = this.partCol.compareTo(o.partCol); |
| if (colComp == 0) { |
| int partComp = 0; |
| if (this.partSpec != null) { |
| if (o.partSpec == null) { |
| partComp = 1; |
| } else { |
| partComp = this.partSpec.compareTo(o.partSpec); |
| } |
| } else { |
| if (o.partSpec != null) { |
| partComp = -1; |
| } else { |
| partComp = 0; |
| } |
| } |
| if (partComp == 0) { |
| int upComp = 0; |
| if (this.period != null && o.period != null) { |
| upComp = this.period.compareTo(o.period); |
| } else if (this.period == null && o.period == null) { |
| upComp = 0; |
| } else if (this.period == null) { |
| upComp = -1; |
| } else { |
| upComp = 1; |
| } |
| if (upComp == 0) { |
| if (this.containingPart != null) { |
| if (o.containingPart == null) { |
| return 1; |
| } |
| return this.containingPart.compareTo(o.containingPart); |
| } else { |
| if (o.containingPart != null) { |
| return -1; |
| } else { |
| return 0; |
| } |
| } |
| } |
| return upComp; |
| } |
| return partComp; |
| } |
| return colComp; |
| } |
| |
| public TimePartition getTimePartition() throws LensException { |
| return TimePartition.of(getPeriod(), getPartSpec()); |
| } |
| |
| public double getAllTableWeights(ImmutableMap<String, Double> tableWeights) { |
| double weight = 0; |
| Map<String, Double> tblWithoutDBWeghts = new HashMap<>(); |
| for (Map.Entry<String, Double> entry : tableWeights.entrySet()) { |
| tblWithoutDBWeghts.put(entry.getKey().substring(entry.getKey().indexOf('.') + 1), entry.getValue()); |
| } |
| for (String tblName : getStorageTables()) { |
| Double tblWeight = tblWithoutDBWeghts.get(tblName); |
| if (tblWeight != null) { |
| weight += tblWeight; |
| } |
| } |
| return weight; |
| } |
| } |