package sdeTest;

import com.esri.sde.sdk.client.SeConnection;
import com.esri.sde.sdk.client.SeCoordinateReference;
import com.esri.sde.sdk.client.SeException;
import com.esri.sde.sdk.client.SeExtent;
import com.esri.sde.sdk.client.SeFilter;
import com.esri.sde.sdk.client.SeLayer;
import com.esri.sde.sdk.client.SeQuery;
import com.esri.sde.sdk.client.SeQueryInfo;
import com.esri.sde.sdk.client.SeRow;
import com.esri.sde.sdk.client.SeShape;
import com.esri.sde.sdk.client.SeShapeFilter;
import com.esri.sde.sdk.client.SeSqlConstruct;
import com.esri.sde.sdk.client.SeTable;

public class TableStatsTest {

	/**
	 * Usage: TableStatsTest <server> <instance> <user> <password> <datasetName>
	 * 
	 * Example: TableStatsTest x.y.z 9999 user pwd SDE_TABLE_NAME
	 * 
	 * Requires ArcSDE Java API jars.
	 * 
	 * @param args
	 * @throws SeException
	 */
	public static void main(String[] args) throws SeException {

		String server = args[0];
		String instance = args[1];
		String database = "";
		String user = args[2];
		String password = args[3];
		String datasetName = args[4];
		
		String spatialCol = "GEOMETRY";
	    String[] colNames = new String[] { "OBJECTID", "GEOMETRY" };
		String statsCol = "OBJECTID";

	    System.out.println("Testing layer " + datasetName);

		SeConnection conn = new SeConnection(server, instance, database, user, password);
		SeSqlConstruct construct = new SeSqlConstruct(datasetName);

	    SeQueryInfo queryInfo = new SeQueryInfo();
		queryInfo.setColumns(colNames);
	    queryInfo.setConstruct(construct);

	    // ---- create spatial filter
	    SeLayer seLayer = new SeLayer(conn, datasetName, spatialCol);
	    SeCoordinateReference cr = seLayer.getCoordRef();
	    SeShape shape = new SeShape(cr);
	    SeExtent extent = new SeExtent(1382000, 573000, 1399000, 591000);
	    shape.generateRectangle(extent);
	    SeFilter filter = new SeShapeFilter(datasetName, spatialCol, shape, SeFilter.METHOD_ENVP);

	    
	    System.out.print("Fetching table stats...          ");
	    SeQuery queryStat = new SeQuery(conn);
	    boolean useSpatialFilter = true;
	    queryStat.setSpatialConstraints(SeQuery.SE_OPTIMIZE, useSpatialFilter, new SeFilter[] { filter } );
	    long startTime = System.currentTimeMillis();
		SeTable.SeTableStats tableStats = queryStat.calculateTableStatistics(statsCol,
	            SeTable.SeTableStats.SE_COUNT_STATS, queryInfo, 0);
		long endTime = System.currentTimeMillis();
	    int statsCount = tableStats.getCount();
	    System.out.println("Row count = " + statsCount
	    		+ "  ----  " + (endTime -startTime )/1000.0 + " s");
	    queryStat.close();

	    System.out.print("Querying data...                 ");
		SeQuery queryData = new SeQuery(conn);
		queryData.prepareQueryInfo(queryInfo);
		queryData.setSpatialConstraints(SeQuery.SE_OPTIMIZE, false,	new SeFilter[] { filter });
		startTime = System.currentTimeMillis();
		queryData.execute();
		int rowCount = 0;
		SeRow sdeRow;
		do {
			sdeRow = queryData.fetch();
			if (sdeRow == null) break;
			rowCount++;
		} while (sdeRow != null);
		endTime = System.currentTimeMillis();
	    System.out.println("Row count = " + rowCount
	    		+ "  ----  " + (endTime -startTime )/1000.0 + " s");

	    queryData.close();
	    conn.close();

	}

}
