Store objects as IBinaryobject in cadche

classic Classic list List threaded Threaded
13 messages Options
Manan Joshi Manan Joshi
Reply | Threaded
Open this post in threaded view
|

Store objects as IBinaryobject in cadche

I would like to store any time of object into cache as IBinaryobject, so i can store cache stored in loosely bind with object. I am working with Ignite .Net. Can someone please suggest something.

I need something like
MyObject obj = new MyObject();

 obj.setFieldA("A");
 obj.setFieldB(123);

 BinaryObject binaryObj = Ignition.ignite().binary().toBinary(obj);

Thanks
Manan Joshi
ilya.kasnacheev ilya.kasnacheev
Reply | Threaded
Open this post in threaded view
|

Re: Store objects as IBinaryobject in cadche

Hello!

You can use BinaryObjectBuilder:

However, each variation of its composition is stored in schema cache, which means you should not have too many of those.

It is recommended to use Map to store all variable/non-essential fields if you have a lot of them.

Regards,
--
Ilya Kasnacheev


пт, 15 нояб. 2019 г. в 16:08, Manan Joshi <[hidden email]>:
I would like to store any time of object into cache as IBinaryobject, so i can store cache stored in loosely bind with object. I am working with Ignite .Net. Can someone please suggest something.

I need something like
MyObject obj = new MyObject();

 obj.setFieldA("A");
 obj.setFieldB(123);

 BinaryObject binaryObj = Ignition.ignite().binary().toBinary(obj);

Thanks
Manan Joshi
Alexandr Shapkin Alexandr Shapkin
Reply | Threaded
Open this post in threaded view
|

RE: Re: Store objects as IBinaryobject in cadche

You can also refer to the BinaryModeExample.cs example and the docs [1]

 

[1] - https://apacheignite-net.readme.io/docs/binary-mode#section-creating-binary-objects

 

From: [hidden email]
Sent: Friday, November 15, 2019 4:13 PM
To: [hidden email]
Subject: Re: Store objects as IBinaryobject in cadche

 

Hello!

 

You can use BinaryObjectBuilder:

 

However, each variation of its composition is stored in schema cache, which means you should not have too many of those.

 

It is recommended to use Map to store all variable/non-essential fields if you have a lot of them.

 

Regards,

--

Ilya Kasnacheev

 

 

пт, 15 нояб. 2019 г. в 16:08, Manan Joshi <[hidden email]>:

I would like to store any time of object into cache as IBinaryobject, so i can store cache stored in loosely bind with object. I am working with Ignite .Net. Can someone please suggest something.

 

I need something like

MyObject obj = new MyObject();
 
 obj.setFieldA("A");
 obj.setFieldB(123);
 
 BinaryObject binaryObj = Ignition.ignite().binary().toBinary(obj);

 

Thanks

Manan Joshi

 

Alex Shapkin
Manan Joshi Manan Joshi
Reply | Threaded
Open this post in threaded view
|

Re: Re: Store objects as IBinaryobject in cadche

I am reading the data using dapper from the database i am not sure how to convert fromSystem.Collections.Generic.IEnumbrable<dynamic> to Apache.Ignite.Core.Binary.IBinaryObject.

Thanks
Manan Joshi

On Fri, Nov 15, 2019 at 8:46 AM Alexandr Shapkin <[hidden email]> wrote:

You can also refer to the BinaryModeExample.cs example and the docs [1]

 

[1] - https://apacheignite-net.readme.io/docs/binary-mode#section-creating-binary-objects

 

From: [hidden email]
Sent: Friday, November 15, 2019 4:13 PM
To: [hidden email]
Subject: Re: Store objects as IBinaryobject in cadche

 

Hello!

 

You can use BinaryObjectBuilder:

 

However, each variation of its composition is stored in schema cache, which means you should not have too many of those.

 

It is recommended to use Map to store all variable/non-essential fields if you have a lot of them.

 

Regards,

--

Ilya Kasnacheev

 

 

пт, 15 нояб. 2019 г. в 16:08, Manan Joshi <[hidden email]>:

I would like to store any time of object into cache as IBinaryobject, so i can store cache stored in loosely bind with object. I am working with Ignite .Net. Can someone please suggest something.

 

I need something like

MyObject obj = new MyObject();
 
 obj.setFieldA("A");
 obj.setFieldB(123);
 
 BinaryObject binaryObj = Ignition.ignite().binary().toBinary(obj);

 

Thanks

Manan Joshi

 

ilya.kasnacheev ilya.kasnacheev
Reply | Threaded
Open this post in threaded view
|

Re: Re: Store objects as IBinaryobject in cadche

Hello!

You can try using ignite.binary().ToBinary(obj).

However, in your case, it makes sense to avoid the intermediate object stage directly and produce BinaryObjects from input data using builder.

Regards,
--
Ilya Kasnacheev


пт, 15 нояб. 2019 г. в 17:15, Manan Joshi <[hidden email]>:
I am reading the data using dapper from the database i am not sure how to convert fromSystem.Collections.Generic.IEnumbrable<dynamic> to Apache.Ignite.Core.Binary.IBinaryObject.

Thanks
Manan Joshi

On Fri, Nov 15, 2019 at 8:46 AM Alexandr Shapkin <[hidden email]> wrote:

You can also refer to the BinaryModeExample.cs example and the docs [1]

 

[1] - https://apacheignite-net.readme.io/docs/binary-mode#section-creating-binary-objects

 

