blob: b2a24e74ec8d1d9ae0d06e000ffcb9b50dd81490 [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.pig.data;
import java.lang.Class;
import java.lang.ClassLoader;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Comparator;
import java.util.List;
import org.apache.pig.classification.InterfaceAudience;
import org.apache.pig.classification.InterfaceStability;
import org.apache.pig.impl.util.SpillableMemoryManager;
/**
* Factory for constructing different types of bags.
* This class is abstract so that users can
* override the bag factory if they desire to provide their own that
* returns their implementation of a bag. If the property
* pig.data.bag.factory.name is set to a class name and
* pig.data.bag.factory.jar is set to a URL pointing to a jar that
* contains the above named class, then getInstance() will create
* an instance of the named class using the indicated jar. Otherwise, it
* will create an instance of DefaultBagFactory.
*/
@InterfaceAudience.Public
@InterfaceStability.Stable
public abstract class BagFactory {
private static BagFactory gSelf = null;
private static SpillableMemoryManager gMemMgr;
/**
* Get a reference to the singleton factory.
* @return BagFactory
*/
public static BagFactory getInstance() {
if (gSelf == null) {
String factoryName =
System.getProperty("pig.data.bag.factory.name");
String factoryJar =
System.getProperty("pig.data.bag.factory.jar");
if (factoryName != null && factoryJar != null) {
try {
URL[] urls = new URL[1];
urls[0] = new URL(factoryJar);
ClassLoader loader = new URLClassLoader(urls,
BagFactory.class.getClassLoader());
Class c = Class.forName(factoryName, true, loader);
Object o = c.newInstance();
if (!(o instanceof BagFactory)) {
throw new RuntimeException("Provided factory " +
factoryName + " does not extend BagFactory!");
}
gSelf = (BagFactory)o;
} catch (Exception e) {
if (e instanceof RuntimeException) {
// We just threw this
RuntimeException re = (RuntimeException)e;
throw re;
}
throw new RuntimeException("Unable to instantiate "
+ "bag factory " + factoryName, e);
}
} else {
gSelf = new DefaultBagFactory();
}
}
return gSelf;
}
/**
* Get a default (unordered, not distinct) data bag.
* @return default data bag.
*/
public abstract DataBag newDefaultBag();
/**
* Get a default (unordered, not distinct) data bag with
* an existing list of tuples inserted into the bag.
* @param listOfTuples list of tuples to be placed in the bag. This list may not be
* copied, it may be used directly by the created bag.
* @return default data bag.
*/
public abstract DataBag newDefaultBag(List<Tuple> listOfTuples);
/**
* Get a limited sorted data bag. Limited sorted bags are sorted bags
* with number of elements no more than limit.
* @param comp Comparator that controls how the data is sorted.
* If null, default comparator will be used.
* @param limit max number of tuples in bag
* @return a sorted data bag
*/
public abstract DataBag newLimitedSortedBag(Comparator<Tuple> comp, long limit);
/**
* Get a sorted data bag. Sorted bags guarantee that when an iterator
* is opened on the bag the tuples will be returned in sorted order.
* @param comp Comparator that controls how the data is sorted.
* If null, default comparator will be used.
* @return a sorted data bag
*/
public abstract DataBag newSortedBag(Comparator<Tuple> comp);
/**
* Get a distinct data bag. Distinct bags guarantee that when an
* iterator is opened on the bag, no two tuples returned from the
* iterator will be equal.
* @return distinct data bag
*/
public abstract DataBag newDistinctBag();
/**
* Construct a new BagFactory
*/
protected BagFactory() {
gMemMgr = SpillableMemoryManager.getInstance();
}
/**
* @deprecated As of Pig 0.11, bags register with the {@link SpillableMemoryManager} themselves.
* Register a bag with the
* {@link org.apache.pig.impl.util.SpillableMemoryManager}.
* If the bags created by an implementation of BagFactory are managed by
* the {@link org.apache.pig.impl.util.SpillableMemoryManager} then this
* method should be called each time a new bag is created.
* @param b bag to be registered.
*/
@Deprecated
protected void registerBag(DataBag b) {
gMemMgr.registerSpillable(b);
}
/**
* Provided for testing purposes only. This function should never be
* called by anybody but the unit tests.
*/
public static void resetSelf() {
gSelf = null;
}
}