package org.apache.ignite.examples.local_tests.sb;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashMap;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteBinary;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
import org.apache.ignite.binary.BinaryObject;
import org.apache.ignite.binary.BinaryObjectBuilder;
import org.apache.ignite.cache.QueryEntity;
import org.apache.ignite.cache.QueryIndex;
import org.apache.ignite.cache.query.SqlFieldsQuery;
import org.apache.ignite.cache.query.annotations.QuerySqlFunction;
import org.apache.ignite.configuration.CacheConfiguration;

/**
 * Created by dmagda on 5/18/16.
 */
public class ObjectQuery {
    public static void main(String[] args) {
        try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {

            CacheConfiguration cfg = new CacheConfiguration("PPRB_PARAMS");

            cfg.setSqlFunctionClasses(new Class[]{ParamsComparator.class});

            QueryEntity queryEntity = new QueryEntity();

            queryEntity.setValueType("Params");
            queryEntity.setKeyType("java.lang.Long");

            LinkedHashMap<String, String> fields = new LinkedHashMap<>();

            fields.put("PARAMETRID", "java.lang.Long");
            fields.put("CLIENTID", "java.lang.Long");
            fields.put("PARAMETRCODE", "java.lang.Long");
            fields.put("PARAMETRVALUE", "java.lang.Object");

            queryEntity.setFields(fields);

            Collection<QueryIndex> indexes = new ArrayList<>(2);

            indexes.add(new QueryIndex("CLIENTID", true));
            indexes.add(new QueryIndex("PARAMETRID", true));

            queryEntity.setIndexes(indexes);

            cfg.setQueryEntities(Arrays.asList(queryEntity));

            IgniteCache<Long, BinaryObject> cache = ignite.getOrCreateCache(cfg).withKeepBinary();

            IgniteBinary binary = ignite.binary();

            for (int i = 0; i < 100; i++) {
                BinaryObjectBuilder builder = binary.builder("Params");

                builder.setField("PARAMETRID", (long)i);
                builder.setField("CLIENTID", (long)(i % 2 == 0 ? 1 : 2));
                builder.setField("PARAMETRCODE", (long)2);
                builder.setField("PARAMETRVALUE", i % 2 == 0 ? String.valueOf(i) : (long)i, Object.class);

                cache.put((long)i, builder.build());
            }

            performQuery(cache, (long)23);
            performQuery(cache, "10");
        }
    }

    private static void performQuery(IgniteCache cache, Object paramValue) {
        SqlFieldsQuery query;

        if (paramValue instanceof Long) {
            query = new SqlFieldsQuery("SELECT * FROM Params WHERE CLIENTID = 2 AND" +
                " compareLongParam(PARAMETRVALUE, ?)").setArgs(paramValue);
        }
        else if (paramValue instanceof String) {
            query = new SqlFieldsQuery("SELECT * FROM Params WHERE CLIENTID = 1 AND" +
                " compareStringParam(PARAMETRVALUE, ?)").setArgs(paramValue);
        }
        else
            throw new RuntimeException("Unknown param type");

        System.out.println("res = " + cache.query(query).getAll());
    }

}