/**
* Copyright (C) 2014-2016 LinkedIn Corp. (pinot-core@linkedin.com)
*
* Licensed 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 com.linkedin.pinot.common.utils;
// old style name (that needs to be recognized, but not built anymore)
// return StringUtils.join(
// Lists.newArrayList(tableName, instanceName, groupId, partitionName, sequenceNumber, creationTime), "__");
// Example tableName_REALTIME__Server_host_name.domain.com_8001__tableName_REALTIME_1449605490946_1__0__1450910568438
// Splitting this:
// table name: tableName_REALTIME,
// instanceName: Server_host_name.domain.com_8001
// groupId: tableName_REALTIME_1449605490946_1 (has tablename, group creation time, and a group sequence nuumber)
// sequenceNumber: 0
// creationTime: 1450910568438
//
// shorter name: {groupId}__{partitionRange}__{sequenceNumber}
// Example: tableName_REALTIME_1433316466991_0__0__1465314044238
// Splitting this:
// groupId: tableName_REALTIME_1433316466991_0
// partitionRange: 0
// sequenceNumber: 1465314044238
// see com.linkedin.pinot.controller.helix.core.PinotTableIdealStateBuilder#getGroupIdFromRealtimeDataTable for details on the groupId
import org.apache.commons.lang.StringUtils;
import com.google.common.collect.Lists;
public class HLCSegmentName extends SegmentName {
private final boolean _isOldStyleNaming;
private final String _groupId;
private final String _sequenceNumber;
private final String _partitionRange;
private final String _segmentName;
private final RealtimeSegmentType _segmentType;
private final String _tableName;
// Can be called with old or new style naming.
public HLCSegmentName(String segmentName) {
// Decide if it is old style or new style v1 naming here.
if (!isHighLevelConsumerSegmentName(segmentName)) {
throw new RuntimeException(segmentName + " is not a HighLevelConsumer segment name");
}
String parts[] = segmentName.split(SEPARATOR);
if (parts.length == 5) {
_isOldStyleNaming = true;
} else if (parts.length == 3) {
_isOldStyleNaming = false;
} else {
throw new RuntimeException(segmentName + " is not HighLevelConsumer segment name ");
}
if (isOldStyleNaming()) {
_tableName = parts[0];
_groupId = parts[2];
_partitionRange = parts[3];
_sequenceNumber = parts[4];
_segmentType = RealtimeSegmentType.HLC_LONG;
} else {
_groupId = parts[0];
_partitionRange = parts[1];
_sequenceNumber = parts[2];
_tableName = _groupId.substring(0, _groupId.indexOf(REALTIME_SUFFIX) + REALTIME_SUFFIX_LENGTH);
_segmentType = RealtimeSegmentType.HLC_SHORT;
}
_segmentName = segmentName;
}
/**
* Builds only the newer style.
* @param groupId is like myTable_REALTIME_1442428556382_0 (where 1442428556382 is the time when the group was created
* or it is line myTable
* @param partitionRange
* @param sequenceNumber
*/
public HLCSegmentName(String groupId, String partitionRange, String sequenceNumber) {
if (isValidComponentName(groupId) && isValidComponentName(partitionRange) &&
isValidComponentName(sequenceNumber)) {
_isOldStyleNaming = false;
_groupId = groupId;
_partitionRange = partitionRange;
_sequenceNumber = sequenceNumber;
_segmentName = StringUtils.join(Lists.newArrayList(groupId, partitionRange, sequenceNumber), SEPARATOR);
_tableName = _groupId.substring(0, _groupId.indexOf(REALTIME_SUFFIX) + REALTIME_SUFFIX_LENGTH);
_segmentType = RealtimeSegmentType.HLC_SHORT;
} else {
throw new IllegalArgumentException("Invalid group id (" + groupId + "), partition range (" + partitionRange +
") or sequence number (" + sequenceNumber + ")");
}
}
public boolean isOldStyleNaming() {
return _isOldStyleNaming;
}
@Override
public String getGroupId() {
return _groupId;
}
@Override
public String getSequenceNumberStr() {
return _sequenceNumber;
}
@Override
public int getSequenceNumber() {
return Integer.valueOf(_sequenceNumber);
}
@Override
public String getPartitionRange() {
return _partitionRange;
}
@Override
public String getSegmentName() {
return _segmentName;
}
@Override
public String getTableName() {
return _tableName;
}
@Override
public RealtimeSegmentType getSegmentType() {
return _segmentType;
}
@Override
public String toString() {
return getSegmentName();
}
}