Skip to content

Commit

Permalink
some improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
oemergenc committed Mar 12, 2020
1 parent 17e07e2 commit 55ba247
Show file tree
Hide file tree
Showing 10 changed files with 135 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,15 @@ protected AbstractHBDynamicDAO(Connection connection) {
hbDynamicColumnObjectMapper.validate(hbRecordClass);
}

public T getDynamicCell(R rowKey, String family, String cellIdentifier) throws IOException {
public T getDynamicCell(R rowKey,
String family,
String cellIdentifier) throws Exception {
return getDynamicCell(rowKey, family, List.of(cellIdentifier));
}

public T getDynamicCell(R rowKey, String family, List<String> qualifierParts) throws IOException {
public T getDynamicCell(R rowKey,
String family,
List<String> qualifierParts) throws Exception {
Get get = hbDynamicColumnObjectMapper.getAsGet(hbRecordClass, toBytes(rowKey), family, qualifierParts);
return getOnGet(get);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ public HBDynamicColumnObjectMapper() {

public <R extends Serializable & Comparable<R>, T extends HBRecord<R>>
Get getAsGet(Class<T> hbRecordClazz, byte[] rowKey, String family, List<String> qualifierParts) {
HBDynamicColumnRecordValidator.validateQualifierParts(qualifierParts);
HBDynamicColumnRecordValidator.validateFamily(family);

Get get = new Get(rowKey);
List<HBDynamicColumn> hbDynamicColumnsForFamily = getHBDynamicColumnsForFamily(hbRecordClazz, family);
for (val hbDynamicColumn : hbDynamicColumnsForFamily) {
Expand Down Expand Up @@ -315,6 +318,6 @@ public static <T> T safeCast(Object o, Class<T> clazz) {
}

public <T extends HBRecord<?>> void validate(Class<T> hbRecordClazz) {
new HBDynamicColumnRecordValidator().validate(hbRecordClazz);
HBDynamicColumnRecordValidator.validate(hbRecordClazz);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
Expand All @@ -21,7 +22,7 @@
public class HBDynamicColumnRecordValidator {
private static Mirror MIRROR = new Mirror();

public <T extends HBRecord<?>> void validate(Class<T> hbRecordClazz) {
static public <T extends HBRecord<?>> void validate(Class<T> hbRecordClazz) {
val hbDynamicColumnFields = MIRROR.on(hbRecordClazz).reflectAll().fields()
.matching(element -> element.getAnnotation(HBDynamicColumn.class) != null);

Expand All @@ -37,7 +38,7 @@ public <T extends HBRecord<?>> void validate(Class<T> hbRecordClazz) {
throw new IllegalArgumentException("HBDynamicColumn field must be a collection, but was " + dynamicField.getType());
}
validateQualifierField(dynamicField, qualifier);
validateQualifierParts(qualifier);
validateQualifierParts(Arrays.asList(qualifier.parts()));
validateFamily(family);
validateAlias(alias);
validateSeparator(separator);
Expand All @@ -46,8 +47,8 @@ public <T extends HBRecord<?>> void validate(Class<T> hbRecordClazz) {
validateNoDuplicatePrefix(columnPrefixList);
}

private void validateNoDuplicatePrefix(List<String> columnPrefixList) {
List duplicates = columnPrefixList.stream().collect(Collectors.groupingBy(Function.identity()))
static public void validateNoDuplicatePrefix(List<String> columnPrefixList) {
val duplicates = columnPrefixList.stream().collect(Collectors.groupingBy(Function.identity()))
.entrySet()
.stream()
.filter(e -> e.getValue().size() > 1)
Expand All @@ -58,36 +59,36 @@ private void validateNoDuplicatePrefix(List<String> columnPrefixList) {
}
}

private void validateQualifierParts(DynamicQualifier columnQualifierField) {
if (columnQualifierField.parts() == null || columnQualifierField.parts().length == 0) {
static public void validateQualifierParts(List<String> parts) {
if (parts.isEmpty()) {
throw new IllegalArgumentException("parts array of DynamicQualifier cannot be empty or null");
}
for (String part : columnQualifierField.parts()) {
for (String part : parts) {
if (StringUtil.isNullOrEmpty(part)) {
throw new IllegalArgumentException("a part of DynamicQualifier cannot be empty or null");
}
}
}

private void validateFamily(String alias) {
static public void validateFamily(String alias) {
if (StringUtil.isNullOrEmpty(alias)) {
throw new IllegalArgumentException("family of HBDynamicColumn cannot be empty or null");
}
}

private void validateAlias(String alias) {
static public void validateAlias(String alias) {
if (StringUtil.isNullOrEmpty(alias)) {
throw new IllegalArgumentException("alias of HBDynamicColumn cannot be empty or null");
}
}

private void validateSeparator(String sep) {
static public void validateSeparator(String sep) {
if (StringUtil.isNullOrEmpty(sep)) {
throw new IllegalArgumentException("separator of DynamicQualifier cannot be empty or null");
}
}

private void validateQualifierField(Field field, DynamicQualifier qualifier) {
static public void validateQualifierField(Field field, DynamicQualifier qualifier) {

ParameterizedType listType = (ParameterizedType) field.getGenericType();
Type actualTypeArgument = listType.getActualTypeArguments()[0];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import io.github.oemergenc.hbase.orm.extensions.domain.dto.DependentWithPrimitiv
import io.github.oemergenc.hbase.orm.extensions.domain.records.MultipleHBDynamicColumnsRecord
import spock.lang.Unroll

import static io.github.oemergenc.hbase.orm.extensions.data.TestContent.getDefaultMultiHBDynamicColumRecord
import static io.github.oemergenc.hbase.orm.extensions.data.TestContent.getStubDependend

class MultipleDynamicColumnsDaoComponentTest extends AbstractComponentSpec {
Expand Down Expand Up @@ -176,4 +177,30 @@ class MultipleDynamicColumnsDaoComponentTest extends AbstractComponentSpec {
recordResult.dynamicValues1.collect { it.recipeId }.containsAll(["dv1_recipeId_1"])
recordResult.dynamicValues1.collect { it.html }.containsAll(["<html>dv1_html_1</html>"])
}

@Unroll
def "Converting to get for dynamic qualifiers works"() {
given:
def staticId = UUID.randomUUID() as String
def record = getDefaultMultiHBDynamicColumRecord(staticId)

when:
dao.persist(record)

then:
def resultResult = dao.getRecordForDynamicFamily(staticId, queriedQualifierParts)

then:
resultResult.isPresent() == isPresent

where:
queriedQualifierParts | isPresent
["dv1_dp1_1", "dv1_dp2_1"] | true
["dynamicId1"] | false
["dv1_dp1_1", null] | false
["", "dv1_dp2_1"] | false
[" ", "dv1_dp2_1"] | false
["237912837"] | false
[" "] | false
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package io.github.oemergenc.hbase.orm.extensions.data

import io.github.oemergenc.hbase.orm.extensions.domain.dto.DependentWithListType
import io.github.oemergenc.hbase.orm.extensions.domain.dto.DependentWithPrimitiveTypes
import io.github.oemergenc.hbase.orm.extensions.domain.records.MultipleHBDynamicColumnsRecord

class TestContent {
static def getStubDependend() {
Expand Down Expand Up @@ -28,4 +30,26 @@ class TestContent {
values.recipeId,
values.html)
}

static def getDefaultMultiHBDynamicColumRecord(String staticId) {
def dynamicValues1 = [
new DependentWithPrimitiveTypes("dv1_dp1_1", "dv1_dp2_1", "dv1_position_1", "dv1_recipeId_1", "<html>dv1_html_1</html>"),
new DependentWithPrimitiveTypes("dv1_dp1_2", "dv1_dp2_2", "dv1_position_2", "dv1_recipeId_2", "<html>dv1_html_2</html>")
]
def dynamicValues2 = [
new DependentWithListType("dv2_dp1_1", "otherId_1", [], "aString_1"),
new DependentWithListType("dv2_dp1_2", "otherId_2", [], "aString_2"),
]
def dynamicValues3 = [
new DependentWithPrimitiveTypes("dv3_dp1_1", "dv3_dp2_1", "dv3_position_1", "dv3_recipeId_1", "<html>dv3_html_1</html>"),
new DependentWithPrimitiveTypes("dv3_dp1_2", "dv3_dp2_2", "dv3_position_2", "dv3_recipeId_2", "<html>dv3_html_2</html>")
]
def dynamicValues4 = [
new DependentWithPrimitiveTypes("dv4_dp1_1", "dv4_dp2_1", "dv4_position_1", "dv4_recipeId_1", "<html>dv4_html_1</html>"),
new DependentWithPrimitiveTypes("dv4_dp1_2", "dv4_dp2_2", "dv4_position_2", "dv4_recipeId_2", "<html>dv4_html_2</html>")
]

def record = new MultipleHBDynamicColumnsRecord(staticId, dynamicValues1, dynamicValues2, dynamicValues3, dynamicValues4)
record
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,30 +7,15 @@ import io.github.oemergenc.hbase.orm.extensions.domain.records.MultipleHBDynamic
import spock.lang.Specification
import spock.lang.Unroll

import static io.github.oemergenc.hbase.orm.extensions.data.TestContent.getDefaultMultiHBDynamicColumRecord

class MultiDynamicColumnMapperSpec extends Specification {
def mapper = new HBDynamicColumnObjectMapper()

def "Converting a record with multiple dynamic columns works"() {
given:
def staticId = "staticId"
def dynamicValues1 = [
new DependentWithPrimitiveTypes("dv1_dp1_1", "dv1_dp2_1", "dv1_position_1", "dv1_recipeId_1", "<html>dv1_html_1</html>"),
new DependentWithPrimitiveTypes("dv1_dp1_2", "dv1_dp2_2", "dv1_position_2", "dv1_recipeId_2", "<html>dv1_html_2</html>")
]
def dynamicValues2 = [
new DependentWithListType("dv2_dp1_1", "otherId_1", [], "aString_1"),
new DependentWithListType("dv2_dp1_2", "otherId_2", [], "aString_2"),
]
def dynamicValues3 = [
new DependentWithPrimitiveTypes("dv3_dp1_1", "dv3_dp2_1", "dv3_position_1", "dv3_recipeId_1", "<html>dv3_html_1</html>"),
new DependentWithPrimitiveTypes("dv3_dp1_2", "dv3_dp2_2", "dv3_position_2", "dv3_recipeId_2", "<html>dv3_html_2</html>")
]
def dynamicValues4 = [
new DependentWithPrimitiveTypes("dv4_dp1_1", "dv4_dp2_1", "dv4_position_1", "dv4_recipeId_1", "<html>dv4_html_1</html>"),
new DependentWithPrimitiveTypes("dv4_dp1_2", "dv4_dp2_2", "dv4_position_2", "dv4_recipeId_2", "<html>dv4_html_2</html>")
]

def record = new MultipleHBDynamicColumnsRecord(staticId, dynamicValues1, dynamicValues2, dynamicValues3, dynamicValues4)
def staticId = UUID.randomUUID() as String
def record = getDefaultMultiHBDynamicColumRecord(staticId)

when:
def result = mapper.writeValueAsResult(record)
Expand Down Expand Up @@ -136,4 +121,26 @@ class MultiDynamicColumnMapperSpec extends Specification {
[null] | null
[] | null
}

def "Converting to get for dynamic qualifiers works"() {
given:
def staticId = UUID.randomUUID() as String
def record = getDefaultMultiHBDynamicColumRecord(staticId)

when:
mapper.writeValueAsResult(record)

then:
def get = mapper.getAsGet(MultipleHBDynamicColumnsRecord.class, staticId.bytes, "dynamicFamily1", queriedQualifierParts)

then:
get
get.numFamilies() == expectedNumSize

where:
queriedQualifierParts | expectedNumSize
["dynamicId1"] | 1
["dv1_dp1_1", "dv1_dp2_1"] | 1
["237912837"] | 1
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,15 @@ class SingleDynamicColumnMapperSpec extends Specification {
result.getFamilyMap("staticFamily".bytes)['staticId'.bytes]

when:
def get = mapper.getAsGet(SingleHBDynamicColumnRecord.class, staticId.bytes, "dynamicFamily", ["dynamicId1"])
def get = mapper.getAsGet(SingleHBDynamicColumnRecord.class, staticId.bytes, "dynamicFamily", queriedQualifierParts)

then:
get
get.numFamilies() == 1
get.numFamilies() == expectedNumSize

where:
queriedQualifierParts | expectedNumSize
["dynamicId1"] | 1
["237912837"] | 1
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.hadoop.hbase.client.Connection;

import java.io.IOException;
import java.util.Optional;

@Slf4j
Expand All @@ -18,7 +17,7 @@ public CampaignDao(Connection connection) {
public Optional<CampaignRecord> getCampaign(String customerId, String campaignId) {
try {
return Optional.ofNullable(getDynamicCell(customerId, "campaign", campaignId));
} catch (IOException e) {
} catch (Exception e) {
log.error("There was an error while trying to get campaign data of customer", e);
e.printStackTrace();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,26 @@

import io.github.oemergenc.hbase.orm.extensions.AbstractHBDynamicDAO;
import io.github.oemergenc.hbase.orm.extensions.domain.records.MultipleHBDynamicColumnsRecord;
import lombok.extern.slf4j.Slf4j;
import org.apache.hadoop.hbase.client.Connection;

import java.util.List;
import java.util.Optional;

@Slf4j
public class MultipleDynamicColumsDao extends AbstractHBDynamicDAO<String, MultipleHBDynamicColumnsRecord> {
public MultipleDynamicColumsDao(Connection connection) {
super(connection);
}

public Optional<MultipleHBDynamicColumnsRecord> getRecordForDynamicFamily(String rowKey,
List<String> qualifierParts) {
try {
return Optional.ofNullable(getDynamicCell(rowKey, "dynamicFamily1", qualifierParts));
} catch (Exception e) {
log.error("There was an error while trying to get column family data of hbdynamic column", e);
e.printStackTrace();
}
return Optional.empty();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,21 @@ public RecipeCampaignActionsDao(Connection connection) {
public Optional<RecipeCampaignActionRecord> getCampaignActionByPosition(String customerId,
String campaignId,
Integer position) throws IOException {
return Optional.ofNullable(getDynamicCell(customerId, CAMPAIGNS_FAMILY, List.of(campaignId, position.toString())));
try {
return Optional.ofNullable(getDynamicCell(customerId, CAMPAIGNS_FAMILY, List.of(campaignId, position.toString())));
} catch (Exception e) {
e.printStackTrace();
}
return Optional.empty();
}

public Optional<RecipeCampaignActionRecord> getCampaignActionByDay(final String customerId,
final String cellIdentifier) throws IOException {
return Optional.ofNullable(getDynamicCell(customerId, DAYS_FAMILY, cellIdentifier));
try {
return Optional.ofNullable(getDynamicCell(customerId, DAYS_FAMILY, cellIdentifier));
} catch (Exception e) {
e.printStackTrace();
}
return Optional.empty();
}
}

0 comments on commit 55ba247

Please sign in to comment.