RE: affinity key field not recognized c++

2018-08-09 Thread Floris Van Nee
Ah thank you very much! That indeed fixes the problem. All the examples I could 
find had the full name specified there and since the classNames property were 
also full names, I never thought of changing this to the simple name. 
Apparently putting the full name there, triggers this strange behavior that the 
C++ code wants to send an updated type metadata to the Java code, causing this 
null error.

Thanks a lot again for the help!

-Floris

From: Ilya Kasnacheev [mailto:ilya.kasnach...@gmail.com]
Sent: Thursday 09 August 2018 4:48 PM
To: user@ignite.apache.org
Subject: Re: affinity key field not recognized c++ [External]

Hello!

I am pretty confident that affinity key configuration is supported by C++.

There is one error in your configation file: you are using Simple Mapper, but 
still specify package of class in question. This causes weird behavior on 
Ignite side, but is trivial to fix:






After that, I am able to put both MicFc and MicFc-typed BinaryObjects into 
cache, read them in C++ code using the snippet that you have specified.

There is no need of explicit support of Affinity from C++ code side in this 
case as it is handled purely from Java side.

Hope this helps,

--
Ilya Kasnacheev

2018-08-09 16:22 GMT+03:00 Floris Van Nee 
mailto:florisvan...@optiver.com>>:
Just an update.. Affinity key is indeed *not* supported in C++ at the moment. 
By digging into the C++ source I found the following..

core/src/impl/binary/binary_type_updater_impl.cpp
line 78:
rawWriter.WriteString(0); // Affinity key is not supported for now.

It just always passes in a null value for affinity key.. This obviously leads 
to the error I saw, because on the Java side it tries to merge its valid 
affinity key with the null value passed from the C++ code.

Does anyone know if it is on the planning to fix this? It is quite a vital 
thing to be able to choose a different mapping for your keys..

-Floris

From: Floris Van Nee
Sent: Thursday 09 August 2018 11:26 AM
To: user@ignite.apache.org<mailto:user@ignite.apache.org>
Subject: RE: affinity key field not recognized c++ [External]

Thanks for your reply. It is indeed the case that both Java and C++ 
configuration files are the same, and the AffinityKeyMapped annotation is not 
used in the Java declaration. Still, it is throwing an error.
I have attached here a minimal reproducing example.

My Java key class is the following:

public class MicFc implements Binarylizable, Comparable {
public String market;
public String feedcode;

@Override
public int compareTo(MicFc t) {
int m = market.compareTo(t.market);
return m == 0 ? feedcode.compareTo(t.feedcode) : m;
}

@Override
public void readBinary(BinaryReader reader) throws 
BinaryObjectException {
market = reader.readString("market");
feedcode = reader.readString("feedcode");
}

@Override
public void writeBinary(BinaryWriter writer) throws 
BinaryObjectException {
writer.writeString("market", market);
writer.writeString("feedcode", feedcode);
}
}

My configuration file (the same everywhere):































org.apache.ignite.examples.streaming.MicFc