From: [hidden email]
Sent: Friday, November 15, 2019 4:13 PM
To: [hidden email]
Subject: Re: Store objects as IBinaryobject in cadche

 

Hello!

 

You can use BinaryObjectBuilder:

 

However, each variation of its composition is stored in schema cache, which means you should not have too many of those.

 

It is recommended to use Map to store all variable/non-essential fields if you have a lot of them.

 

Regards,

--

Ilya Kasnacheev

 

 

пт, 15 нояб. 2019 г. в 16:08, Manan Joshi <[hidden email]>:

I would like to store any time of object into cache as IBinaryobject, so i can store cache stored in loosely bind with object. I am working with Ignite .Net. Can someone please suggest something.

 

I need something like

MyObject obj = new MyObject();
 
 obj.setFieldA("A");
 obj.setFieldB(123);
 
 BinaryObject binaryObj = Ignition.ignite().binary().toBinary(obj);

 

Thanks

Manan Joshi

 

ptupitsyn ptupitsyn
Reply | Threaded
Open this post in threaded view
|

Re: Re: Store objects as IBinaryobject in cadche

When using `dynamic` with Dapper, underlying objects are of type DapperRow, which is also IDictionary<string, object>,
which is easy to convert to BinaryObject. Here is a full example with Dapper query:

var dapperQuery = conn.Query("SELECT * FROM Persons");
foreach (IDictionary<string, object> row in dapperQuery)
{
var builder = ignite.GetBinary().GetBuilder("YourEntityNameHere");
foreach (var pair in row)
{
builder.SetField(pair.Key, pair.Value);
}

var binaryObject = builder.Build();
Console.WriteLine(binaryObject);
}

On Fri, Nov 15, 2019 at 5:20 PM Ilya Kasnacheev <[hidden email]> wrote:
Hello!

You can try using ignite.binary().ToBinary(obj).

However, in your case, it makes sense to avoid the intermediate object stage directly and produce BinaryObjects from input data using builder.

Regards,
--
Ilya Kasnacheev


пт, 15 нояб. 2019 г. в 17:15, Manan Joshi <[hidden email]>:
I am reading the data using dapper from the database i am not sure how to convert fromSystem.Collections.Generic.IEnumbrable<dynamic> to Apache.Ignite.Core.Binary.IBinaryObject.

Thanks
Manan Joshi

On Fri, Nov 15, 2019 at 8:46 AM Alexandr Shapkin <[hidden email]> wrote:

You can also refer to the BinaryModeExample.cs example and the docs [1]

 

[1] - https://apacheignite-net.readme.io/docs/binary-mode#section-creating-binary-objects

 

From: [hidden email]
Sent: Friday, November 15, 2019 4:13 PM
To: [hidden email]
Subject: Re: Store objects as IBinaryobject in cadche

 

Hello!

 

You can use BinaryObjectBuilder:

 

However, each variation of its composition is stored in schema cache, which means you should not have too many of those.

 

It is recommended to use Map to store all variable/non-essential fields if you have a lot of them.

 

Regards,

--

Ilya Kasnacheev

 

 

пт, 15 нояб. 2019 г. в 16:08, Manan Joshi <[hidden email]>:

I would like to store any time of object into cache as IBinaryobject, so i can store cache stored in loosely bind with object. I am working with Ignite .Net. Can someone please suggest something.

 

I need something like

MyObject obj = new MyObject();
 
 obj.setFieldA("A");
 obj.setFieldB(123);
 
 BinaryObject binaryObj = Ignition.ignite().binary().toBinary(obj);

 

Thanks

Manan Joshi

 

Manan Joshi Manan Joshi
Reply | Threaded
Open this post in threaded view
|

Re: Re: Store objects as IBinaryobject in cadche

Paval,

Thanks you for response.

I have trying to insert insert data using datastreamer into ignite , Can you tell me what is the best practice to creating key into ignite.

if i want to create multiple columns of db as key should i use Ibinaryobject to store as object ? will ignite sql engine understand the indexes if key is in IBinaryObject.

Thanks
Manan Joshi

On Fri, Nov 15, 2019 at 11:00 AM Pavel Tupitsyn <[hidden email]> wrote:
When using `dynamic` with Dapper, underlying objects are of type DapperRow, which is also IDictionary<string, object>,
which is easy to convert to BinaryObject. Here is a full example with Dapper query:

var dapperQuery = conn.Query("SELECT * FROM Persons");
foreach (IDictionary<string, object> row in dapperQuery)
{
var builder = ignite.GetBinary().GetBuilder("YourEntityNameHere");
foreach (var pair in row)
{
builder.SetField(pair.Key, pair.Value);
}

var binaryObject = builder.Build();
Console.WriteLine(binaryObject);
}

On Fri, Nov 15, 2019 at 5:20 PM Ilya Kasnacheev <[hidden email]> wrote:
Hello!

You can try using ignite.binary().ToBinary(obj).

However, in your case, it makes sense to avoid the intermediate object stage directly and produce BinaryObjects from input data using builder.

Regards,
--
Ilya Kasnacheev


пт, 15 нояб. 2019 г. в 17:15, Manan Joshi <[hidden email]>:
I am reading the data using dapper from the database i am not sure how to convert fromSystem.Collections.Generic.IEnumbrable<dynamic> to Apache.Ignite.Core.Binary.IBinaryObject.

Thanks
Manan Joshi

