blob: 3a8923819c337183c562208aea409df04704c85e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.hyracks.storage.am.lsm.rtree.dataflow;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.hyracks.api.application.INCServiceContext;
import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
import org.apache.hyracks.api.dataflow.value.ILinearizeComparatorFactory;
import org.apache.hyracks.api.dataflow.value.ITypeTraits;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.api.io.FileReference;
import org.apache.hyracks.api.io.IIOManager;
import org.apache.hyracks.api.io.IJsonSerializable;
import org.apache.hyracks.api.io.IPersistedResourceRegistry;
import org.apache.hyracks.storage.am.common.api.IMetadataPageManagerFactory;
import org.apache.hyracks.storage.am.common.api.INullIntrospector;
import org.apache.hyracks.storage.am.common.api.IPrimitiveValueProviderFactory;
import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationSchedulerProvider;
import org.apache.hyracks.storage.am.lsm.common.api.ILSMMergePolicyFactory;
import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTrackerFactory;
import org.apache.hyracks.storage.am.lsm.common.api.ILSMPageWriteCallbackFactory;
import org.apache.hyracks.storage.am.lsm.common.api.IVirtualBufferCache;
import org.apache.hyracks.storage.am.lsm.common.api.IVirtualBufferCacheProvider;
import org.apache.hyracks.storage.am.lsm.common.dataflow.LsmResource;
import org.apache.hyracks.storage.am.lsm.rtree.utils.LSMRTreeUtils;
import org.apache.hyracks.storage.am.rtree.frames.RTreePolicyType;
import org.apache.hyracks.storage.common.IIndex;
import org.apache.hyracks.storage.common.IStorageManager;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
public class LSMRTreeLocalResource extends LsmResource {
private static final long serialVersionUID = 1L;
protected final IBinaryComparatorFactory[] btreeCmpFactories;
protected final IPrimitiveValueProviderFactory[] valueProviderFactories;
protected final RTreePolicyType rtreePolicyType;
protected final ILinearizeComparatorFactory linearizeCmpFactory;
protected final int[] rtreeFields;
protected final int[] buddyBTreeFields;
protected final boolean isPointMBR;
protected final double bloomFilterFalsePositiveRate;
public LSMRTreeLocalResource(String path, IStorageManager storageManager, ITypeTraits[] typeTraits,
IBinaryComparatorFactory[] rtreeCmpFactories, ITypeTraits[] filterTypeTraits,
IBinaryComparatorFactory[] filterCmpFactories, int[] filterFields,
ILSMOperationTrackerFactory opTrackerProvider, ILSMIOOperationCallbackFactory ioOpCallbackFactory,
ILSMPageWriteCallbackFactory pageWriteCallbackFactory,
IMetadataPageManagerFactory metadataPageManagerFactory, IVirtualBufferCacheProvider vbcProvider,
ILSMIOOperationSchedulerProvider ioSchedulerProvider, ILSMMergePolicyFactory mergePolicyFactory,
Map<String, String> mergePolicyProperties, boolean durable, IBinaryComparatorFactory[] btreeCmpFactories,
IPrimitiveValueProviderFactory[] valueProviderFactories, RTreePolicyType rtreePolicyType,
ILinearizeComparatorFactory linearizeCmpFactory, int[] rtreeFields, int[] buddyBTreeFields,
boolean isPointMBR, double bloomFilterFalsePositiveRate, ITypeTraits nullTypeTraits,
INullIntrospector nullIntrospector) {
super(path, storageManager, typeTraits, rtreeCmpFactories, filterTypeTraits, filterCmpFactories, filterFields,
opTrackerProvider, ioOpCallbackFactory, pageWriteCallbackFactory, metadataPageManagerFactory,
vbcProvider, ioSchedulerProvider, mergePolicyFactory, mergePolicyProperties, durable, nullTypeTraits,
nullIntrospector);
this.btreeCmpFactories = btreeCmpFactories;
this.valueProviderFactories = valueProviderFactories;
this.rtreePolicyType = rtreePolicyType;
this.linearizeCmpFactory = linearizeCmpFactory;
this.rtreeFields = rtreeFields;
this.buddyBTreeFields = buddyBTreeFields;
this.isPointMBR = isPointMBR;
this.bloomFilterFalsePositiveRate = bloomFilterFalsePositiveRate;
}
protected LSMRTreeLocalResource(IPersistedResourceRegistry registry, JsonNode json,
IBinaryComparatorFactory[] btreeCmpFactories, IPrimitiveValueProviderFactory[] valueProviderFactories,
RTreePolicyType rtreePolicyType, ILinearizeComparatorFactory linearizeCmpFactory, int[] rtreeFields,
int[] buddyBTreeFields, boolean isPointMBR, double bloomFilterFalsePositiveRate)
throws HyracksDataException {
super(registry, json);
this.btreeCmpFactories = btreeCmpFactories;
this.valueProviderFactories = valueProviderFactories;
this.rtreePolicyType = rtreePolicyType;
this.linearizeCmpFactory = linearizeCmpFactory;
this.rtreeFields = rtreeFields;
this.buddyBTreeFields = buddyBTreeFields;
this.isPointMBR = isPointMBR;
this.bloomFilterFalsePositiveRate = bloomFilterFalsePositiveRate;
}
@Override
public IIndex createInstance(INCServiceContext ncServiceCtx) throws HyracksDataException {
IIOManager ioManager = storageManager.getIoManager(ncServiceCtx);
FileReference fileRef = ioManager.resolve(path);
List<IVirtualBufferCache> virtualBufferCaches = vbcProvider.getVirtualBufferCaches(ncServiceCtx, fileRef);
ioOpCallbackFactory.initialize(ncServiceCtx, this);
pageWriteCallbackFactory.initialize(ncServiceCtx, this);
return LSMRTreeUtils.createLSMTree(ioManager, virtualBufferCaches, fileRef,
storageManager.getBufferCache(ncServiceCtx), typeTraits, cmpFactories, btreeCmpFactories,
valueProviderFactories, rtreePolicyType, bloomFilterFalsePositiveRate,
mergePolicyFactory.createMergePolicy(mergePolicyProperties, ncServiceCtx),
opTrackerProvider.getOperationTracker(ncServiceCtx, this),
ioSchedulerProvider.getIoScheduler(ncServiceCtx), ioOpCallbackFactory, pageWriteCallbackFactory,
linearizeCmpFactory, rtreeFields, buddyBTreeFields, filterTypeTraits, filterCmpFactories, filterFields,
durable, isPointMBR, metadataPageManagerFactory, nullTypeTraits, nullIntrospector);
}
@Override
public JsonNode toJson(IPersistedResourceRegistry registry) throws HyracksDataException {
ObjectNode jsonObject = registry.getClassIdentifier(getClass(), serialVersionUID);
super.appendToJson(jsonObject, registry);
return jsonObject;
}
@Override
protected void appendToJson(final ObjectNode json, IPersistedResourceRegistry registry)
throws HyracksDataException {
super.appendToJson(json, registry);
final ArrayNode btreeCmpFactoriesArray = OBJECT_MAPPER.createArrayNode();
for (IBinaryComparatorFactory factory : btreeCmpFactories) {
btreeCmpFactoriesArray.add(factory.toJson(registry));
}
json.set("btreeCmpFactories", btreeCmpFactoriesArray);
json.set("linearizeCmpFactory", linearizeCmpFactory.toJson(registry));
final ArrayNode valueProviderFactoriesArray = OBJECT_MAPPER.createArrayNode();
for (IPrimitiveValueProviderFactory factory : valueProviderFactories) {
valueProviderFactoriesArray.add(factory.toJson(registry));
}
json.set("valueProviderFactories", valueProviderFactoriesArray);
json.set("rtreePolicyType", rtreePolicyType.toJson(registry));
json.putPOJO("rtreeFields", rtreeFields);
json.putPOJO("buddyBTreeFields", buddyBTreeFields);
json.put("isPointMBR", isPointMBR);
json.put("bloomFilterFalsePositiveRate", bloomFilterFalsePositiveRate);
}
public static IJsonSerializable fromJson(IPersistedResourceRegistry registry, JsonNode json)
throws HyracksDataException {
final int[] buddyBTreeFields = OBJECT_MAPPER.convertValue(json.get("buddyBTreeFields"), int[].class);
final int[] rtreeFields = OBJECT_MAPPER.convertValue(json.get("rtreeFields"), int[].class);
final double bloomFilterFalsePositiveRate = json.get("bloomFilterFalsePositiveRate").asDouble();
final boolean isPointMBR = json.get("isPointMBR").asBoolean();
final RTreePolicyType rtreePolicyType = (RTreePolicyType) registry.deserialize(json.get("rtreePolicyType"));
final ILinearizeComparatorFactory linearizeCmpFactory =
(ILinearizeComparatorFactory) registry.deserialize(json.get("linearizeCmpFactory"));
final List<IBinaryComparatorFactory> btreeCmpFactoriesList = new ArrayList<>();
final ArrayNode jsonBtreeCmpFactories = (ArrayNode) json.get("btreeCmpFactories");
for (JsonNode cf : jsonBtreeCmpFactories) {
btreeCmpFactoriesList.add((IBinaryComparatorFactory) registry.deserialize(cf));
}
final IBinaryComparatorFactory[] btreeCmpFactories =
btreeCmpFactoriesList.toArray(new IBinaryComparatorFactory[0]);
final List<IPrimitiveValueProviderFactory> valueProviderFactoriesList = new ArrayList<>();
final ArrayNode jsonValueProviderFactories = (ArrayNode) json.get("valueProviderFactories");
for (JsonNode cf : jsonValueProviderFactories) {
valueProviderFactoriesList.add((IPrimitiveValueProviderFactory) registry.deserialize(cf));
}
final IPrimitiveValueProviderFactory[] valueProviderFactories =
valueProviderFactoriesList.toArray(new IPrimitiveValueProviderFactory[0]);
return new LSMRTreeLocalResource(registry, json, btreeCmpFactories, valueProviderFactories, rtreePolicyType,
linearizeCmpFactory, rtreeFields, buddyBTreeFields, isPointMBR, bloomFilterFalsePositiveRate);
}
}