// Path: src/main/java/com/naskar/fluentquery/OrderBy.java
// public interface OrderBy<I> {
// 
// 	I asc();
// 	
// 	I desc();
// 
// }
// 
// Path: src/main/java/com/naskar/fluentquery/Select.java
// public interface Select {
// 	
// 	Select func(Function<String, String> action);
// 	
// 	Select func(Function<String, String> action, String alias);
// 
// 	Select groupBy();
// 	
// 	OrderBy<Select> orderBy();
// }


import java.util.function.Function;
import com.naskar.fluentquery.OrderBy;
import com.naskar.fluentquery.Select;

package com.naskar.fluentquery.impl;



public class SelectImpl<T> implements Select {
	
	private QueryImpl<T> queryImpl;
	private Function<T, ?> property;
	
	private Function<String, String> action;
	private String alias;
	
	public <R> SelectImpl(QueryImpl<T> queryImpl, Function<T, R> property) {
		this.queryImpl = queryImpl;
		this.property = property;
	}

	public Function<String, String> getAction() {
		return action;
	}
	
	public String getAlias() {
		return alias;
	}
	
	@Override
	public Select func(Function<String, String> action, String alias) {
		this.action = action;
		this.alias = alias;
		return this;
	}
	
	public Select func(Function<String, String> action) {
		this.action = action;
		return this;
	}
	
	@Override

// Path: src/main/java/com/naskar/fluentquery/OrderBy.java
// public interface OrderBy<I> {
// 
// 	I asc();
// 	
// 	I desc();
// 
// }
// 
// Path: src/main/java/com/naskar/fluentquery/Select.java
// public interface Select {
// 	
// 	Select func(Function<String, String> action);
// 	
// 	Select func(Function<String, String> action, String alias);
// 
// 	Select groupBy();
// 	
// 	OrderBy<Select> orderBy();
// }


// Path: src/main/java/com/naskar/fluentquery/impl/SelectImpl.java
import java.util.function.Function;
import com.naskar.fluentquery.OrderBy;
import com.naskar.fluentquery.Select;

package com.naskar.fluentquery.impl;



public class SelectImpl<T> implements Select {
	
	private QueryImpl<T> queryImpl;
	private Function<T, ?> property;
	
	private Function<String, String> action;
	private String alias;
	
	public <R> SelectImpl(QueryImpl<T> queryImpl, Function<T, R> property) {
		this.queryImpl = queryImpl;
		this.property = property;
	}

	public Function<String, String> getAction() {
		return action;
	}
	
	public String getAlias() {
		return alias;
	}
	
	@Override
	public Select func(Function<String, String> action, String alias) {
		this.action = action;
		this.alias = alias;
		return this;
	}
	
	public Select func(Function<String, String> action) {
		this.action = action;
		return this;
	}
	
	@Override

	public Select groupBy() {