On Fri, Nov 15, 2019 at 8:46 AM Alexandr Shapkin <[hidden email]> wrote:

You can also refer to the BinaryModeExample.cs example and the docs [1]

 

[1] - https://apacheignite-net.readme.io/docs/binary-mode#section-creating-binary-objects

 

From: [hidden email]
Sent: Friday, November 15, 2019 4:13 PM
To: [hidden email]
Subject: Re: Store objects as IBinaryobject in cadche

 

Hello!

 

You can use BinaryObjectBuilder:

 

However, each variation of its composition is stored in schema cache, which means you should not have too many of those.

 

It is recommended to use Map to store all variable/non-essential fields if you have a lot of them.

 

Regards,

--

Ilya Kasnacheev

 

 

пт, 15 нояб. 2019 г. в 16:08, Manan Joshi <[hidden email]>:

I would like to store any time of object into cache as IBinaryobject, so i can store cache stored in loosely bind with object. I am working with Ignite .Net. Can someone please suggest something.

 

I need something like

MyObject obj = new MyObject();
 
 obj.setFieldA("A");
 obj.setFieldB(123);
 
 BinaryObject binaryObj = Ignition.ignite().binary().toBinary(obj);

 

Thanks

Manan Joshi

 

ptupitsyn ptupitsyn
Reply | Threaded
Open this post in threaded view
|

Re: Re: Store objects as IBinaryobject in cadche

Yes, you can use IBinaryObject as a key. Yes, SQL will work too.

On Fri, Nov 15, 2019 at 7:51 PM Manan Joshi <[hidden email]> wrote:
Paval,

Thanks you for response.

I have trying to insert insert data using datastreamer into ignite , Can you tell me what is the best practice to creating key into ignite.

if i want to create multiple columns of db as key should i use Ibinaryobject to store as object ? will ignite sql engine understand the indexes if key is in IBinaryObject.

Thanks
Manan Joshi

On Fri, Nov 15, 2019 at 11:00 AM Pavel Tupitsyn <[hidden email]> wrote:
When using `dynamic` with Dapper, underlying objects are of type DapperRow, which is also IDictionary<string, object>,
which is easy to convert to BinaryObject. Here is a full example with Dapper query:

var dapperQuery = conn.Query("SELECT * FROM Persons");
foreach (IDictionary<string, object> row in dapperQuery)
{
var builder = ignite.GetBinary().GetBuilder("YourEntityNameHere");
foreach (var pair in row)
{
builder.SetField(pair.Key, pair.Value);
}

var binaryObject = builder.Build();
Console.WriteLine(binaryObject);
}

On Fri, Nov 15, 2019 at 5:20 PM Ilya Kasnacheev <[hidden email]> wrote:
Hello!

You can try using ignite.binary().ToBinary(obj).

However, in your case, it makes sense to avoid the intermediate object stage directly and produce BinaryObjects from input data using builder.

Regards,
--
Ilya Kasnacheev


пт, 15 нояб. 2019 г. в 17:15, Manan Joshi <[hidden email]>:
I am reading the data using dapper from the database i am not sure how to convert fromSystem.Collections.Generic.IEnumbrable<dynamic> to Apache.Ignite.Core.Binary.IBinaryObject.

Thanks
Manan Joshi

On Fri, Nov 15, 2019 at 8:46 AM Alexandr Shapkin <[hidden email]> wrote:

You can also refer to the BinaryModeExample.cs example and the docs [1]

 

[1] - https://apacheignite-net.readme.io/docs/binary-mode#section-creating-binary-objects

 

From: [hidden email]
Sent: Friday, November 15, 2019 4:13 PM
To: [hidden email]
Subject: Re: Store objects as IBinaryobject in cadche

 

Hello!

 

You can use BinaryObjectBuilder:

 

However, each variation of its composition is stored in schema cache, which means you should not have too many of those.

 

It is recommended to use Map to store all variable/non-essential fields if you have a lot of them.

 

Regards,

--

Ilya Kasnacheev

 

 

пт, 15 нояб. 2019 г. в 16:08, Manan Joshi <[hidden email]>:

I would like to store any time of object into cache as IBinaryobject, so i can store cache stored in loosely bind with object. I am working with Ignite .Net. Can someone please suggest something.

 

I need something like

MyObject obj = new MyObject();
 
 obj.setFieldA("A");
 obj.setFieldB(123);
 
 BinaryObject binaryObj = Ignition.ignite().binary().toBinary(obj);

 

Thanks

Manan Joshi

 

Manan Joshi Manan Joshi
Reply | Threaded
Open this post in threaded view
|

Re: Re: Store objects as IBinaryobject in cadche

Some more help :)


image.png

I am seeing cache are stored fine in key and in value but when run the query it throws exception on table not found. Can you help me out what i am missing?

On Fri, Nov 15, 2019 at 12:32 PM Pavel Tupitsyn <[hidden email]> wrote:
Yes, you can use IBinaryObject as a key. Yes, SQL will work too.

On Fri, Nov 15, 2019 at 7:51 PM Manan Joshi <[hidden email]> wrote:
Paval,

Thanks you for response.

I have trying to insert insert data using datastreamer into ignite , Can you tell me what is the best practice to creating key into ignite.

if i want to create multiple columns of db as key should i use Ibinaryobject to store as object ? will ignite sql engine understand the indexes if key is in IBinaryObject.

Thanks
Manan Joshi

