Hi,
    Your demo is different from my.Mine is an example of recursive,using "with 
as"function.My test demo is in the attachment.
package userlist;

import java.util.List;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.cache.CacheAtomicityMode;
import org.apache.ignite.cache.CacheMode;
import org.apache.ignite.cache.query.SqlFieldsQuery;
import org.apache.ignite.cache.query.annotations.QuerySqlField;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;

/**
 *
 */
public class JoinTest extends GridCommonAbstractTest {
    /** */
    private static final TcpDiscoveryIpFinder IP_FINDER = new 
TcpDiscoveryVmIpFinder(true);

    /** */
    private static final String DEFAULT_CACHE_NAME = "MYCACHE";

    /** */
    private static final int NODES_COUNT = 2;

    /** */
    private static final int CUSTOMER_COUNT = 23;

    /** */
    private static final int DETAILS_PER_CUSTOMER = 37;

    /** */
    private static String SQL = "with RECURSIVE children(typeId, pTypeId) AS ( 
"+
                                " SELECT typeId, pTypeId FROM ProcessDefTypePo 
WHERE pTypeId = ? "+
                                " UNION ALL "+
                                " SELECT ProcessDefTypePo.typeId, 
ProcessDefTypePo.pTypeId "+
                                " FROM children INNER JOIN ProcessDefTypePo ON 
children.typeId = ProcessDefTypePo.pTypeId "+
                                ") "+
        "select t1.typeId,t1.pTypeId,t1.typeName,t1.description, t2.typeName as 
pTypeName from ProcessDefTypePo t1 left join ProcessDefTypePo t2 on 
t1.pTypeId=t2.typeId where t1.typeId not in ( select typeId from children )";
    
    /** {@inheritDoc} */
    @Override protected IgniteConfiguration getConfiguration(String gridName) 
throws Exception {
        IgniteConfiguration cfg = super.getConfiguration(gridName);

        cfg.setPeerClassLoadingEnabled(false);

        TcpDiscoverySpi disco = new TcpDiscoverySpi();

        disco.setIpFinder(IP_FINDER);

        cfg.setDiscoverySpi(disco);

        return cfg;
    }

    /** {@inheritDoc} */
    @Override protected void beforeTestsStarted() throws Exception {
        startGridsMultiThreaded(NODES_COUNT, true);
    }

    /** {@inheritDoc} */
    @Override protected void afterTestsStopped() throws Exception {
        stopAllGrids();
    }

    /**
     * @param name Cache name.
     * @param idxTypes Indexed types.
     * @return Cache configuration.
     */
    private <K, V> CacheConfiguration<K, V> cacheConfig(String name, 
Class<?>... idxTypes) {
        return new CacheConfiguration<K, V>(DEFAULT_CACHE_NAME)
            .setName(name)
            .setCacheMode(CacheMode.PARTITIONED)
            .setAtomicityMode(CacheAtomicityMode.ATOMIC)
            .setBackups(1)
            .setIndexedTypes(idxTypes);
    }

    /** */
    public void testJoinQuery() throws Exception {
        CacheConfiguration<String, ProcessDefTypePo> ccfg1 = 
cacheConfig("processDefTypeCache", String.class, ProcessDefTypePo.class);

        final IgniteCache<String, ProcessDefTypePo> c1 = 
ignite(0).getOrCreateCache(ccfg1);

        try {
            populateDataIntoCaches(c1);

            final SqlFieldsQuery qry = new SqlFieldsQuery(SQL);

            qry.setDistributedJoins(true);

            assertEquals(CUSTOMER_COUNT,c1.query(qry).getAll().size());

            //
            Ignite client = startGrid("client", 
getConfiguration("client").setClientMode(true));
            IgniteCache<Object, Object> c = client.cache("processDefTypeCache");

            assertEquals(CUSTOMER_COUNT,c.query(qry).getAll().size());

        }
        finally {
            c1.destroy();
        }
    }

    /**
     * @param c1 Cache1.
     */
    private void populateDataIntoCaches(IgniteCache<String, ProcessDefTypePo> 
c1) {
        
        ProcessDefTypePo processDefTypePo=new ProcessDefTypePo();
        processDefTypePo.setTypeId("0");
        processDefTypePo.setPTypeId("-1");
        processDefTypePo.setTypeName(0);
        c1.put("0", processDefTypePo);
        
        for (int j = 1; j < 10; j++) {
            ProcessDefTypePo dtls = new ProcessDefTypePo();
            dtls.setTypeId(j);
            dtls.setPTypeId(j-1);
            dtls.setTypeName("" + j);

            c1.put(j, dtls);

        }
        
        
    }

    /**
     *
     */
    private static class ProcessDefTypePo {
        /** */
        @QuerySqlField(index = true)
        private String typeId;

        /** */
        @QuerySqlField(index = true)
        private String pTypeId;

                                @QuerySqlField
                                private String typeName;
        
                                public void setTypeId(String typeId) {
                                        this.typeId = typeId;
                                }
                                public String getTypeId(){
                                        return typeId;
                                }
                                public void setPTypeId(String pTypeId) {
                                        this.pTypeId = pTypeId;
                                }
                                public String getPTypeId(){
                                        return pTypeId;
                                }
                                public void setTypeName(String typeName) {
                                        this.typeName = typeName;
                                }
                                public String getTypeName(){
                                        return typeName;
                                }
    }    
}

Reply via email to