C++开发向导
1.SQL API
1.1.SqlFieldsQueries
SqlFieldsQuery
接受一个标准SQL作为其构造器的参数,下面是其执行查询的代码。可以只选定特定的字段,来最小化网络和序列化开销。
cpp
using namespace ignite;
using namespace cache;
IgniteConfiguration cfg;
Ignite grid = Ignition::Start(cfg);
Cache<int, Person> cache = grid.GetOrCreateCache<int, Person>("myCache");
SqlFieldsQuery qry(
"select concat(FirstName, ' ', LastName), Organization.Name "
"from Person, Organization where "
"Person.OrgId = Organization.Id and "
"Person.Salary > ?");
qry.AddArgument(1000);
QueryFieldsCursor cursor = cache.Query(qry);
// Iterate over results.
while (cursor.HasNext())
{
QueryFieldsRow row = cursor.GetNext();
std::cout << row.GetNext<std::string>() << " "
<< row.GetNext<std::string>() << std::endl;
}
cpp
using namespace ignite;
using namespace cache;
IgniteConfiguration cfg;
Ignite grid = Ignition::Start(cfg);
Cache<int, Person> cache = grid.GetOrCreateCache<int, Person>("myCache");
SqlFieldsQuery qry(
"select Person.name "
"from Person, \"orgCache\".Organization where "
"Person.orgId = Organization.id "
"and Organization.name = ?");
qry.AddArgument("Ignite");
QueryFieldsCursor cursor = cache.Query(qry);
// Iterate over results.
while (cursor.HasNext())
{
QueryFieldsRow row = cursor.GetNext();
std::cout << "Person name: " << row.GetNext<std::string>() << std::endl;
}
可查询字段定义
在特定字段可以被SqlFieldsQuery
访问之前,它们应做为SQL模式的一部分,使用标准的DDL命令,或者特定的.NET属性,或者QueryEntity
配置,都可以进行字段的定义。
通过SqlFieldsQuery
,还可以使用DML命令进行数据的修改:
cpp
cache.Query(SqlFieldsQuery("INSERT INTO Person(id, firstName, "
"lastName) values (1, 'John', 'Smith'), (5, 'Mary', 'Jones')"));
cpp
cache.Query(SqlFieldsQuery("MERGE INTO Person(id, firstName, lastName)"
"values (1, 'John', 'Smith'), (5, 'Mary', 'Jones')"));
cpp
cache.Query(SqlFieldsQuery(
"UPDATE Person set lastName = 'Jones' WHERE id >= 2");
cpp
cache.Query(SqlFieldsQuery("DELETE FROM Person WHERE id >= 2"));
2.模式和索引
除了常规的DDL命令,C++开发者还可以使用特定的SQL API进行模式和索引的定义。
2.1.基于QueryEntity的配置
索引和字段可以通过org.apache.ignite.cache.QueryEntity
进行配置,其使用基于Spring的XML配置,还是很方便的:
xml
<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">
<property name="keyType" value="java.lang.Long"/>
<property name="valueType" value="Person"/>
<property name="fields">
<map>
<entry key="id" value="java.lang.Long"/>
<entry key="orgId" value="java.lang.Long"/>
<entry key="firstName" value="java.lang.String"/>
<entry key="lastName" value="java.lang.String"/>
<entry key="resume" value="java.lang.String"/>
<entry key="salary" value="java.lang.Double"/>
</map>
</property>
<property name="indexes">
<list>
<bean class="org.apache.ignite.cache.QueryIndex">
<constructor-arg value="id"/>
</bean>
<bean class="org.apache.ignite.cache.QueryIndex">
<constructor-arg value="orgId"/>
</bean>
<bean class="org.apache.ignite.cache.QueryIndex">
<constructor-arg value="salary"/>
</bean>
</list>
</property>
</bean>
</list>
</property>
</bean>
运行时更新索引和可查询字段
如果需要在运行时管理索引或者使新的字段对SQL引擎可见,可以使用ALTER TABLE, CREATE/DROP INDEX命令。
2.2.自定义主键
如果主键只使用了预定义的SQL数据类型,则无需使用与模式相关的配置来执行其他操作。
预定义SQL数据类型
- 所有的有符号整形类型;
bool
;float
;double
;std::string
;ignite::Timestamp
;ignite::Date
;ignite::Guid
;int8_t[]
。
不过一旦决定引入自定义复杂主键并在DML语句中引用其字段,就必须在QueryEntity
配置中将QueryField.IsKeyField
设置为true
。
XML:
xml
<cacheConfiguration name="cars">
<queryEntities>
<queryEntity keyTypeName="CarKey" valueTypeName="Car">
<fields>
<queryField fieldType="System.String" fieldTypeName="java.lang.String" isKeyField="true" name="VIN" />
<queryField fieldType="System.Int32" fieldTypeName="java.lang.Integer" isKeyField="true" name="Id" />
<queryField fieldType="System.String" fieldTypeName="java.lang.String" name="Make" />
<queryField fieldType="System.Int32" fieldTypeName="java.lang.Integer" name="Year" />
</fields>
</queryEntity>
</queryEntities>
</cacheConfiguration>
18624049226