On Fri, Nov 15, 2019 at 11:00 AM Pavel Tupitsyn <[hidden email]> wrote:
When using `dynamic` with Dapper, underlying objects are of type DapperRow, which is also IDictionary<string, object>,
which is easy to convert to BinaryObject. Here is a full example with Dapper query:

var dapperQuery = conn.Query("SELECT * FROM Persons");
foreach (IDictionary<string, object> row in dapperQuery)
{
var builder = ignite.GetBinary().GetBuilder("YourEntityNameHere");
foreach (var pair in row)
{
builder.SetField(pair.Key, pair.Value);
}

var binaryObject = builder.Build();
Console.WriteLine(binaryObject);
}

On Fri, Nov 15, 2019 at 5:20 PM Ilya Kasnacheev <[hidden email]> wrote:
Hello!

You can try using ignite.binary().ToBinary(obj).

However, in your case, it makes sense to avoid the intermediate object stage directly and produce BinaryObjects from input data using builder.

Regards,
--
Ilya Kasnacheev


пт, 15 нояб. 2019 г. в 17:15, Manan Joshi <[hidden email]>:
I am reading the data using dapper from the database i am not sure how to convert fromSystem.Collections.Generic.IEnumbrable<dynamic> to Apache.Ignite.Core.Binary.IBinaryObject.

Thanks
Manan Joshi

On Fri, Nov 15, 2019 at 8:46 AM Alexandr Shapkin <[hidden email]> wrote:

You can also refer to the BinaryModeExample.cs example and the docs [1]

 

[1] - https://apacheignite-net.readme.io/docs/binary-mode#section-creating-binary-objects

 

From: [hidden email]
Sent: Friday, November 15, 2019 4:13 PM
To: [hidden email]
Subject: Re: Store objects as IBinaryobject in cadche

 

Hello!

 

You can use BinaryObjectBuilder:

 

However, each variation of its composition is stored in schema cache, which means you should not have too many of those.

 

It is recommended to use Map to store all variable/non-essential fields if you have a lot of them.

 

Regards,

--

Ilya Kasnacheev

 

 

пт, 15 нояб. 2019 г. в 16:08, Manan Joshi <[hidden email]>:

I would like to store any time of object into cache as IBinaryobject, so i can store cache stored in loosely bind with object. I am working with Ignite .Net. Can someone please suggest something.

 

I need something like

MyObject obj = new MyObject();
 
 obj.setFieldA("A");
 obj.setFieldB(123);
 
 BinaryObject binaryObj = Ignition.ignite().binary().toBinary(obj);

 

Thanks

Manan Joshi

 

ptupitsyn ptupitsyn
Reply | Threaded
Open this post in threaded view
|

Re: Re: Store objects as IBinaryobject in cadche

Can you please attach full code as text? Can't run a screenshot :)

On Fri, Nov 15, 2019 at 10:35 PM Manan Joshi <[hidden email]> wrote:
Some more help :)


image.png

I am seeing cache are stored fine in key and in value but when run the query it throws exception on table not found. Can you help me out what i am missing?

On Fri, Nov 15, 2019 at 12:32 PM Pavel Tupitsyn <[hidden email]> wrote:
Yes, you can use IBinaryObject as a key. Yes, SQL will work too.

On Fri, Nov 15, 2019 at 7:51 PM Manan Joshi <[hidden email]> wrote:
Paval,

Thanks you for response.

I have trying to insert insert data using datastreamer into ignite , Can you tell me what is the best practice to creating key into ignite.

if i want to create multiple columns of db as key should i use Ibinaryobject to store as object ? will ignite sql engine understand the indexes if key is in IBinaryObject.

Thanks
Manan Joshi

On Fri, Nov 15, 2019 at 11:00 AM Pavel Tupitsyn <[hidden email]> wrote:
When using `dynamic` with Dapper, underlying objects are of type DapperRow, which is also IDictionary<string, object>,
which is easy to convert to BinaryObject. Here is a full example with Dapper query:

var dapperQuery = conn.Query("SELECT * FROM Persons");
foreach (IDictionary<string, object> row in dapperQuery)
{
var builder = ignite.GetBinary().GetBuilder("YourEntityNameHere");
foreach (var pair in row)
{
builder.SetField(pair.Key, pair.Value);
}

var binaryObject = builder.Build();
Console.WriteLine(binaryObject);
}

On Fri, Nov 15, 2019 at 5:20 PM Ilya Kasnacheev <[hidden email]> wrote:
Hello!

You can try using ignite.binary().ToBinary(obj).

However, in your case, it makes sense to avoid the intermediate object stage directly and produce BinaryObjects from input data using builder.

Regards,
--
Ilya Kasnacheev


пт, 15 нояб. 2019 г. в 17:15, Manan Joshi <[hidden email]>:
I am reading the data using dapper from the database i am not sure how to convert fromSystem.Collections.Generic.IEnumbrable<dynamic> to Apache.Ignite.Core.Binary.IBinaryObject.

Thanks
Manan Joshi

On Fri, Nov 15, 2019 at 8:46 AM Alexandr Shapkin <[hidden email]> wrote:

You can also refer to the BinaryModeExample.cs example and the docs [1]

 

[1] - https://apacheignite-net.readme.io/docs/binary-mode#section-creating-binary-objects

 

From: [hidden email]
Sent: Friday, November 15, 2019 4:13 PM
To: [hidden email]
Subject: Re: Store objects as IBinaryobject in cadche

 

