package org.kishore.backends.ignite;

import java.util.Collections;
import java.util.List;

import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
import org.apache.ignite.cache.CacheAtomicityMode;
import org.apache.ignite.cache.CacheWriteSynchronizationMode;
import org.apache.ignite.cache.query.QueryCursor;
import org.apache.ignite.cache.query.SqlFieldsQuery;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.DataRegionConfiguration;
import org.apache.ignite.configuration.DataStorageConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.configuration.TransactionConfiguration;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;

public class IgniteClient {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
			//System.getenv().put("IGNITE_HOME", "/scratch/rakishor/ignitepoc/asinst_2/OUD");
		
		 DataRegionConfiguration dr = new DataRegionConfiguration();
		    dr.setPersistenceEnabled(true);
		    DataStorageConfiguration ds = new DataStorageConfiguration();
		    ds.setDefaultDataRegionConfiguration(dr);
		    IgniteConfiguration serverConfig = new IgniteConfiguration()

		        .setIgniteInstanceName("nitin-instance")
		        .setDataStorageConfiguration(ds)
		        .setDiscoverySpi(
		            new TcpDiscoverySpi().setIpFinder(

		            new TcpDiscoveryVmIpFinder().setAddresses(Collections
		                .singleton("127.0.0.1:47500..47502"))

		            ));
		    serverConfig.setTransactionConfiguration(new TransactionConfiguration());
		    Ignite ignite = Ignition.start(serverConfig);
		    ignite.active(true);
		    // ALL caches are already created
		    CacheConfiguration<Long, Ignite_DSAttributeStore> cacheCfg =
		        new CacheConfiguration<>("Ignite_DSAttributeStore");

		    cacheCfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
		    cacheCfg.setBackups(1);
		    cacheCfg
		        .setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC);
		    cacheCfg.setIndexedTypes(Long.class, Ignite_DSAttributeStore.class);

		    IgniteCache<Long, Ignite_DSAttributeStore> cache = ignite
		        .getOrCreateCache(cacheCfg);
		    //this.cache = cache;
		    System.out.println(" cache set " +cache );
		    CacheConfiguration<Long, Ignite_DN> cacheCfgDN =
		        new CacheConfiguration<>("dn");

		    cacheCfgDN.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
		    cacheCfgDN.setBackups(1);
		    cacheCfgDN
		        .setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC);
		    cacheCfgDN.setIndexedTypes(Long.class, Ignite_DN.class);

		    IgniteCache<Long, Ignite_DN> cacheDN = ignite
		        .cache("dn");

		    System.out.println("cache "+cacheDN.get(10L).getRdn() );

		    
			 CacheConfiguration<Long, Ignite_ObjectClass> 
	         cacheCfgIndex = null;
	        cacheCfgIndex = new CacheConfiguration<>("objectclass");
	        cacheCfgIndex.setIndexedTypes(Long.class, Ignite_ObjectClass.class);
	        cacheCfgIndex.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
	        cacheCfgIndex.setBackups(1);
	        cacheCfgIndex
	          .setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC);
	        ignite.getOrCreateCache(cacheCfgIndex);
	        

	        // DATA is already pushed in from other client
		    String s = "SELECT st.entryID,st.attrName,st.attrValue, st.attrsType " 
		    		+ "FROM \"Ignite_DSAttributeStore\".IGNITE_DSATTRIBUTESTORE st "
		    		+"INNER JOIN \"dn\".Ignite_DN dn "
		    		+" ON dn.entryID = st.entryID "
		    		+" INNER JOIN \"objectclass\".IGNITE_OBJECTCLASS at1 "
		    		+" ON dn.entryID = at1.entryID "
		    		+" WHERE (at1.attrValue = 'subentry' OR at1.attrValue = 'ldapsubentry') AND "
		    		+ "( dn.parentDN like 'dc=ignite,%' OR   ( dn.rdn='dc=ignite' and dn.parentDN=',' ) )"
		    		+"  AND st.attrKind IN ('u','o') order by st.entryID ";
		    
		    QueryCursor<List<?>> topMostEntry = cacheDN.query(new SqlFieldsQuery(
			        s));
					// this gets stuck
		    List<List<?>> lst =  topMostEntry.getAll();
			// no output , system hangs
			    System.out.println(" done "+lst);
	}

}
