//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Any modifications to this file will be lost upon recompilation of the source schema. 
// Generated on: 2016.10.28 at 01:32:25 PM AEDT 
//


package com.ibm.msl;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlElementRefs;
import javax.xml.bind.annotation.XmlType;


/**
 * 
 * A <i>Group</i> is a mapping that takes a repeatable
 * source node (a flat list) and groups that list based on some attribute
 * or element in the content of that node creating a nested list in the target.
 * 
 * <b>attributes</b>
 * <ul>
 * <li><i>groupBy</i>
 * A <i>groupBy</i>attribute identifies the attribute or element that the 
 * grouping will be based on.
 * </li>
 * </ul>
 *       
 * 
 * <p>Java class for Group complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType name="Group">
 *   &lt;complexContent>
 *     &lt;extension base="{http://www.ibm.com/2008/ccl/Mapping}Mapping">
 *       &lt;sequence>
 *         &lt;element ref="{http://www.ibm.com/2008/ccl/Mapping}documentation" minOccurs="0"/>
 *         &lt;element ref="{http://www.ibm.com/2008/ccl/Mapping}input" maxOccurs="unbounded"/>
 *         &lt;element ref="{http://www.ibm.com/2008/ccl/Mapping}output" maxOccurs="unbounded"/>
 *         &lt;element ref="{http://www.ibm.com/2008/ccl/Mapping}field" minOccurs="0"/>
 *         &lt;element ref="{http://www.ibm.com/2008/ccl/Mapping}sort" maxOccurs="unbounded" minOccurs="0"/>
 *         &lt;group ref="{http://www.ibm.com/2008/ccl/Mapping}nested" maxOccurs="unbounded" minOccurs="0"/>
 *       &lt;/sequence>
 *       &lt;attribute name="groupBy" type="{http://www.w3.org/2001/XMLSchema}string" />
 *     &lt;/extension>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Group", propOrder = {
    "documentation",
    "input",
    "output",
    "field",
    "sort",
    "nested"
})
public class Group
    extends Mapping
{

    protected Documentation documentation;
    @XmlElement(required = true)
    protected List<MappingDesignator> input;
    @XmlElement(required = true)
    protected List<MappingDesignator> output;
    protected Field field;
    protected List<Sort> sort;
    @XmlElementRefs({
        @XmlElementRef(name = "custom", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "insert", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "update", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "select", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "delete", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "remove", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "lookup", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "task", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "create", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "join", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "transaction", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "submap", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "foreach", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "local", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "if", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "move", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "condition", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "expression", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "passthrough", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "append", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "group", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "convert", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "customFunction", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "assign", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "function", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "rdbcall", namespace = "http://www.ibm.com/2008/ccl/Mapping", type = JAXBElement.class, required = false)
    })
    protected List<JAXBElement<?>> nested;
    @XmlAttribute(name = "groupBy")
    protected String groupBy;

    /**
     * Gets the value of the documentation property.
     * 
     * @return
     *     possible object is
     *     {@link Documentation }
     *     
     */
    public Documentation getDocumentation() {
        return documentation;
    }

    /**
     * Sets the value of the documentation property.
     * 
     * @param value
     *     allowed object is
     *     {@link Documentation }
     *     
     */
    public void setDocumentation(Documentation value) {
        this.documentation = value;
    }

    /**
     * Gets the value of the input property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the input property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getInput().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link MappingDesignator }
     * 
     * 
     */
    public List<MappingDesignator> getInput() {
        if (input == null) {
            input = new ArrayList<MappingDesignator>();
        }
        return this.input;
    }

    /**
     * Gets the value of the output property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the output property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getOutput().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link MappingDesignator }
     * 
     * 
     */
    public List<MappingDesignator> getOutput() {
        if (output == null) {
            output = new ArrayList<MappingDesignator>();
        }
        return this.output;
    }

    /**
     * Gets the value of the field property.
     * 
     * @return
     *     possible object is
     *     {@link Field }
     *     
     */
    public Field getField() {
        return field;
    }

    /**
     * Sets the value of the field property.
     * 
     * @param value
     *     allowed object is
     *     {@link Field }
     *     
     */
    public void setField(Field value) {
        this.field = value;
    }

    /**
     * Gets the value of the sort property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the sort property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getSort().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link Sort }
     * 
     * 
     */
    public List<Sort> getSort() {
        if (sort == null) {
            sort = new ArrayList<Sort>();
        }
        return this.sort;
    }

    /**
     * Gets the value of the nested property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the nested property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getNested().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link JAXBElement }{@code <}{@link Custom }{@code >}
     * {@link JAXBElement }{@code <}{@link DatabaseMapping }{@code >}
     * {@link JAXBElement }{@code <}{@link DatabaseMapping }{@code >}
     * {@link JAXBElement }{@code <}{@link DatabaseMapping }{@code >}
     * {@link JAXBElement }{@code <}{@link DatabaseMapping }{@code >}
     * {@link JAXBElement }{@code <}{@link Remove }{@code >}
     * {@link JAXBElement }{@code <}{@link Lookup }{@code >}
     * {@link JAXBElement }{@code <}{@link Task }{@code >}
     * {@link JAXBElement }{@code <}{@link Create }{@code >}
     * {@link JAXBElement }{@code <}{@link Join }{@code >}
     * {@link JAXBElement }{@code <}{@link Transaction }{@code >}
     * {@link JAXBElement }{@code <}{@link Submap }{@code >}
     * {@link JAXBElement }{@code <}{@link Foreach }{@code >}
     * {@link JAXBElement }{@code <}{@link Local }{@code >}
     * {@link JAXBElement }{@code <}{@link If }{@code >}
     * {@link JAXBElement }{@code <}{@link Move }{@code >}
     * {@link JAXBElement }{@code <}{@link Condition }{@code >}
     * {@link JAXBElement }{@code <}{@link Expression }{@code >}
     * {@link JAXBElement }{@code <}{@link Passthrough }{@code >}
     * {@link JAXBElement }{@code <}{@link Append }{@code >}
     * {@link JAXBElement }{@code <}{@link Group }{@code >}
     * {@link JAXBElement }{@code <}{@link Convert }{@code >}
     * {@link JAXBElement }{@code <}{@link CustomFunction }{@code >}
     * {@link JAXBElement }{@code <}{@link Assign }{@code >}
     * {@link JAXBElement }{@code <}{@link Function }{@code >}
     * {@link JAXBElement }{@code <}{@link DatabaseMapping }{@code >}
     * 
     * 
     */
    public List<JAXBElement<?>> getNested() {
        if (nested == null) {
            nested = new ArrayList<JAXBElement<?>>();
        }
        return this.nested;
    }

    /**
     * Gets the value of the groupBy property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getGroupBy() {
        return groupBy;
    }

    /**
     * Sets the value of the groupBy property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setGroupBy(String value) {
        this.groupBy = value;
    }

}