Hello!

 

You can use BinaryObjectBuilder:

 

However, each variation of its composition is stored in schema cache, which means you should not have too many of those.

 

It is recommended to use Map to store all variable/non-essential fields if you have a lot of them.

 

Regards,

--

Ilya Kasnacheev

 

 

пт, 15 нояб. 2019 г. в 16:08, Manan Joshi <[hidden email]>:

I would like to store any time of object into cache as IBinaryobject, so i can store cache stored in loosely bind with object. I am working with Ignite .Net. Can someone please suggest something.

 

I need something like

MyObject obj = new MyObject();
 
 obj.setFieldA("A");
 obj.setFieldB(123);
 
 BinaryObject binaryObj = Ignition.ignite().binary().toBinary(obj);

 

Thanks

Manan Joshi

 

Manan Joshi Manan Joshi
Reply | Threaded
Open this post in threaded view
|

Re: Re: Store objects as IBinaryobject in cadche

 public void CreateCache(string connectionString, string schema, string table, Dictionary<string, Type> fields, string[] keys)
        {
            string query = String.Format("{0} {1}.{2}", "SELECT * FROM", schema, table);
            string cachename = CacheNameHash(connectionString, schema, table);
            if (_dataSourceAdaptor.TestConnection(_serverType, connectionString).Status == Framework.Constants.ConnectDBStatus.Success)
            {
                var result = _dataSourceAdaptor.QueryMultiple<dynamic>(connectionString, query,null,60 ,null).AsList();
                var cacheConfiguration = new CacheConfiguration() {
                    Name = cachename, QueryEntities = new[] {
                    new QueryEntity { TableName = "Orders" , ValueTypeName="Orders" , KeyTypeName="Orders", Fields=   new[]
                            {
                                new QueryField("OrderID", typeof(int)),
                                new QueryField("EmployeeID", typeof(int)),
                                new QueryField("CustomerID", typeof(int)),
                            }, }
                   
                } };
                var cache = ignite.GetOrCreateCache<IBinaryObject, IBinaryObject>(cacheConfiguration).WithKeepBinary<IBinaryObject, IBinaryObject>();
                using (var streamer = ignite.GetDataStreamer<IBinaryObject, IBinaryObject>(cache.Name))
                {
                    foreach (var item in result)
                    {
                        var dataRow = (IDictionary<string, object>)item;
                        IBinaryObjectBuilder keyBuilder = ignite.GetBinary().GetBuilder(table);
                        IBinaryObjectBuilder valueBuilder = ignite.GetBinary().GetBuilder(table);
                        SetBuiderFields(fields, keys, dataRow,table,out keyBuilder);
                        SetBuiderFields(fields, new List<string>(fields.Keys).ToArray(), dataRow, table, out valueBuilder);
                        streamer.AddData(keyBuilder.Build(),valueBuilder.Build());
                    }
                }
                var queryreults = cache.Query(new SqlFieldsQuery("select OrderID from Orders"));
            }
           
        }

        private void SetBuiderFields(Dictionary<string, Type> fields, string[] keys, IDictionary<string, object> dataRow,
                                    string tablename ,out IBinaryObjectBuilder builder)
        {
            builder = ignite.GetBinary().GetBuilder(tablename);
            foreach (var field in keys)
            {
                switch (Type.GetTypeCode(fields[field]))
                {
                    case TypeCode.Byte:
                        builder.SetByteField(field, (byte)dataRow[field]);
                        break;
                    case TypeCode.String:
                        builder.SetStringField(field, (string)dataRow[field]);
                        break;
                    case TypeCode.Int16:
                        builder.SetShortField(field, (Int16)dataRow[field]);
                        break;
                    case TypeCode.Int32:
                        builder.SetIntField(field, (Int32)dataRow[field]);
                        break;
                    case TypeCode.Int64:
                        builder.SetLongField(field, (long)dataRow[field]);
                        break;
                    case TypeCode.Decimal:
                        builder.SetDecimalField(field, (decimal)dataRow[field]);
                        break;
                    case TypeCode.Double:
                        builder.SetDoubleField(field, (double)dataRow[field]);
                        break;
                    default:
                        builder.SetField(field, dataRow[field]);
                        break;
                }
            }
        }

On Fri, Nov 15, 2019 at 2:41 PM Pavel Tupitsyn <[hidden email]> wrote:
Can you please attach full code as text? Can't run a screenshot :)

On Fri, Nov 15, 2019 at 10:35 PM Manan Joshi <[hidden email]> wrote:
Some more help :)


image.png

I am seeing cache are stored fine in key and in value but when run the query it throws exception on table not found. Can you help me out what i am missing?

On Fri, Nov 15, 2019 at 12:32 PM Pavel Tupitsyn <[hidden email]> wrote:
Yes, you can use IBinaryObject as a key. Yes, SQL will work too.

On Fri, Nov 15, 2019 at 7:51 PM Manan Joshi <[hidden email]> wrote:
Paval,

Thanks you for response.

I have trying to insert insert data using datastreamer into ignite , Can you tell me what is the best practice to creating key into ignite.

if i want to create multiple columns of db as key should i use Ibinaryobject to store as object ? will ignite sql engine understand the indexes if key is in IBinaryObject.

Thanks
Manan Joshi

