I am crossposting this from StackOverflow.
I noticed that when I query a cache which was created with a custom cache
template and include the cache's affinity key in the WHERE clause, no
results are returned.
I am running Ignite 2.5 with the following configuration:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="grid.cfg"
class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="cacheConfiguration">
<list>
<bean id="cache-template-bean" abstract="true"
class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="myCacheTemplate*"/>
<property name="cacheMode" value="PARTITIONED" />
</bean>
</list>
</property>
</bean>
</beans>
And here is my test code. The code creates 3 caches. The first one is a
"root" cache which defines colocation for the others. The other two are
caches colocated by the root's key. The first colocated cache
(colocated_default) uses the PARTITIONED template and works as expected. The
second (colocated_custom) uses the "myCacheTemplate" created in the above
configuration. I insert one cache entry into each cache, where the entries
in the colocated cache have an affinity key equal to the root cache entry's
key.
I then query the caches. I first run a query to ensure there is one entry in
each cache. Then I run a query where the affinity key is equal to value
inserted. The results for me show that I am able to select from by affinity
from both of the PARTITIONED caches, but get no results for the
"colocated_custom" cache. Here is the code:
/**
* Test which shows that creating a cache with a custom cache
configuration template doesn't allow
* for SQL queries to use an affinity key in the WHERE clause.
*/
public class App {
public static void main(String[] args) {
// Start Ignite.
Ignition.setClientMode(true);
final Ignite ignite = Ignition.start(new IgniteConfiguration());
// Create caches. Create a root entity, and two entities which are
colocated by the root's ID.
// One uses the custom cache template and one just uses the
PARTITIONED template.
final List<StringBuilder> createTableStringBuilders = new
ArrayList<>();
final StringBuilder createRoot = new StringBuilder();
createRoot.append("CREATE TABLE IF NOT EXISTS root (\n");
createRoot.append(" \"key\" VARCHAR(24) NOT NULL,\n");
createRoot.append(" \"data\" VARCHAR(100),\n");
createRoot.append(" PRIMARY KEY(\"key\"))\n");
createRoot.append(
"WITH \"template=PARTITIONED, affinity_key=key,
cache_name=root, value_type=root\";");
createTableStringBuilders.add(createRoot);
final StringBuilder createColocatedDefault = new StringBuilder();
createColocatedDefault.append("CREATE TABLE IF NOT EXISTS
colocated_default (\n");
createColocatedDefault.append(" \"root_key\" VARCHAR(24) NOT
NULL,\n");
createColocatedDefault.append(" \"key\" VARCHAR(24) NOT
NULL,\n");
createColocatedDefault.append(" \"data\" VARCHAR(100),\n");
createColocatedDefault.append(" PRIMARY KEY(\"root_key\",
\"key\"))\n");
createColocatedDefault.append(
"WITH \"template=PARTITIONED, affinity_key=root_key,
cache_name=colocated_default, key_type=colocated_default_key,
value_type=colocated_default\";");
createTableStringBuilders.add(createColocatedDefault);
final StringBuilder createColocatedCustom = new StringBuilder();
createColocatedCustom.append("CREATE TABLE IF NOT EXISTS
colocated_custom (\n");
createColocatedCustom.append(" \"root_key\" VARCHAR(24) NOT
NULL,\n");
createColocatedCustom.append(" \"key\" VARCHAR(24) NOT NULL,\n");
createColocatedCustom.append(" \"data\" VARCHAR(100),\n");
createColocatedCustom.append(" PRIMARY KEY(\"root_key\",
\"key\"))\n");
createColocatedCustom.append(
"WITH \"template=myCacheTemplate, affinity_key=root_key,
cache_name=colocated_custom, key_type=colocated_custom_key,
value_type=colocated_custom\";");
createTableStringBuilders.add(createColocatedCustom);
try (Connection connection =
DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1:10800"))
{
for (final StringBuilder createTableStringBuilder :
createTableStringBuilders) {
try (PreparedStatement createTableStatement =
connection.prepareStatement(createTableStringBuilder.toString()))
{
System.out.println(createTableStringBuilder.toString());
createTableStatement.execute();
System.out.println();
}
}
}
catch (final SQLException e) {
throw new AssertionError(e);
}
// Create the root entity.
final BinaryObject root1 = ignite.binary().builder("root")
.setField("key", "1")
.setField("data", "Data for 1")
.build();
ignite.cache("root").withKeepBinary().put("1", root1);
// Create the colocated entity which uses the PARTITIONED
template.
final BinaryObject colocatedDefault1 =
ignite.binary().builder("colocated_default")
.setField("root_key", "1")
.setField("key", "2")
.build();
final BinaryObject colocatedDefault1Key =
ignite.binary().builder("colocated_default_key")
.setField("root_key", "1")
.setField("key", "2")
.build();
ignite.cache("colocated_default").withKeepBinary().put(colocatedDefault1Key,
colocatedDefault1);
// Create the colocated entity which uses the custom template.
final BinaryObject colocatedCustom1 =
ignite.binary().builder("colocated_custom")
.setField("root_key", "1")
.setField("key", "3")
.build();
final BinaryObject colocatedCustom1Key =
ignite.binary().builder("colocated_custom_key")
.setField("root_key", "1")
.setField("key", "3")
.build();
ignite.cache("colocated_custom").withKeepBinary().put(colocatedCustom1Key,
colocatedCustom1);
// SELECT COUNT(*) on all caches to ensure data exists.
final List<String> selectAllStrings = new ArrayList<>();
selectAllStrings.add("SELECT COUNT(*) FROM root;");
selectAllStrings.add("SELECT COUNT(*) FROM colocated_default;");
selectAllStrings.add("SELECT COUNT(*) FROM colocated_custom;");
try (Connection connection =
DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1:10800"))
{
for (final String selectAllString : selectAllStrings) {
try (PreparedStatement selectAllStatement =
connection.prepareStatement(selectAllString))
{
System.out.println(selectAllString);
selectAllStatement.execute();
final ResultSet resultSet =
selectAllStatement.getResultSet();
resultSet.next();
System.out.println(resultSet.getInt(1));
System.out.println();
}
}
}
catch (final SQLException e) {
throw new AssertionError(e);
}
// SELECT COUNT(*) with affinity key in WHERE clause.
final List<String> selectWhereStrings = new ArrayList<>();
// Returns 1.
selectWhereStrings.add("SELECT COUNT(*) FROM root WHERE \"key\" =
'1';");
// Returns 1.
selectWhereStrings.add("SELECT COUNT(*) FROM colocated_default
WHERE \"root_key\" = '1';");
// Returns 0.
selectWhereStrings.add("SELECT COUNT(*) FROM colocated_custom
WHERE \"root_key\" = '1';");
try (Connection connection =
DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1:10800"))
{
for (final String selectWhereString : selectWhereStrings) {
try (PreparedStatement selectWhereStatement =
connection.prepareStatement(selectWhereString))
{
System.out.println(selectWhereString);
selectWhereStatement.execute();
final ResultSet resultSet =
selectWhereStatement.getResultSet();
resultSet.next();
System.out.println(resultSet.getInt(1));
System.out.println();
}
}
}
catch (final SQLException e) {
throw new AssertionError(e);
}
}
}
I would like to know if this is a misconfiguration on my part, or a bug in
Ignite.
--
Sent from: http://apache-ignite-users.70518.x6.nabble.com/