Skip to content

Commit

Permalink
KYLIN-3893 Add validation for the encoding length and the type of enc…
Browse files Browse the repository at this point in the history
…oding (apache#622)

* KYLIN-3893 Add validation for the encoding length and the type of encoding
* KYLIN-3893 Code review
  • Loading branch information
GinaZhai authored and nichunen committed May 30, 2019
1 parent b089352 commit 475df34
Show file tree
Hide file tree
Showing 11 changed files with 107 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@

package org.apache.kylin.cube.kv;

import com.google.common.collect.Maps;
import java.util.Map;

import org.apache.kylin.common.util.Dictionary;
import org.apache.kylin.cube.CubeSegment;
import org.apache.kylin.cube.model.CubeDesc;
Expand All @@ -32,7 +33,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;
import com.google.common.collect.Maps;

public class CubeDimEncMap implements IDimensionEncodingMap, java.io.Serializable {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ public String getSupportedEncodingName() {
public DimensionEncoding createDimensionEncoding(String encodingName, String[] args) {
return new BooleanDimEnc();
}

@Override
public boolean isValidDimensionEncoding(String encodingName, String[] args) {
return true;
}
};

// ============================================================================
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,22 @@ public String getSupportedEncodingName() {
public DimensionEncoding createDimensionEncoding(String encodingName, String[] args) {
return new DateDimEnc(args);
}

@Override
public boolean isValidDimensionEncoding(String encodingName, String[] args) {
try {
if (args != null && args.length == 1) {
DataType datatype = DataType.getType(args[0]);
if (datatype == null) {
return false;
}
}
} catch (Exception e) {
return false;
}

return true;
}
};

private static class DateDimValueCodec implements IValueCodec {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,18 @@ public boolean apply(@Nullable Pair<String, Integer> input) {
});
}

public static boolean isValidEncoding(final String encodingName, String[] args, int version) {
if (factoryMap == null)
initFactoryMap();

DimensionEncodingFactory factory = factoryMap.get(Pair.newPair(encodingName, version));
if (factory == null) {
return true;
}

return factory.isValidDimensionEncoding(encodingName, args);
}

private static synchronized void initFactoryMap() {
if (factoryMap == null) {
Map<Pair<String, Integer>, DimensionEncodingFactory> map = Maps.newConcurrentMap();
Expand Down Expand Up @@ -155,4 +167,9 @@ private static synchronized void initFactoryMap() {
* Create a DimensionEncoding instance, with inputs corresponding to RowKeyColDesc.encodingName and RowKeyColDesc.encodingArgs
*/
abstract public DimensionEncoding createDimensionEncoding(String encodingName, String[] args);

/**
* Validate the inputs of RowKeyColDesc.encodingName and RowKeyColDesc.encodingArgs for a DimensionEncoding instance
*/
abstract public boolean isValidDimensionEncoding(String encodingName, String[] args);
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,16 @@ public String getSupportedEncodingName() {
public DimensionEncoding createDimensionEncoding(String encodingName, String[] args) {
return new FixedLenDimEnc(Integer.parseInt(args[0]));
}

@Override
public boolean isValidDimensionEncoding(String encodingName, String[] args) {
try {
int length = Integer.parseInt(args[0]);
return length >= 1;
} catch (Exception e) {
return false;
}
}
};

// ============================================================================
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,16 @@ public String getSupportedEncodingName() {
public DimensionEncoding createDimensionEncoding(String encodingName, String[] args) {
return new FixedLenHexDimEnc(Integer.parseInt(args[0]));
}

@Override
public boolean isValidDimensionEncoding(String encodingName, String[] args) {
try {
int length = Integer.parseInt(args[0]);
return length >= 1;
} catch (Exception e) {
return false;
}
}
}

// ============================================================================
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,16 @@ public String getSupportedEncodingName() {
public DimensionEncoding createDimensionEncoding(String encodingName, String[] args) {
return new IntDimEnc(Integer.parseInt(args[0]));
}

@Override
public boolean isValidDimensionEncoding(String encodingName, String[] args) {
try {
int length = Integer.parseInt(args[0]);
return length >= 1 && length < CAP.length;
} catch (Exception e) {
return false;
}
}
};

// ============================================================================
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,16 @@ public String getSupportedEncodingName() {
public DimensionEncoding createDimensionEncoding(String encodingName, String[] args) {
return new IntegerDimEnc(Integer.parseInt(args[0]));
}

@Override
public boolean isValidDimensionEncoding(String encodingName, String[] args) {
try {
int length = Integer.parseInt(args[0]);
return length >= 1 && length < CAP.length;
} catch (Exception e) {
return false;
}
}
};

// ============================================================================
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,16 @@ public String getSupportedEncodingName() {
public DimensionEncoding createDimensionEncoding(String encodingName, String[] args) {
return new OneMoreByteVLongDimEnc(Integer.parseInt(args[0]));
}

@Override
public boolean isValidDimensionEncoding(String encodingName, String[] args) {
try {
int length = Integer.parseInt(args[0]);
return length >= 1 && length < CAP.length;
} catch (Exception e) {
return false;
}
}
};

// ============================================================================
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ public String getSupportedEncodingName() {
public DimensionEncoding createDimensionEncoding(String encodingName, String[] args) {
return new TimeDimEnc();
}

@Override
public boolean isValidDimensionEncoding(String encodingName, String[] args) {
return true;
}
};

public TimeDimEnc() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import org.apache.kylin.cube.model.HBaseColumnDesc;
import org.apache.kylin.cube.model.HBaseColumnFamilyDesc;
import org.apache.kylin.cube.model.RowKeyColDesc;
import org.apache.kylin.dimension.DimensionEncoding;
import org.apache.kylin.dimension.DimensionEncodingFactory;
import org.apache.kylin.engine.mr.common.CuboidStatsReaderUtil;
import org.apache.kylin.job.JobInstance;
Expand Down Expand Up @@ -625,6 +626,16 @@ private void validateColumnFamily(CubeDesc cubeDesc) {
throw new BadRequestException(
"the number of input measure and the number of measure defined in cubedesc are not consistent");
}

for (RowKeyColDesc rowKeyColDesc : cubeDesc.getRowkey().getRowKeyColumns()) {
Object[] encodingConf = DimensionEncoding.parseEncodingConf(rowKeyColDesc.getEncoding());
String encodingName = (String) encodingConf[0];
String[] encodingArgs = (String[]) encodingConf[1];

if (!DimensionEncodingFactory.isValidEncoding(encodingName, encodingArgs, rowKeyColDesc.getEncodingVersion())) {
throw new BadRequestException("Illegal row key column desc: " + rowKeyColDesc);
}
}
}

/**
Expand Down

0 comments on commit 475df34

Please sign in to comment.