On Fri, Nov 15, 2019 at 11:00 AM Pavel Tupitsyn <[hidden email]> wrote:
When using `dynamic` with Dapper, underlying objects are of type DapperRow, which is also IDictionary<string, object>,
which is easy to convert to BinaryObject. Here is a full example with Dapper query:

var dapperQuery = conn.Query("SELECT * FROM Persons");
foreach (IDictionary<string, object> row in dapperQuery)
{
var builder = ignite.GetBinary().GetBuilder("YourEntityNameHere");
foreach (var pair in row)
{
builder.SetField(pair.Key, pair.Value);
}

var binaryObject = builder.Build();
Console.WriteLine(binaryObject);
}

On Fri, Nov 15, 2019 at 5:20 PM Ilya Kasnacheev <[hidden email]> wrote:
Hello!

You can try using ignite.binary().ToBinary(obj).

However, in your case, it makes sense to avoid the intermediate object stage directly and produce BinaryObjects from input data using builder.

Regards,
--
Ilya Kasnacheev


пт, 15 нояб. 2019 г. в 17:15, Manan Joshi <[hidden email]>:
I am reading the data using dapper from the database i am not sure how to convert fromSystem.Collections.Generic.IEnumbrable<dynamic> to Apache.Ignite.Core.Binary.IBinaryObject.

Thanks
Manan Joshi

On Fri, Nov 15, 2019 at 8:46 AM Alexandr Shapkin <[hidden email]> wrote:

You can also refer to the BinaryModeExample.cs example and the docs [1]

 

[1] - https://apacheignite-net.readme.io/docs/binary-mode#section-creating-binary-objects

 

From: [hidden email]
Sent: Friday, November 15, 2019 4:13 PM
To: [hidden email]
Subject: Re: Store objects as IBinaryobject in cadche

 

Hello!

 

You can use BinaryObjectBuilder:

 

However, each variation of its composition is stored in schema cache, which means you should not have too many of those.

 

It is recommended to use Map to store all variable/non-essential fields if you have a lot of them.

 

Regards,

--

Ilya Kasnacheev

 

 

пт, 15 нояб. 2019 г. в 16:08, Manan Joshi <[hidden email]>:

I would like to store any time of object into cache as IBinaryobject, so i can store cache stored in loosely bind with object. I am working with Ignite .Net. Can someone please suggest something.

 

I need something like

MyObject obj = new MyObject();
 
 obj.setFieldA("A");
 obj.setFieldB(123);
 
 BinaryObject binaryObj = Ignition.ignite().binary().toBinary(obj);

 

Thanks

Manan Joshi

 

ilya.kasnacheev ilya.kasnacheev
Reply | Threaded
Open this post in threaded view
|

Re: Re: Store objects as IBinaryobject in cadche

Hello!

Your code is mostly sound, but there are a few issues of understanding.

Please see my replies inline.

