ignitegridgain

Ignite QueryEntity Based Configuration for C++?


<bean class="org.apache.ignite.configuration.CacheConfiguration">
    <property name="name" value="mycache"/>
    <!-- Configure query entities -->
    <property name="queryEntities">
        <list>
            <bean class="org.apache.ignite.cache.QueryEntity">
                <!-- Setting indexed type's key class -->
                <property name="keyType" value="java.lang.Long"/>
              
                <!-- Setting indexed type's value class -->
                <property name="valueType"
                          value="org.apache.ignite.examples.Person"/>

                <!-- Defining fields that will be either indexed or queryable.
                Indexed fields are added to 'indexes' list below.-->
                <property name="fields">
                    <map>
                        <entry key="id" value="java.lang.Long"/>
                        <entry key="name" value="java.lang.String"/>
                        <entry key="salary" value="java.lang.Long "/>
                    </map>
                </property>

                <!-- Defining indexed fields.-->
                <property name="indexes">
                    <list>
                        <!-- Single field (aka. column) index -->
                        <bean class="org.apache.ignite.cache.QueryIndex">
                            <constructor-arg value="id"/>
                        </bean>
                      
                        <!-- Group index. -->
                        <bean class="org.apache.ignite.cache.QueryIndex">
                            <constructor-arg>
                                <list>
                                    <value>id</value>
                                    <value>salary</value>
                                </list>
                            </constructor-arg>
                            <constructor-arg value="SORTED"/>
                        </bean>
                    </list>
                </property>
            </bean>
        </list>
    </property>
</bean>

I understand the above XML configuration can be used to define an SQL entity in ignite with indexes. The documentation is better understandable from a code perspective either Java or NET because API is available. As we do most of the development C++ and API is not available , we would like to know few more details to use the XML configuration. Could anyone please answer below points?

1.Where does this configuration file can be used? Server side or client side (thin & thick) or both side.

2.Is it possible to change the field names, types and indexes once it has been created and loaded data in the same entity?#

3.<property name="valueType" value="org.apache.ignite.examples.Person"/> If not mistaken, we understand the value here is taken from a namespace and from a DLL (for example in c#) but How does ignite knows about the location of DLL or namespace to get load from? where does the binaries to be kept?

4.In the case of C++ , what binary file can be used to define the value type? .lib or .dll or some other way.


Solution

  • After few experiments, I found the solution and actually it is easy. The value given at the valueType property is directly mapped to the binary object name when it create from the code. for e.g below configuration

    <bean class="org.apache.ignite.configuration.CacheConfiguration">
                    <property name="name" value="TEST"/>
                    <property name="cacheMode" value="PARTITIONED"/>
                    <property name="atomicityMode" value="TRANSACTIONAL"/>
                    <property name="writeSynchronizationMode" value="FULL_SYNC"/>
    
                    <!-- Configure type metadata to enable queries. -->
                    <property name="queryEntities">
                        <list>
                            <bean class="org.apache.ignite.cache.QueryEntity">
    
                                <property name="keyType" value="java.lang.Long"/>
                                <property name="valueType" value="TEST"/>
    
                                <property name="fields">
                                    <map>
                                        <entry key="ID" value="java.lang.Long"/>
                                        <entry key="DATE" value="java.lang.String"/>                                        
                                    </map>
                                </property>
                            </bean>
                        </list>
                    </property>
                </bean>
    

    the below C++ code works

    template<>
            struct BinaryType<examples::TEST> : BinaryTypeDefaultAll<examples::TEST>
            {
                static void GetTypeName(std::string& dst)
                {
                    dst = "TEST";
                }
    
                static void Write(BinaryWriter& writer, const examples::RHO& obj)
                {
                    writer.WriteInt64("ID", obj.Id);
                    writer.WriteString("DATE", obj.dt);   
                }
    
                static void Read(BinaryReader& reader, examples::RHO& dst)
                {
                    dst.Id = reader.ReadInt64("Id");
                    dst.dt = reader.ReadString("dt");                
                }
            };