Hi, we have c++ ignite client and java client to read/write to the same
cache.
Our key is a composite object, my cache is IgniteCache<Key, Value>
-------c++ -------------------
namespace ignite
{
namespace binary
{
struct Key
{
std::string id;
bool flag;
Key()
: id() , flag(false)
{
}
Key(const std::string& id, bool flag = false)
: id(id)
, flag(flag)
{
}
Key(const Key& rhs)
: id(rhs.id)
, flag(rhs.flag)
{
}
bool operator<(const Key& rhs) const
{
return (id == rhs.id) ?
flag < rhs.flag : id < rhs.id;
}
bool operator==(const Key& rhs) const
{
return id == rhs.id && flag == rhs.flag;
}
bool operator!=(const Key& rhs) const
{
return !(*this == rhs);
}
~Key()
{
}
// METHODS
bool isEmpty() const { return id.empty(); }
};
template<>
struct BinaryType<Key>
{
static int32_t GetTypeId()
{
return GetBinaryStringHashCode("Key");
}
static void GetTypeName(native_std::string& dst)
{
dst = "Key";
}
static int32_t GetFieldId(const char* name)
{
return GetBinaryStringHashCode(name);
}
static bool IsNull(const Key& key)
{
return und.isEmpty();
}
static void GetNull(Key& key)
{
key = Key();
}
static void Write(BinaryWriter& writer, Key& key)
{
writer.WriteString("id", key.id);
writer.WriteBool("flag", key.flag);
}
static void Read(BinaryReader& reader, Key& key)
{
key.id = reader.ReadString("id");
key.flag = reader.ReadBool("flag");
}
int32_t GetHashCode(const Key& key) const
{
const int32_t prime = 31;
int32_t boolHashCode = key.is_delayed ? 1231 : 1237;
int32_t strHashCode = 0;
for (int i = 0; i < (int)key.bbgid.size(); ++i)
{
strHashCode = prime * strHashCode + key.bbgid[i];
}
return strHashCode + prime * boolHashCode;
}
};
}
}
Our java key is
-------------------------------------------------------------------
mport org.apache.ignite.binary.BinaryObjectException;
import org.apache.ignite.binary.BinaryReader;
import org.apache.ignite.binary.BinaryWriter;
import org.apache.ignite.binary.Binarylizable;
public class Key implements Binarylizable {
public String id;
public Boolean flag;
private final static int prime = 31;
public Key() {
//no-op
}
public Key(String id) {
this.id = id;
this.flag = false;
}
public Key(String id, boolean flag) {
this.id = id;
this.flag = flag;
}
@Override
public int hashCode() {
int boolHashCode = flag ? 1231 : 1237;
int strHashCode = 0;
for (int i = 0; i < id.length(); i++) {
strHashCode = prime * strHashCode + id.charAt(i);
}
return strHashCode + prime * boolHashCode;
}
@Override
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (!(o instanceof Key)) {
return false;
}
Key cast = (Key) o;
return this.id.equals(cast.id) && this.flag == cast.flag;
}
public void readBinary(BinaryReader reader) throws BinaryObjectException
{
id = reader.readString("id");
flag = reader.readBoolean("flag");
}
public void writeBinary(BinaryWriter writer) throws
BinaryObjectException {
writer.writeString("id", id);
writer.writeBoolean("flag", flag);
}
@Override public String toString() {
return "Key = [" + id + " " + flag + "]\n";
}
}
I see people put the GetHashCode in c++ BinaryType, some one use static,
and others just put it as a const method. This GetHashCode implements hash
code as java class Key. Where this GetHashCode is used ? Say if I write a
record from c++ client, is this key the cache hash key ? Do I also need to
implement hash in c++ class Key ? Is this GetHhashCode needed to be static ?
How does ignite ensure cross plat form read/write when key is not primitive
object (a composite object) ?
Thanks
--
Sent from: http://apache-ignite-users.70518.x6.nabble.com/