пт, 15 нояб. 2019 г. в 22:43, Manan Joshi <[hidden email]>:
 public void CreateCache(string connectionString, string schema, string table, Dictionary<string, Type> fields, string[] keys)
        {
            string query = String.Format("{0} {1}.{2}", "SELECT * FROM", schema, table);
            string cachename = CacheNameHash(
connectionString, schema, table);
            if (_dataSourceAdaptor.
TestConnection(_serverType, connectionString).Status == Framework.Constants.ConnectDBStatus.Success)
            {
                var result = _dataSourceAdaptor.
QueryMultiple<dynamic>(connectionString, query,null,60 ,null).AsList();
                var cacheConfiguration = new CacheConfiguration() {
                    Name = cachename, QueryEntities = new[] {
                    new QueryEntity { TableName = "Orders" , ValueTypeName="Orders" , KeyTypeName="Orders", Fields=   new[]
You should make sure that key type name != value type name to avoid confusion, make it OrdersKey perhaps ^?
If your key is single-field it's best to use primitive type, specify KeyFieldName to give it a column name.

                            {
                                new QueryField("OrderID", typeof(int)),
                                new QueryField("EmployeeID", typeof(int)),
                                new QueryField("CustomerID", typeof(int)),
                            }, }
You should probably specify which ones of these reside in key and which in value by specifying keyFields. However, it seems that there is no way to specify them from .Net API :( this probably means you will have to use XML config or use primitive key or use annotations within key class (which you will need to create). Pavel, please correct me if I'm wrong.
You can still use BinaryObject approach here instead of key class, which will be only used as reference.
 
                   
                } };
                var cache = ignite.GetOrCreateCache<
IBinaryObject, IBinaryObject>(cacheConfiguration).WithKeepBinary<IBinaryObject, IBinaryObject>();
                using (var streamer = ignite.GetDataStreamer<
IBinaryObject, IBinaryObject>(cache.Name))
                {
                    foreach (var item in result)
                    {
                        var dataRow = (IDictionary<string, object>)item;
                        IBinaryObjectBuilder keyBuilder = ignite.GetBinary().GetBuilder(
table);
                        IBinaryObjectBuilder valueBuilder = ignite.GetBinary().GetBuilder(
table);
These should be "OrdersKey" / "Orders", and *not* table name. This is because type name is discriminator and mismatching it will cause data to be unavailable for SQL.

                        SetBuiderFields(fields, keys, dataRow,table,out keyBuilder);
                        SetBuiderFields(fields, new List<string>(fields.Keys).
ToArray(), dataRow, table, out valueBuilder);
                        streamer.AddData(keyBuilder.Build(),valueBuilder.Build());
                    }
                }
                var queryreults = cache.Query(new SqlFieldsQuery("select OrderID from Orders"));
After those fixes, the code worked for me, provided some results.
 
Regards,
--
Ilya Kasnacheev
 

On Fri, Nov 15, 2019 at 2:41 PM Pavel Tupitsyn <[hidden email]> wrote:
Can you please attach full code as text? Can't run a screenshot :)

On Fri, Nov 15, 2019 at 10:35 PM Manan Joshi <[hidden email]> wrote:
Some more help :)


image.png

I am seeing cache are stored fine in key and in value but when run the query it throws exception on table not found. Can you help me out what i am missing?

On Fri, Nov 15, 2019 at 12:32 PM Pavel Tupitsyn <[hidden email]> wrote:
Yes, you can use IBinaryObject as a key. Yes, SQL will work too.

On Fri, Nov 15, 2019 at 7:51 PM Manan Joshi <[hidden email]> wrote:
Paval,

Thanks you for response.

I have trying to insert insert data using datastreamer into ignite , Can you tell me what is the best practice to creating key into ignite.

if i want to create multiple columns of db as key should i use Ibinaryobject to store as object ? will ignite sql engine understand the indexes if key is in IBinaryObject.

Thanks
Manan Joshi

On Fri, Nov 15, 2019 at 11:00 AM Pavel Tupitsyn <[hidden email]> wrote:
When using `dynamic` with Dapper, underlying objects are of type DapperRow, which is also IDictionary<string, object>,
which is easy to convert to BinaryObject. Here is a full example with Dapper query:

var dapperQuery = conn.Query("SELECT * FROM Persons");
foreach (IDictionary<string, object> row in dapperQuery)
{
var builder = ignite.GetBinary().GetBuilder("YourEntityNameHere");
foreach (var pair in row)
{
builder.SetField(pair.Key, pair.Value);
}

var binaryObject = builder.Build();
Console.WriteLine(binaryObject);
}

On Fri, Nov 15, 2019 at 5:20 PM Ilya Kasnacheev <[hidden email]> wrote:
Hello!

You can try using ignite.binary().ToBinary(obj).

However, in your case, it makes sense to avoid the intermediate object stage directly and produce BinaryObjects from input data using builder.

Regards,
--
Ilya Kasnacheev


пт, 15 нояб. 2019 г. в 17:15, Manan Joshi <[hidden email]>:
I am reading the data using dapper from the database i am not sure how to convert fromSystem.Collections.Generic.IEnumbrable<dynamic> to Apache.Ignite.Core.Binary.IBinaryObject.

Thanks
Manan Joshi

On Fri, Nov 15, 2019 at 8:46 AM Alexandr Shapkin <[hidden email]> wrote:

You can also refer to the BinaryModeExample.cs example and the docs [1]

 

[1] - https://apacheignite-net.readme.io/docs/binary-mode#section-creating-binary-objects

 

From: [hidden email]
Sent: Friday, November 15, 2019 4:13 PM
To: [hidden email]
Subject: Re: Store objects as IBinaryobject in cadche

 

Hello!

 

You can use BinaryObjectBuilder:

 

However, each variation of its composition is stored in schema cache, which means you should not have too many of those.

 

It is recommended to use Map to store all variable/non-essential fields if you have a lot of them.

 

Regards,

--

Ilya Kasnacheev

 

 

пт, 15 нояб. 2019 г. в 16:08, Manan Joshi <[hidden email]>:

I would like to store any time of object into cache as IBinaryobject, so i can store cache stored in loosely bind with object. I am working with Ignite .Net. Can someone please suggest something.

 

I need something like

MyObject obj = new MyObject();
 
 obj.setFieldA("A");
 obj.setFieldB(123);
 
 BinaryObject binaryObj = Ignition.ignite().binary().toBinary(obj);

 

Thanks

Manan Joshi

 

ilya.kasnacheev ilya.kasnacheev
Reply | Threaded
Open this post in threaded view
|

Re: Re: Store objects as IBinaryobject in cadche

Hello again!

A tiny addendum - you can mark key fields with QueryField.IsKeyField and forget what I have said about XML and stuff.

Regards,
--
Ilya Kasnacheev


вт, 19 нояб. 2019 г. в 19:36, Ilya Kasnacheev <[hidden email]>:
Hello!

Your code is mostly sound, but there are a few issues of understanding.

Please see my replies inline.

пт, 15 нояб. 2019 г. в 22:43, Manan Joshi <[hidden email]>:
 public void CreateCache(string connectionString, string schema, string table, Dictionary<string, Type> fields, string[] keys)
        {
            string query = String.Format("{0} {1}.{2}", "SELECT * FROM", schema, table);
            string cachename = CacheNameHash(
connectionString, schema, table);
            if (_dataSourceAdaptor.
TestConnection(_serverType, connectionString).Status == Framework.Constants.ConnectDBStatus.Success)
            {
                var result = _dataSourceAdaptor.
QueryMultiple<dynamic>(connectionString, query,null,60 ,null).AsList();
                var cacheConfiguration = new CacheConfiguration() {
                    Name = cachename, QueryEntities = new[] {
                    new QueryEntity { TableName = "Orders" , ValueTypeName="Orders" , KeyTypeName="Orders", Fields=   new[]
You should make sure that key type name != value type name to avoid confusion, make it OrdersKey perhaps ^?
If your key is single-field it's best to use primitive type, specify KeyFieldName to give it a column name.

                            {
                                new QueryField("OrderID", typeof(int)),
                                new QueryField("EmployeeID", typeof(int)),
                                new QueryField("CustomerID", typeof(int)),
                            }, }
You should probably specify which ones of these reside in key and which in value by specifying keyFields. However, it seems that there is no way to specify them from .Net API :( this probably means you will have to use XML config or use primitive key or use annotations within key class (which you will need to create). Pavel, please correct me if I'm wrong.
You can still use BinaryObject approach here instead of key class, which will be only used as reference.
 
                   
                } };
                var cache = ignite.GetOrCreateCache<
IBinaryObject, IBinaryObject>(cacheConfiguration).WithKeepBinary<IBinaryObject, IBinaryObject>();
                using (var streamer = ignite.GetDataStreamer<
IBinaryObject, IBinaryObject>(cache.Name))
                {
                    foreach (var item in result)
                    {
                        var dataRow = (IDictionary<string, object>)item;
                        IBinaryObjectBuilder keyBuilder = ignite.GetBinary().GetBuilder(
table);
                        IBinaryObjectBuilder valueBuilder = ignite.GetBinary().GetBuilder(
table);
These should be "OrdersKey" / "Orders", and *not* table name. This is because type name is discriminator and mismatching it will cause data to be unavailable for SQL.

                        SetBuiderFields(fields, keys, dataRow,table,out keyBuilder);
                        SetBuiderFields(fields, new List<string>(fields.Keys).
ToArray(), dataRow, table, out valueBuilder);
                        streamer.AddData(keyBuilder.Build(),valueBuilder.Build());
                    }
                }
                var queryreults = cache.Query(new SqlFieldsQuery("select OrderID from Orders"));
After those fixes, the code worked for me, provided some results.
 
Regards,
--
Ilya Kasnacheev
 

On Fri, Nov 15, 2019 at 2:41 PM Pavel Tupitsyn <[hidden email]> wrote:
Can you please attach full code as text? Can't run a screenshot :)

On Fri, Nov 15, 2019 at 10:35 PM Manan Joshi <[hidden email]> wrote:
Some more help :)


image.png

I am seeing cache are stored fine in key and in value but when run the query it throws exception on table not found. Can you help me out what i am missing?

On Fri, Nov 15, 2019 at 12:32 PM Pavel Tupitsyn <[hidden email]> wrote:
Yes, you can use IBinaryObject as a key. Yes, SQL will work too.

On Fri, Nov 15, 2019 at 7:51 PM Manan Joshi <[hidden email]> wrote:
Paval,

Thanks you for response.

I have trying to insert insert data using datastreamer into ignite , Can you tell me what is the best practice to creating key into ignite.

if i want to create multiple columns of db as key should i use Ibinaryobject to store as object ? will ignite sql engine understand the indexes if key is in IBinaryObject.

Thanks
Manan Joshi

On Fri, Nov 15, 2019 at 11:00 AM Pavel Tupitsyn <[hidden email]> wrote:
When using `dynamic` with Dapper, underlying objects are of type DapperRow, which is also IDictionary<string, object>,
which is easy to convert to BinaryObject. Here is a full example with Dapper query:

var dapperQuery = conn.Query("SELECT * FROM Persons");
foreach (IDictionary<string, object> row in dapperQuery)
{
var builder = ignite.GetBinary().GetBuilder("YourEntityNameHere");
foreach (var pair in row)
{
builder.SetField(pair.Key, pair.Value);
}

var binaryObject = builder.Build();
Console.WriteLine(binaryObject);
}

On Fri, Nov 15, 2019 at 5:20 PM Ilya Kasnacheev <[hidden email]> wrote:
Hello!

You can try using ignite.binary().ToBinary(obj).

However, in your case, it makes sense to avoid the intermediate object stage directly and produce BinaryObjects from input data using builder.

Regards,
--
Ilya Kasnacheev


пт, 15 нояб. 2019 г. в 17:15, Manan Joshi <[hidden email]>:
I am reading the data using dapper from the database i am not sure how to convert fromSystem.Collections.Generic.IEnumbrable<dynamic> to Apache.Ignite.Core.Binary.IBinaryObject.

Thanks
Manan Joshi

On Fri, Nov 15, 2019 at 8:46 AM Alexandr Shapkin <[hidden email]> wrote:

You can also refer to the BinaryModeExample.cs example and the docs [1]

 

[1] - https://apacheignite-net.readme.io/docs/binary-mode#section-creating-binary-objects

 

From: [hidden email]
Sent: Friday, November 15, 2019 4:13 PM
To: [hidden email]
Subject: Re: Store objects as IBinaryobject in cadche

 

Hello!

 

You can use BinaryObjectBuilder:

 

However, each variation of its composition is stored in schema cache, which means you should not have too many of those.

 

It is recommended to use Map to store all variable/non-essential fields if you have a lot of them.

 

Regards,

--

Ilya Kasnacheev

 

 

пт, 15 нояб. 2019 г. в 16:08, Manan Joshi <[hidden email]>:

I would like to store any time of object into cache as IBinaryobject, so i can store cache stored in loosely bind with object. I am working with Ignite .Net. Can someone please suggest something.

 

I need something like

MyObject obj = new MyObject();
 
 obj.setFieldA("A");
 obj.setFieldB(123);
 
 BinaryObject binaryObj = Ignition.ignite().binary().toBinary(obj);

 

Thanks

Manan Joshi