/* * 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.addthis.hydra.data.query.op.merge; import com.addthis.bundle.core.Bundle; import com.addthis.bundle.core.BundleField; import com.addthis.bundle.value.ValueObject; import com.addthis.hydra.data.query.op.MergedRow; public abstract class AbstractMergedValue<T extends ValueObject> implements MergedValue { protected BundleField from; protected BundleField to; @Override public void emit(MergedRow mergedRow) { ValueObject value = mergedRow.getValue(to); if (value != null) { value = doEmit(convert(value), mergedRow); mergedRow.setValue(to, value); } } @Override public void merge(Bundle nextBundle, MergedRow mergedRow) { ValueObject nextValue = nextBundle.getValue(from); if (nextValue == null) { return; } ValueObject value = mergedRow.getValue(to); ValueObject mergedValue = merge(nextValue, value); mergedRow.setValue(to, mergedValue); } protected ValueObject merge(ValueObject nextValue, ValueObject value) { T nextValueT = convert(nextValue); if (value == null) { return nextValueT; } else { return doMerge(nextValueT, convert(value)); } } @Override public boolean isKey() { return false; } protected abstract T doMerge(T nextValue, T value); protected abstract T convert(ValueObject nextValue); protected T doEmit(T value, MergedRow mergedRow) { return value; } @Override public BundleField getFrom() { return from; } @Override public void setFrom(BundleField from) { this.from = from; } @Override public BundleField getTo() { return to; } @Override public void setTo(BundleField to) { this.to = to; } }