/*
* 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 gobblin.audit.values.auditor;
import java.util.List;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
import org.apache.avro.Schema;
/**
* A container for table specific runtime Metadata required for auditing a table.
* Use {@link ValueAuditRuntimeMetadataBuilder} to instantiate a new {@link ValueAuditRuntimeMetadata}.
* <code>database, table and tableSchema</code> are required fields in the {@link ValueAuditRuntimeMetadata}.
* All other fields <code>phase, cluster, extractId, snapshotId, deltaId, partFileName</code> are marked as {@value #DEFAULT_VALUE}
* if not present.
*/
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
@ToString
@EqualsAndHashCode
public class ValueAuditRuntimeMetadata {
private static final String DEFAULT_VALUE = "NA";
/**
* <i>Required - </i>Table specific metadata like <code>database, table and tableSchema</code>
*/
private TableMetadata tableMetadata;
/**
* <i>Optional - </i>The snapshot generation phase being audited
*/
private Phase phase;
/**
* <i>Optional - </i>Audited snapshot data's cluster
*/
private String cluster;
/**
* <i>Optional - </i>Extract Id of the snapshot
*/
private String extractId;
/**
* <i>Optional - </i>Snapshot Id being audited
*/
private String snapshotId;
/**
* <i>Optional - </i>Delta Id of the snapshot
*/
private String deltaId;
/**
* <i>Optional - </i>Part file in the snapshot being audited
*/
private String partFileName;
public static ValueAuditRuntimeMetadataBuilder builder(String databaseName, String tableName, Schema tableSchema) {
return new ValueAuditRuntimeMetadataBuilder(databaseName, tableName, tableSchema);
}
/**
* Container for table specific metadata
*/
@Getter
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public static class TableMetadata {
/**
* <i>Required - </i> database name
*/
@NonNull private String database;
/**
* <i>Required - </i> table name
*/
@NonNull private String table;
/**
* <i>Required - </i> table schema
*/
@NonNull private Schema tableSchema;
/**
* <i>Optional - </i> list of key fields in the table that uniquely identify a row.
* Each entry in the list is an ordered string specifying the location of the nested key field
* For example, field1.nestedField1 refers to the field "nestedField1" inside of field "field1" of the record.
*/
private List<String> keyFieldLocations;
/**
* <i>Optional - </i> list of delta fields in the table that are used to track changes in the row over time.
* Each entry in the list is an ordered string specifying the location of the nested delta field
* For example, field1.nestedField1 refers to the field "nestedField1" inside of field "field1" of the record.
*/
private List<String> deltaFieldLocations;
}
/**
* An enum for all phases snapshot generation
*/
public static enum Phase {
PULL("Pull from extract"),
AVRO_CONV("Convert to avro"),
SS_GEN("Snapshot Generation, LSB"),
SS_UPD("Snapshot update, VSB"),
SS_MAT("Snapshot materialization, QSB"),
SS_PUB("Publish Snapshot"),
NA("Not Applicable");
private String description;
Phase(String description) {
this.description = description;
}
public String getDescription() {
return this.description;
}
}
/**
* Builder to build A {@link ValueAuditRuntimeMetadata}, <code>databaseName, tableName and tableSchema</code> are required
*/
public static class ValueAuditRuntimeMetadataBuilder {
private TableMetadata tableMetadata;
private Phase phase = Phase.NA;
private String cluster = DEFAULT_VALUE;
private String extractId = DEFAULT_VALUE;
private String snapshotId = DEFAULT_VALUE;
private String deltaId = DEFAULT_VALUE;
private String partFileName = DEFAULT_VALUE;
public ValueAuditRuntimeMetadataBuilder(String databaseName, String tableName, Schema tableSchema) {
this.tableMetadata = new TableMetadata(databaseName, tableName, tableSchema);
}
public ValueAuditRuntimeMetadataBuilder phase(final Phase phase) {
this.phase = phase;
return this;
}
public ValueAuditRuntimeMetadataBuilder cluster(final String cluster) {
this.cluster = cluster;
return this;
}
public ValueAuditRuntimeMetadataBuilder extractId(final String extractId) {
this.extractId = extractId;
return this;
}
public ValueAuditRuntimeMetadataBuilder snapshotId(final String snapshotId) {
this.snapshotId = snapshotId;
return this;
}
public ValueAuditRuntimeMetadataBuilder deltaId(final String deltaId) {
this.deltaId = deltaId;
return this;
}
public ValueAuditRuntimeMetadataBuilder partFileName(final String partFileName) {
this.partFileName = partFileName;
return this;
}
public ValueAuditRuntimeMetadataBuilder tableMetadataKeyFieldLocations(List<String> keyFieldLocations) {
this.tableMetadata.keyFieldLocations = keyFieldLocations;
return this;
}
public ValueAuditRuntimeMetadataBuilder tableMetadataDeltaFieldLocations(List<String> deltaFieldLocations) {
this.tableMetadata.keyFieldLocations = deltaFieldLocations;
return this;
}
public ValueAuditRuntimeMetadata build() {
return new ValueAuditRuntimeMetadata(tableMetadata, phase, cluster, extractId, snapshotId, deltaId, partFileName);
}
}
}