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

com.clickntap.square.database.Query Maven / Gradle / Ivy

package com.clickntap.square.database;

import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.io.FileUtils;
import org.json.JSONArray;
import org.json.JSONObject;

import com.clickntap.square.App;
import com.clickntap.square.objects.BO;
import com.clickntap.square.utils.DateUtils;
import com.clickntap.square.utils.StringUtils;

public class Query {
	private List params;
	private BO bo;
	private String name;
	private JSONObject json;
	private String code;
	private Map paramsMap;

	public String getName() {
		return name;
	}

	public Query(BO bo) {
		this.bo = bo;
		this.name = null;
		clear();
	}

	public void clear() {
		this.params = new ArrayList();
	}

	public Query(String name) throws Exception {
		this(null, name);
		{
			StringBuffer sb = new StringBuffer(App.getInstance().getConf().getJSONObject("context").getString("web-inf"));
			sb.append("/square/sql/");
			sb.append(name);
			sb.append(".json");
			this.json = new JSONObject(FileUtils.readFileToString(new File(sb.toString()), StandardCharsets.UTF_8));
		}
		{
			StringBuffer sb = new StringBuffer(App.getInstance().getConf().getJSONObject("context").getString("web-inf"));
			sb.append("/square/sql/");
			sb.append(name);
			sb.append(".js");
			try {
				this.code = FileUtils.readFileToString(new File(sb.toString()), StandardCharsets.UTF_8);
			} catch (Exception e) {
				this.code = null;
			}
		}
		this.paramsMap = new HashMap();
		this.paramsMap.put("now", DateUtils.now());
	}

	public Query(BO bo, String name) {
		this(bo);
		this.name = name;
	}

	public BO getBo() {
		return this.bo;
	}

	public boolean has(String name) {
		return this.bo.get(name) != null;
	}

	public String param(String name) {
		if (this.bo == null && this.paramsMap != null) {
			this.params.add(this.paramsMap.get(name));
		} else {
			this.params.add(this.bo.get(name));
		}
		return "?";
	}

	public String camel(String name) {
		return StringUtils.toCamelCase(name);
	}

	public Number create() throws Exception {
		String sql = App.getInstance().getBOs().evalScript("create.sql", this);
		return new Database(sql, params).create();
	}

	public JSONObject read() throws Exception {
		String sql = App.getInstance().getBOs().evalScript("read.sql", this);
		return new Database(sql, params).read();
	}

	public JSONArray search() throws Exception {
		String sql = App.getInstance().getBOs().evalScript("search.sql", this);
		return new Database(sql, params).search();
	}

	public int update() throws Exception {
		String sql = App.getInstance().getBOs().evalScript("update.sql", this);
		return new Database(sql, params).update();
	}

	public int touch() throws Exception {
		String sql = App.getInstance().getBOs().evalScript("touch.sql", this);
		return new Database(sql, params).update();
	}

	public int delete() throws Exception {
		String sql = App.getInstance().getBOs().evalScript("delete.sql", this);
		return new Database(sql, params).update();
	}

	public JSONObject auth() throws Exception {
		String sql = App.getInstance().getBOs().evalScript("auth.sql", this);
		return new Database(sql, params).read();
	}

	public JSONArray list() throws Exception {
		String sql = App.getInstance().getBOs().evalScript("list.sql", this);
		return new Database(sql, params).list();
	}

	public JSONObject run() throws Exception {
		boolean byId = false;
		if (this.json.has("filters")) {
			JSONArray filters = this.json.getJSONArray("filters");
			for (int i = 0; i < filters.length(); i++) {
				if (filters.getJSONObject(i).getString("name").equals("id")) {
					byId = true;
				}
			}
		}
		Number count = 0;
		if (this.json.has("limit")) {
			String sql = App.getInstance().getBOs().evalScript("count.sql", this, json);
			JSONObject json = new Database(sql, params).read();
			count = json.getNumber("count");
		}
		String sql = App.getInstance().getBOs().evalScript("query.sql", this, json);
		JSONObject json = new Database(sql, params).query(byId);
		if (this.json.has("limit")) {
			json.put("count", count);
		}
		if (this.json.has("includes")) {
			JSONArray includes = this.json.getJSONArray("includes");
			if (json.has("item")) {
				query(json.getJSONObject("item"), includes);
			} else if (json.has("items")) {
				JSONArray items = json.getJSONArray("items");
				for (int i = 0; i < items.length(); i++) {
					query(items.getJSONObject(i), includes);
				}
			}
		}
		if (this.code != null) {
			return new JSONObject(App.getInstance().parse(this.code, json));
		}
		return json;
	}

	private void query(JSONObject item, JSONArray includes) throws Exception {
		for (int i = 0; i < includes.length(); i++) {
			JSONObject include = includes.getJSONObject(i);
			Query query = new Query(include.getString("file"));
			for (String key : paramsMap.keySet()) {
				query.addParam(key, paramsMap.get(key));
			}
			for (String key : item.keySet()) {
				query.addParam("item." + key, item.get(key));
			}
			item.put(include.getString("name"), query.run());
		}
	}

	public void addParam(String name, Object value) {
		paramsMap.put(name, value);
	}

	public boolean hasParam(String name) {
		return paramsMap.containsKey(name);
	}

	public Object getParam(String name) {
		return paramsMap.get(name);
	}
}