/*
 * 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.impl.plan;

import java.util.List;

public class MapKeysInfo {
    List<String> keys;
    boolean needAllKeys;
    public MapKeysInfo() {
        needAllKeys = false;
        keys = null;
    }
    public MapKeysInfo(List<String> keys) {
        needAllKeys = false;
        this.keys = keys;
    }
    public MapKeysInfo(boolean needAllKeys) {
        this.needAllKeys = needAllKeys;
        this.keys = null;
    }
    public MapKeysInfo(boolean needAllKeys, List<String> keys) {
        this.needAllKeys = needAllKeys;
        this.keys = keys;
    }
    public List<String> getKeys()
    {
        return keys;
    }
    public boolean needAllKeys()
    {
        return needAllKeys;
    }
    public String toString()
    {
        if (needAllKeys)
            return "Need all keys";
        if (keys==null)
            return "Empty";
        StringBuffer result = new StringBuffer();
        result.append("[");
        for (int i=0;i<keys.size();i++)
        {
            result.append(keys.get(i));
            if (i!=keys.size()-1)
                result.append(",");
        }
        result.append("]");
        return result.toString();
    }
}
