/*
* Copyright © 2014 Cask Data, Inc.
*
* 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 co.cask.cdap.test.app;
import co.cask.cdap.api.common.Bytes;
import co.cask.cdap.api.data.batch.BatchReadable;
import co.cask.cdap.api.data.batch.BatchWritable;
import co.cask.cdap.api.data.batch.Split;
import co.cask.cdap.api.data.batch.SplitReader;
import co.cask.cdap.api.data.batch.SplitReaderAdapter;
import co.cask.cdap.api.dataset.DatasetAdmin;
import co.cask.cdap.api.dataset.DatasetContext;
import co.cask.cdap.api.dataset.DatasetDefinition;
import co.cask.cdap.api.dataset.DatasetSpecification;
import co.cask.cdap.api.dataset.lib.AbstractDataset;
import co.cask.cdap.api.dataset.lib.CompositeDatasetDefinition;
import co.cask.cdap.api.dataset.module.DatasetDefinitionRegistry;
import co.cask.cdap.api.dataset.module.DatasetModule;
import co.cask.cdap.api.dataset.table.Get;
import co.cask.cdap.api.dataset.table.Put;
import co.cask.cdap.api.dataset.table.Row;
import co.cask.cdap.api.dataset.table.Table;
import com.google.common.collect.ImmutableMap;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* Custom dataset example: key-value table
*/
public class MyKeyValueTableDefinition
extends CompositeDatasetDefinition<MyKeyValueTableDefinition.KeyValueTable> {
public MyKeyValueTableDefinition(String name, DatasetDefinition<? extends Table, ?> tableDefinition) {
super(name, ImmutableMap.of("table", tableDefinition));
}
@Override
public MyKeyValueTableDefinition.KeyValueTable getDataset(DatasetContext datasetContext, DatasetSpecification spec,
Map<String, String> arguments,
ClassLoader classLoader) throws IOException {
return new MyKeyValueTableDefinition.KeyValueTable(spec.getName(),
getDataset(datasetContext, "table", Table.class,
spec, arguments, classLoader));
}
/**
* Custom dataset example: key-value table
*/
public static class KeyValueTable
extends AbstractDataset implements BatchReadable<String, String>, BatchWritable<String, String> {
private static final String COL = "";
private final Table table;
public KeyValueTable(String instanceName, Table table) {
super(instanceName, table);
this.table = table;
}
public void put(String key, String value) {
table.put(new Put(key, COL, value));
}
public String get(String key) {
return table.get(new Get(key, COL)).getString(COL);
}
public String get(String key, String defaultValue) {
String value = get(key);
return value == null ? defaultValue : value;
}
@Override
public List<Split> getSplits() {
return table.getSplits();
}
@Override
public SplitReader<String, String> createSplitReader(Split split) {
return new SplitReaderAdapter<byte[], String, Row, String> (table.createSplitReader(split)) {
@Override
protected String convertKey(byte[] key) {
return Bytes.toString(key);
}
@Override
protected String convertValue(Row value) {
return value.getString(COL);
}
};
}
@Override
public void write(String key, String value) {
put(key, value);
}
}
/**
* Dataset module
*/
public static class Module implements DatasetModule {
@Override
public void register(DatasetDefinitionRegistry registry) {
DatasetDefinition<Table, DatasetAdmin> tableDefinition = registry.get("table");
MyKeyValueTableDefinition keyValueTable = new MyKeyValueTableDefinition("myKeyValueTable", tableDefinition);
registry.add(keyValueTable);
}
}
}