And my C++ key class:
namespace
{
class MicFc
{
public:
std::string market, feedcode;
};
}
namespace ignite
{
namespace binary
{
IGNITE_BINARY_TYPE_START(MicFc)
IGNITE_BINARY_GET_TYPE_ID_AS_HASH(MicFc)
IGNITE_BINARY_GET_TYPE_NAME_AS_IS(MicFc)
IGNITE_BINARY_GET_FIELD_ID_AS_HASH
IGNITE_BINARY_IS_NULL_FALSE(MicFc)
IGNITE_BINARY_GET_NULL_DEFAULT_CTOR(MicFc)

static void Write(BinaryWriter& writer, const MicFc& obj)
{
writer.WriteString("market", obj.market);
writer.WriteString("feedcode", obj.feedcode);
}

static void Read(BinaryReader& reader, MicFc& dst)
{
dst.market = reader.ReadStri

Re: affinity key field not recognized c++

2018-08-09 Thread Ilya Kasnacheev
Hello!

I am pretty confident that affinity key configuration is supported by C++.

There is one error in your configation file: you are using Simple Mapper,
but still specify package of class in question. This causes weird behavior
on Ignite side, but is trivial to fix:






After that, I am able to put both MicFc and MicFc-typed BinaryObjects into
cache, read them in C++ code using the snippet that you have specified.

There is no need of explicit support of Affinity from C++ code side in this
case as it is handled purely from Java side.

Hope this helps,

-- 
Ilya Kasnacheev

2018-08-09 16:22 GMT+03:00 Floris Van Nee :

> Just an update.. Affinity key is indeed **not** supported in C++ at the
> moment. By digging into the C++ source I found the following..
>
>
>
> core/src/impl/binary/binary_type_updater_impl.cpp
>
> line 78:
>
> rawWriter.WriteString(0); // Affinity key is not supported for now.
>
>
>
> It just always passes in a null value for affinity key.. This obviously
> leads to the error I saw, because on the Java side it tries to merge its
> valid affinity key with the null value passed from the C++ code.
>
>
>
> Does anyone know if it is on the planning to fix this? It is quite a vital
> thing to be able to choose a different mapping for your keys..
>
>
>
> -Floris
>
>
>
> *From:* Floris Van Nee
> *Sent:* Thursday 09 August 2018 11:26 AM
> *To:* user@ignite.apache.org
> *Subject:* RE: affinity key field not recognized c++ [External]
>
>
>
> Thanks for your reply. It is indeed the case that both Java and C++
> configuration files are the same, and the AffinityKeyMapped annotation is
> not used in the Java declaration. Still, it is throwing an error.
>
> I have attached here a minimal reproducing example.
>
>
>
> My Java key class is the following:
>
>
>
> public class MicFc implements Binarylizable, Comparable {
>
> public String market;
>
> public String feedcode;
>
>
>
> @Override
>
> public int compareTo(MicFc t) {
>
> int m = market.compareTo(t.market);
>
> return m == 0 ? feedcode.compareTo(t.feedcode) : m;
>
> }
>
>
>
> @Override
>
> public void readBinary(BinaryReader reader) throws
> BinaryObjectException {
>
> market = reader.readString("market");
>
> feedcode = reader.readString("feedcode");
>
> }
>
>
>
> @Override
>
> public void writeBinary(BinaryWriter writer) throws
> BinaryObjectException {
>
> writer.writeString("market", market);
>
> writer.writeString("feedcode", feedcode);
>
> }
>
> }
>
>
>
> My configuration file (the same everywhere):
>
>
>
> 
>
> 
>
>  class="org.apache.ignite.cache.CacheKeyConfiguration">
>
>
> 
>
>
>
> 
>
> 
>
> 
>
> 
>
>
>
> 
>
> 
>
> 
>
>
>
> 
>
> 
>
> 
>
> 
>
> 
>
>
>
> 
>
> 
>
> 
>
> 
>
> 
>
>
>
> 
>
> 
>
> org.apache.ignite.
> examples.streaming.MicFc
>
> 
>
> 
>
> 
>
> 
>
>
>
> And my C++ key class:
>
> namespace
>
> {
>
> class MicFc
>
> {
>
> public:
>
> std::string market, feedcode;
>
> };
>
> }
>
> namespace ignite
>
> {
>
> namespace binary
>
> {
>
> IGNITE_BINARY_TYPE_START(MicFc)
>
> IGNITE_BINARY_GET_TYPE_ID_AS_HASH(MicFc)
>
> IGNITE_BINARY_GET_TYPE_NAME_AS_IS(MicFc)
>
> IGNITE_BINARY_GET_FIELD_ID_AS_HASH
>
> IGNITE_BINARY_IS_NULL_FALSE(MicFc)
>
> IGNITE_BINARY_GET_NULL_DEFAULT_CTOR(MicFc)
>
>
>
> static void Write(BinaryWriter& writer, const MicFc& obj)
>
> {
>
> writer.WriteString("market", obj.market);
>
>  

RE: affinity key field not recognized c++

2018-08-09 Thread Floris Van Nee
Just an update.. Affinity key is indeed *not* supported in C++ at the moment. 
By digging into the C++ source I found the following..

core/src/impl/binary/binary_type_updater_impl.cpp
line 78:
rawWriter.WriteString(0); // Affinity key is not supported for now.

It just always passes in a null value for affinity key.. This obviously leads 
to the error I saw, because on the Java side it tries to merge its valid 
affinity key with the null value passed from the C++ code.

Does anyone know if it is on the planning to fix this? It is quite a vital 
thing to be able to choose a different mapping for your keys..

-Floris

From: Floris Van Nee
Sent: Thursday 09 August 2018 11:26 AM
To: user@ignite.apache.org
Subject: RE: affinity key field not recognized c++ [External]

Thanks for your reply. It is indeed the case that both Java and C++ 
configuration files are the same, and the AffinityKeyMapped annotation is not 
used in the Java declaration. Still, it is throwing an error.
I have attached here a minimal reproducing example.

My Java key class is the following:

public class MicFc implements Binarylizable, Comparable {
public String market;
public String feedcode;

@Override
public int compareTo(MicFc t) {
int m = market.compareTo(t.market);
return m == 0 ? feedcode.compareTo(t.feedcode) : m;
}

@Override
public void readBinary(BinaryReader reader) throws 
BinaryObjectException {
market = reader.readString("market");
feedcode = reader.readString("feedcode");
}

@Override
public void writeBinary(BinaryWriter writer) throws 
BinaryObjectException {
writer.writeString("market", market);
writer.writeString("feedcode", feedcode);
}
}

My configuration file (the same everywhere):































org.apache.ignite.examples.streaming.MicFc





And my C++ key class:
namespace
{
class MicFc
{
public:
std::string market, feedcode;
};
}
namespace ignite
{
namespace binary
{
IGNITE_BINARY_TYPE_START(MicFc)
IGNITE_BINARY_GET_TYPE_ID_AS_HASH(MicFc)
IGNITE_BINARY_GET_TYPE_NAME_AS_IS(MicFc)
IGNITE_BINARY_GET_FIELD_ID_AS_HASH
IGNITE_BINARY_IS_NULL_FALSE(MicFc)
IGNITE_BINARY_GET_NULL_DEFAULT_CTOR(MicFc)

static void Write(BinaryWriter& writer, const MicFc& obj)
{
writer.WriteString("market", obj.market);
writer.WriteString("feedcode", obj.feedcode);
}

static void Read(BinaryReader& reader, MicFc& dst)
{
dst.market = reader.ReadString("market");
dst.feedcode = reader.ReadString("feedcode");
}

IGNITE_BINARY_TYPE_END
}
}

To reproduce the error, first start a server with the config mentioned above 
and then run a C++ client with the same config (except for setting  
clientMode=true) and then run the following code:
MicFc mfc;
mfc.market = “TEST”;
mfc.feedcode=”TEST”;
auto c = ignite.GetOrCreateCache("test");
auto contains = c.ContainsKey(mfc); // this line throws the error
Java exception occurred [cls=org.apache.ignite.binary.BinaryObjectException, 
msg=Binary type has different affinity key fields [typeName=MicFc, 
affKeyFieldName1=market, affKeyFieldName2=null]]

-Floris

From: Ilya Kasnacheev [mailto:ilya.kasnach...@gmail.com]
Sent: Thursday 09 August 2018 11:09 AM
To: user@ignite.apache.org<mailto:user@ignite.apache.org>
Subject: Re: affinity key field not recognized c++ [External]

Hello!

As far as my understanding goes, you have to supply cacheKeyConfiguration in 
both Java and C++ configuration files, and remove @AffinityKeyMapped from Java 
CustomKey class (or other ways of specifying it where applicable).

Regards,

--
Ilya Kasnacheev

2018-08-09 10:50 GMT+03:00 Floris Van Nee 
mailto:florisvan...@optiver.com>>:
Hi all,

I’m experiencing exactly the same issue as is described in a pre

RE: affinity key field not recognized c++

2018-08-09 Thread Floris Van Nee
Thanks for your reply. It is indeed the case that both Java and C++ 
configuration files are the same, and the AffinityKeyMapped annotation is not 
used in the Java declaration. Still, it is throwing an error.
I have attached here a minimal reproducing example.

My Java key class is the following:

public class MicFc implements Binarylizable, Comparable {
public String market;
public String feedcode;

@Override
public int compareTo(MicFc t) {
int m = market.compareTo(t.market);
return m == 0 ? feedcode.compareTo(t.feedcode) : m;
}

@Override
public void readBinary(BinaryReader reader) throws 
BinaryObjectException {
market = reader.readString("market");
feedcode = reader.readString("feedcode");
}

@Override
public void writeBinary(BinaryWriter writer) throws 
BinaryObjectException {
writer.writeString("market", market);
writer.writeString("feedcode", feedcode);
}
}

My configuration file (the same everywhere):































org.apache.ignite.examples.streaming.MicFc





And my C++ key class:
namespace
{
class MicFc
{
public:
std::string market, feedcode;
};
}
namespace ignite
{
namespace binary
{
IGNITE_BINARY_TYPE_START(MicFc)
IGNITE_BINARY_GET_TYPE_ID_AS_HASH(MicFc)
IGNITE_BINARY_GET_TYPE_NAME_AS_IS(MicFc)
IGNITE_BINARY_GET_FIELD_ID_AS_HASH
IGNITE_BINARY_IS_NULL_FALSE(MicFc)
IGNITE_BINARY_GET_NULL_DEFAULT_CTOR(MicFc)

static void Write(BinaryWriter& writer, const MicFc& obj)
{
writer.WriteString("market", obj.market);
writer.WriteString("feedcode", obj.feedcode);
}

static void Read(BinaryReader& reader, MicFc& dst)
{
dst.market = reader.ReadString("market");
dst.feedcode = reader.ReadString("feedcode");
}

IGNITE_BINARY_TYPE_END
}
}

To reproduce the error, first start a server with the config mentioned above 
and then run a C++ client with the same config (except for setting  
clientMode=true) and then run the following code:
MicFc mfc;
mfc.market = “TEST”;
mfc.feedcode=”TEST”;
auto c = ignite.GetOrCreateCache("test");
auto contains = c.ContainsKey(mfc); // this line throws the error
Java exception occurred [cls=org.apache.ignite.binary.BinaryObjectException, 
msg=Binary type has different affinity key fields [typeName=MicFc, 
affKeyFieldName1=market, affKeyFieldName2=null]]

-Floris

From: Ilya Kasnacheev [mailto:ilya.kasnach...@gmail.com]
Sent: Thursday 09 August 2018 11:09 AM
To: user@ignite.apache.org
Subject: Re: affinity key field not recognized c++ [External]

Hello!

As far as my understanding goes, you have to supply cacheKeyConfiguration in 
both Java and C++ configuration files, and remove @AffinityKeyMapped from Java 
CustomKey class (or other ways of specifying it where applicable).

Regards,

--
Ilya Kasnacheev

2018-08-09 10:50 GMT+03:00 Floris Van Nee 
mailto:florisvan...@optiver.com>>:
Hi all,

I’m experiencing exactly the same issue as is described in a previous post on 
this mailing list: 
http://apache-ignite-users.70518.x6.nabble.com/Affinity-Key-field-is-not-identified-if-binary-configuration-is-used-on-cache-key-object-td15959.html
In short – defining an XML config with the appropriate binaryConfiguration (for 
Java/C++ interopability) and cacheKeyConfiguration (to define an 
affinityKeyFieldName for a certain key type) will fail when running from C++. 
Unfortunately, the earlier item on the mailing list didn’t find/post a solution 
to the problem.

My custom key type is a class with two String members. I get the following 
error when I try to retrieve something from the cache:

An error occurred: Java exception occurred 
[cls=org.apache.ignite.binary.BinaryObjectException, msg=Binary type has 
different affinity key fields [typeName=CustomKey, 

Re: affinity key field not recognized c++

2018-08-09 Thread Ilya Kasnacheev
Hello!

As far as my understanding goes, you have to supply cacheKeyConfiguration
in both Java and C++ configuration files, and remove @AffinityKeyMapped
from Java CustomKey class (or other ways of specifying it where applicable).

Regards,

-- 
Ilya Kasnacheev

2018-08-09 10:50 GMT+03:00 Floris Van Nee :

> Hi all,
>
>
>
> I’m experiencing exactly the same issue as is described in a previous post
> on this mailing list: http://apache-ignite-users.
> 70518.x6.nabble.com/Affinity-Key-field-is-not-identified-
> if-binary-configuration-is-used-on-cache-key-object-td15959.html
>
> In short – defining an XML config with the appropriate binaryConfiguration
> (for Java/C++ interopability) and cacheKeyConfiguration (to define an
> affinityKeyFieldName for a certain key type) will fail when running from
> C++. Unfortunately, the earlier item on the mailing list didn’t find/post a
> solution to the problem.
>
>
>
> My custom key type is a class with two String members. I get the following
> error when I try to retrieve something from the cache:
>
>
>
> An error occurred: Java exception occurred 
> [cls=org.apache.ignite.binary.BinaryObjectException,
> msg=Binary type has different affinity key fields [typeName=CustomKey,
> affKeyFieldName1=string_1, affKeyFieldName2=null]]
>
>
>
> Running exactly the same from Java works fine. Also, when I remove the
> cacheKeyConfiguration part from the XML, it runs fine in both Java and C++
> (but then this runs without the proper affinity key field of course).
>
>
>
> It seems like this is a bug, or am I missing something?
>
>
>
> -Floris
>
>
>


affinity key field not recognized c++

2018-08-09 Thread Floris Van Nee
Hi all,

I'm experiencing exactly the same issue as is described in a previous post on 
this mailing list: 
http://apache-ignite-users.70518.x6.nabble.com/Affinity-Key-field-is-not-identified-if-binary-configuration-is-used-on-cache-key-object-td15959.html
In short - defining an XML config with the appropriate binaryConfiguration (for 
Java/C++ interopability) and cacheKeyConfiguration (to define an 
affinityKeyFieldName for a certain key type) will fail when running from C++. 
Unfortunately, the earlier item on the mailing list didn't find/post a solution 
to the problem.

My custom key type is a class with two String members. I get the following 
error when I try to retrieve something from the cache:

An error occurred: Java exception occurred 
[cls=org.apache.ignite.binary.BinaryObjectException, msg=Binary type has 
different affinity key fields [typeName=CustomKey, affKeyFieldName1=string_1, 
affKeyFieldName2=null]]

Running exactly the same from Java works fine. Also, when I remove the 
cacheKeyConfiguration part from the XML, it runs fine in both Java and C++ (but 
then this runs without the proper affinity key field of course).

It seems like this is a bug, or am I missing something?

-Floris