All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.lithium.ldn.starql.models.QlField Maven / Gradle / Ivy

package com.lithium.ldn.starql.models;

import java.util.Collections;
import java.util.List;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

import com.google.common.collect.Lists;

/**
 * Recursive definition for a field of a resource.
 * 
 * @author David Esposito
 */
public class QlField {

	private final String name;
	private final String qualifiedName;
	private final String qualifier;
	private final QlField subObject;
	private final boolean isStar;
	private final boolean isFunction;

	/**
	 * Get the name of the current field. Parent and sub fields are not included in the string.
	 *  
	 * @return Get the name.
	 */
	public final String getName() {
		return name;
	}
	
	public final boolean hasQualifier() {
		return qualifier != null;
	}
	
	/**
	 * Get the qualifier for this field if it exists e.g.
	 *  
	 * 		SELECT DISTINT topic.id FROM messages 
	 * 
	 * @return The qualifier if it exists, {@code null} otherwise.
	 */
	public final String getQualifier() {
		return qualifier;
	}
	
	/**
	 * Get the fully qualified name treating this field as root ancestor. Parent field names are
	 * not included in this string.
	 * 
	 * @return Name of this field and all sub-fields.
	 */
	public final String getQualifiedName() {
		return qualifiedName;
	}
	
	public final boolean isStar() {
		return isStar;
	}

	public boolean isFunction() {
		return isFunction;
	}

	public final boolean hasSubObject() {
		return subObject != null;
	}
	
	public final QlField getSubObject() {
		return subObject;
	}
	
	public static final QlField create(String name) {
		return create(null, name);
	}
	
	public static final QlField create(String qualifier, String name) {
		return create(qualifier, name, null, false);
	}
	
	public static final QlField create(String qualifier, String name, QlField subObject, boolean isFunction) {
		return new QlField(qualifier, name, subObject, isFunction);
	}

	private QlField(String qualifier, String name, QlField subObject, boolean isFunction) {
		this.name = name;
		this.qualifier = qualifier;
		this.isStar = name.equals("*");
		this.subObject = subObject;
		this.isFunction = isFunction;
		if (isFunction) {
			this.qualifiedName = name + "(" + subObject.getQualifiedName()
					+ ")";
		} else {
			this.qualifiedName = hasSubObject() ? name + "."
					+ subObject.getQualifiedName() : name;
		}
	}

	@Override
	public String toString() {
		return "QlField [name=" + name + ", subObject=" + subObject + ", isStar=" + isStar + ", isFunction=" + isFunction + "]";
	}

	@Override
	public int hashCode() {
		return HashCodeBuilder.reflectionHashCode(this);
	}

	@Override
	public boolean equals(Object obj) {
		return EqualsBuilder.reflectionEquals(this, obj);
	}
	
	public static class CollectionBuilder {
		private List fields = Lists.newArrayList();
		public List getFields() {
			return fields;
		}
		public CollectionBuilder add(String qualifier, String name, QlField subObject, boolean isFunction) {
			return add(new QlField(qualifier, name, subObject, isFunction));
		}
		public CollectionBuilder add(QlField field) {
			fields.add(field);
			return this;
		}
		/**
		 * 
		 * @return An unmutable representation of the current build. Never {@code null}.
		 */
		public List build() {
			return Collections.unmodifiableList(fields);
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy