Overiding Alias in PrepareQuery in ListRequestHandler

I am having trouble understanding where to override SqlQuery query default alias. I've gone through the source but still having trouble. Any guidance as to what I missed would be appreciated.
I am using the following code (simplified for this question) and the sql comes out perfect except for the "from", it still adds "TO" in addition to my alias. I know it's the default behavior but I cant find where to override it.
    `protected override void PrepareQuery(SqlQuery query)
        {

            string eq1 = "my equation";
            string eq2 = "my second equation";

            var n = Entities.CustomerRow.Fields.As("n");
            query
                .Select(n.myField)
                .Select(n.myField2)
                .Select(eq1, "Actual Distance")

                .From(n)       //This returns as "FROM CUSTOMER T0, CUSTOMER n" instead of "CUSTOMER n"

                .Where(
                 new Criteria(eq2 + "< n.Maxdistance"))
                .GroupBy(n.myField)
                .GroupBy(n.myField2)
                .OrderBy(eq1);

        }`

I have also tried adding a new Alias but it didn't work.
var no = new Alias("CUSTOMER", "no");  //I've tried with and without this, still have same issue

I wonder why you are trying to change alias for the main table. You shouldn't do that with ListRequestHandler. PrepareQuery is called after the query is created in CreateQuery() where it does a select from main table, with t0 alias. If you override CreateQuery and change this, you'll still have problems as in ApplyFilters etc. original fields with t0 alias will still be used.
If you have to change the alias for main query (i can't think of a reason why), then don't use ListHandler and write your code directly in repository method.

That makes sense. I had tried a couple different ways to populate my grid, this was just one I was experimenting with. I was changing alias because the full query actually uses multiple fields collections. (I simplified the above query just for the question. Using my query from issue #1095  I originally was using ListResponse but the response was always empty. (I am sure I am just over looking something from lack of experience) I only need to return a small set of records to allow the client to choose one. I am still in the learning curve on some of this. I may just use traditional C# method in my repository for this situation temporarily. Thank you.

Hi, @jdready5. Why don't you use a stored procedure? As you seem to just calculating some nearest points in an area, it's easier to mantain If you use a stored procedure to fetch those points and also you can reuse it easily for other tasks..
Regards

Thanks @edson I may do that as well. I can get my queries working okay, I am probably not asking the right questions anyway. Coming from Win Forms and not having a good understanding of javascript and type script has made the learning curve frustrating for me. Making the actual service call correctly has been the most challenging. I read the guide all the time and go through the source code and look at some of the examples floating around in here but still my response is always empty even when my query is correct. I'm sure I am not making the request correctly and/or not populating the grid properly. The rest of the platform has been an absolute blessing and Volkan has done an awesome job on this. I recognize it's my own lack of knowledge and experience that is the cause of all my issues, but I will continue trying because I am such a big believer in this platform, it's the best I've seen. I just don't like to ask too many questions that are not actually an issue with the framework, that frustrates developers. But I will be posting solutions for others to see as I get them. That helps everyone. Thanks again for the suggestion.

@jdready5 just let main table (the first one) to be called "t0" and use others as you like. Calling a table "n" or "t0" shouldn't hurt much and affect end result.

Yes, @jdready5 . I'm just suggesting this because I've worked for many years with GIS and vehicle tracking systems. And many times, through evolving tech we needed to optimize those queries within many tasks, like presenting to maps, reports, mailing...  So, if you think this will evolve, that would be an easier path to have things separeted in table functions and stored procedures... for the sake of maintainbility and later optimization or database changes... Otherwise, I realy like the code approach in Serenity Entities Way...
Best Regards.

Just make sure eq1 and eq2 has t0 instead of n in their expression.
protected override void PrepareQuery(SqlQuery query)        {
      base.PrepareQuery();

            string eq1 = "my equation";
            string eq2 = "my second equation";

            var t0 = Entities.CustomerRow.Fields;
            query
                .Select(n.myField)
                .Select(n.myField2)
                .Select(eq1, "Actual Distance")
                .From(n)
                .Where(
                     new Criteria(eq2) < t0.Maxdistance")
                .GroupBy(t0.myField)
                .GroupBy(t0.myField2)
                .OrderBy(eq1);

        }`

Thank you both very much. I have gone back to my original use in "endpoint". I have realized my issue has something to do with my query and my entities. When I run a direct and simple "select * from myTable" I get the data in my response. when I run my query however I do not get data in my response. My query does work directly agaisnt the database though outside of serenity. I will be digging into it deeper today and update the results here but I am thinking it may have to do with the fact that I am returning one of my equations as "actual distance" which is not a column in the database and also not in myRow. I have posted below the actual complete method using standard sql and showing the "actual distance" I am referring too (2nd line in the sqlQ query). In the end a SP may be my best choice even though I really want to stay away from SP if I can.
    `public ListResponse<MyRow> ListByZip(IDbConnection connection, ListRequest request)
    {

        ListResponse<MyRow> listReturn = new ListResponse<MyRow>();

        var sqlQ = "SELECT VENDOR_NUM AS \"VendorNum\",NAME AS \"Name\",TIER_LEVEL AS \"Rank\",PHONE AS \"Phone\",EMAIL AS \"Email\",CITY AS \"City\",ST AS \"St\",ZIP AS \"Zip\",";
        sqlQ = sqlQ + "3956 * 2 * ASIN(SQRT(POWER(SIN((n.lat - 35.8395) * pi() / 180 / 2), 2) + COS(n.lat * pi() / 180) * COS(35.8395 * pi() / 180) * POWER(SIN((n.lng - -83.4803) * pi() / 180 / 2), 2))) AS \"Actual Distance\"";
        sqlQ = sqlQ + "FROM NOTARY n ";
        sqlQ = sqlQ + "WHERE(n.lat between(35.8395 - 2)and(35.8395 + 2)) and(n.lng between(-83.4803 - 2)and(-83.4803 + 2)) and(3956 * 2 * ASIN(SQRT(POWER(SIN((n.lat - 35.8395) * pi() / 180 / 2), 2) + COS(n.lat * pi() / 180) * COS(35.8395 * pi() / 180) * POWER(SIN((n.lng - -83.4803) * pi() / 180 / 2), 2)))) < n.Maxdistance";
        sqlQ = sqlQ + " GROUP BY n.VENDOR_NUM, n.NAME, n.TIER_LEVEL, n.PHONE, n.EMAIL, n.CITY, n.ST, n.ZIP, n.lat, n.lng";
        sqlQ = sqlQ + " ORDER BY NAME, 3956 * 2 * ASIN(SQRT(POWER(SIN((n.lat - 35.8395) * pi() / 180 / 2), 2) + COS(n.lat * pi() / 180) * COS(35.8395 * pi() / 180) * POWER(SIN((n.lng - -83.4803) * pi() / 180 / 2), 2))), VENDOR_NUM";

        listReturn.Entities = (List<MyRow>)connection.Query<MyRow>(sqlQ);
        listReturn.Skip = 0;
        listReturn.Take = 100;
        listReturn.TotalCount = listReturn.Entities.Count;
        return listReturn;
    }`

You need to add a ActualDistance client side field to your row, if you want that field to be loaded to your row. And don't select it as "Actual Distance" but ActualDistance.

I added ActualDistance and the client side flag, but I still get no response. I keep stepping through everything carefully but still can't locate the issue. I thought maybe moving my equation for ActualDistance to my row as an expression but the lat and lng in the equation will always be different so I figured that's not the best approach. Maybe my "OrderBy" is causing an issue?..making progress but still working through it.
myRow
[DisplayName("ActualDistance"), SetFieldFlags(FieldFlags.ClientSide)]         public String ActualDistance         {             get { return Fields.ActualDistance[this]; }             set { Fields.ActualDistance[this] = value; }         }
myEndpoint
    `ListResponse<MyRow> listReturn = new ListResponse<MyRow>();
     string eq1 = "3956 * 2 * ASIN(SQRT( POWER(SIN((lat - 35.8395)* pi() / 180 / 2), 2) +COS(lat * pi() / 180) * COS(35.8395 * pi() / 180) * POWER(SIN((lng - -83.4803) * pi() / 180 / 2), 2) ))";
     string eq2 = "(lat between (35.8395-2)and (35.8395+2)) and (lng between(-83.4803-2)and (-83.4803+2)) and (3956 * 2 * ASIN(SQRT(POWER(SIN((lat - 35.8395) * pi() / 180 / 2), 2) + COS(lat * pi() / 180) * COS(35.8395 * pi() / 180) * POWER(SIN((lng - -83.4803) * pi() / 180 / 2), 2))))";

        var sqlQ = new SqlQuery()
                  .Select(MyRow.Fields.VendorNum)
                  .Select(MyRow.Fields.Name)
                  .Select(MyRow.Fields.TierLevel, "Rank")
                  .Select(MyRow.Fields.Phone)
                  .Select(MyRow.Fields.Email)
                  .Select(MyRow.Fields.City)
                  .Select(MyRow.Fields.St)
                  .Select(MyRow.Fields.Zip)
                  .Select(eq1, "ActualDistance")
                  .From(MyRow.Fields.TableName)
                  .Where(
                  new Criteria(eq2 + "< Maxdistance"))
                  .GroupBy(MyRow.Fields.VendorNum)
                  .GroupBy(MyRow.Fields.Name)
                  .GroupBy(MyRow.Fields.TierLevel)
                  .GroupBy(MyRow.Fields.Phone)
                  .GroupBy(MyRow.Fields.Email)
                  .GroupBy(MyRow.Fields.City)
                  .GroupBy(MyRow.Fields.St)
                  .GroupBy(MyRow.Fields.Zip)
                  .GroupBy(MyRow.Fields.LAT)
                  .GroupBy(MyRow.Fields.LNG)
                  .OrderBy(eq1);

        listReturn.Entities = (List<MyRow>)connection.Query<MyRow>(sqlQ);
        listReturn.Skip = 0;
        listReturn.Take = 100;
        listReturn.TotalCount = listReturn.Entities.Count;
        return listReturn;`

`

And here is my log entry of the query
SELECT
T0.VENDOR_NUM AS "VendorNum",
T0.NAME AS "Name",
T0.TIER_LEVEL AS "Rank",
T0.PHONE AS "Phone",
T0.EMAIL AS "Email",
T0.CITY AS "City",
T0.ST AS "St",
T0.ZIP AS "Zip",
3956 * 2 * ASIN(SQRT( POWER(SIN((lat - 35.8395)* pi() / 180 / 2), 2) +COS(lat * pi() / 180) * COS(35.8395 * pi() / 180) * POWER(SIN((lng - -83.4803) * pi() / 180 / 2), 2) )) AS "ActualDistance"
FROM NOTARY T0
WHERE (lat between (35.8395-2)and (35.8395+2)) and (lng between(-83.4803-2)and (-83.4803+2)) and (3956 * 2 * ASIN(SQRT(POWER(SIN((lat - 35.8395) * pi() / 180 / 2), 2) + COS(lat * pi() / 180) * COS(35.8395 * pi() / 180) * POWER(SIN((lng - -83.4803) * pi() / 180 / 2), 2))))< Maxdistance
GROUP BY T0.VENDOR_NUM, T0.NAME, T0.TIER_LEVEL, T0.PHONE, T0.EMAIL, T0.CITY, T0.ST, T0.ZIP, T0.LAT, T0.LNG
ORDER BY 3956 * 2 * ASIN(SQRT( POWER(SIN((lat - 35.8395)* pi() / 180 / 2), 2) +COS(lat * pi() / 180) * COS(35.8395 * pi() / 180) * POWER(SIN((lng - -83.4803) * pi() / 180 / 2), 2) ))

lng - -83.4803 ??

Well... Just test that query in Database... Your order by seems fine... Actually that is the only place where you could use the alias ActualDistance (order by ActualDistance) and keep from recalculating it...

Thanks, yes I have ran it against the database. I will keep debugging deeper.

Oh. I mean the query from log. But it seems fine anyway. See If it is calling the right service it in browser console. If there is any error..

That's the weird thing, no errors at all. List Return and response is just empty. That's why I'm digging deeper in the debug, I must be missing something.

It can't have any relation to ActualDistance. On last line, listReturn.Entities are empty or not?

Yes they are empty on the last line

I'm getting back on this tonight. I appreciate everyone's help very much. I may try to do this through "apply filters" maybe as well as a few other different approaches, not sure that's the better way to go but still not understanding why listReturn.Entities is empty. I will update tonight

Okay, I tried to duplicate this on an entirely new row, grid, etc. (for a fresh start just in case)..using the same methods and still get the same empty ListReturn.Entities. Digging a little deeper in the debug though I have found an error on "DeclaringMethod" if this may have something to do with it. The error is "'((System.RuntimeType)new System.Collections.Generic.Mscorlib_DictionaryKeyCollectionDebugView<System.Type, System.Web.Mvc.IModelBinder>(((System.Web.Mvc.ControllerActionInvoker)this.ActionInvoker).Binders.Keys).Items[1]).DeclaringMethod' threw an exception of type 'System.InvalidOperationException'" Still digging into this deeper as I am currently baffled why my list return is empty.

I have narrowed this down by simplifying everything to locate my actual issue. I simplified the query to only using  query.Where(new Criteria(eq2 + "< T0.Maxdistance")); Which is written the same way in my original query. This does not return entities but the query created works when testing against the database and returns results. If I change my criteria to query.Where(new Criteria("T0.Name") == "Test Notary2") I get results in my entities in in my grid as expected. This told me the way I wrote Criteria was incorrect. I tried using the expression (Which uses "lat" and "lng" fields from the DB) as a string but Maxdistance is an Int32 so writing the Criteria as query.Where(new Criteria(eq2) < "Maxdistance"); fails as well since string cannot convert to int32. So ultimately I realized this is still an issue with the way I am writing the query. In my log the query itself works fine against the database but does not return entities. I believe this is because the database is executing the actual expression. I know I do not want to use stored procedures in my database but that may be my only option. below is my simplified code for what I tested.
    protected override void ApplyFilters(SqlQuery query)

        {
            base.ApplyFilters(query);
            string eq2 = "(lat between (35.8395-2)and (35.8395+2)) and (lng between(-83.4803-2)and(-83.4803+2)) and (3956 * 2 * ASIN(SQRT(POWER(SIN((lat - 35.8395) * pi() / 180 / 2), 2) + COS(lat * pi() / 180) * COS(35.8395 * pi() / 180) * POWER(SIN((lng - -83.4803) * pi() / 180 / 2), 2))))";
            var fld = MyRow.Fields;
             query.Where(new Criteria("T0.Name") == "Test Notary2");  //THIS WORKS
            //query.Where(new Criteria(eq2) < "Maxdistance");        //STRING TO INT32 ERROR
           //query.Where(new Criteria(eq2 + "< Maxdistance"));       //ENTITIES ARE EMPTY
        }

new Criteria(eq2) < fld.MaxDistance

That gives me "Operator '<' cannot be applied to operands of type 'Criteria' and 'Int32Field'"

Hmm, sorry that overload might be missing, try
new Criteria(eq2) < new Criteria(fld.MaxDistance)

Thank you that did take away the error and built the query correct in log but same result with my entities returning empty.

Man, then there is something wrong with your query. I can't believe you are getting its text with query.DebugText and it works in SQL management studio while returns nothing there. It's impossible unless some other filter is added after ApplyFilters.

Hummm. Maybe it is something related to mysql driver? It seems like he's using MySQL for dB...

Here is my current code and a snip from my DB returning the query results. Im using Firebird DB by the way.
MyRow
    namespace SereneNM.NotaryManager.Entities
    {
        using Newtonsoft.Json;
        using Serenity;
        using Serenity.ComponentModel;
        using Serenity.Data;
        using Serenity.Data.Mapping;
        using System;
        using System.ComponentModel;
        using System.IO;
        using System.Collections.Generic;

        [ConnectionKey("NotaryManager"), DisplayName("CHOOSE NOTARY"), InstanceName("NOTARY"), TwoLevelCached]
        [ReadPermission("Notary")]
        [ModifyPermission("Notary")]
        [DeletePermission("Notary")]

         public sealed class ChsNotaryRow : Row, IIdRow, INameRow
    {
    [DisplayName("Name"), Column("NAME"), Size(50), QuickSearch, Required, LookupInclude]
    public String Name
    {
        get { return Fields.Name[this]; }
        set { Fields.Name[this] = value; }
    }

    [DisplayName("Vendor Num"), Column("VENDOR_NUM"), PrimaryKey, LookupInclude, AutoIncrement, Updatable(false)]
    public Int32? VendorNum
    {
        get { return Fields.VendorNum[this]; }
        set { Fields.VendorNum[this] = value; }
    }

    [DisplayName("City"), Column("CITY"), Size(25), Required, LookupInclude]
    public String City
    {
        get { return Fields.City[this]; }
        set { Fields.City[this] = value; }
    }

    [DisplayName("Zip"), Column("ZIP"), Size(10), Required, LookupInclude]
    public String Zip
    {
        get { return Fields.Zip[this]; }
        set { Fields.Zip[this] = value; }
    }

    [DisplayName("Phone"), Column("PHONE"), Size(50), Required, LookupInclude]
    public String Phone
    {
        get { return Fields.Phone[this]; }
        set { Fields.Phone[this] = value; }
    }

    [DisplayName("Email"), Column("EMAIL"), Size(40), Required, LookupInclude]
    public String Email
    {
        get { return Fields.Email[this]; }
        set { Fields.Email[this] = value; }
    }

    [DisplayName("St"), Column("ST"), Size(10), Required, LookupInclude]
    public String St
    {
        get { return Fields.St[this]; }
        set { Fields.St[this] = value; }
    }

    [DisplayName("Tier Level"), Column("TIER_LEVEL"), LookupInclude]
    public Int32? TierLevel
    {
        get { return Fields.TierLevel[this]; }
        set { Fields.TierLevel[this] = value; }
    }

    [DisplayName("LAT"), SetFieldFlags(FieldFlags.ClientSide)]
    public Decimal? LAT
    {
        get { return Fields.LAT[this]; }
        set { Fields.LAT[this] = value; }
    }

    [DisplayName("LNG"), SetFieldFlags(FieldFlags.ClientSide)]
    public Decimal? LNG
    {
        get { return Fields.LNG[this]; }
        set { Fields.LNG[this] = value; }
    }

    [DisplayName("Maxdistance"), Column("MAXDISTANCE")]
    public Int32? Maxdistance
    {
        get { return Fields.Maxdistance[this]; }
        set { Fields.Maxdistance[this] = value; }
    }

    IIdField IIdRow.IdField
    {
        get { return Fields.VendorNum; }
    }

    StringField INameRow.NameField
    {
        get { return Fields.Name; }
    }

MyGrid
    namespace SereneNM.NotaryManager {

@Serenity.Decorators.registerClass()
@Serenity.Decorators.responsive()
@Serenity.Decorators.maximizable()
export class ChsNotaryGrid extends Serenity.EntityGrid<ChsNotaryRow, any> {
    protected getColumnsKey() { return 'NotaryManager.ChsNotary'; }
    protected getDialogType() { return ChsNotaryDialog; }
    protected getIdProperty() { return ChsNotaryRow.idProperty; }
    protected getLocalTextPrefix() { return ChsNotaryRow.localTextPrefix; }
    protected getService() { return ChsNotaryService.baseUrl; }

    public rowSelection: Serenity.GridRowSelectionMixin;

    constructor(container: JQuery) {
        super(container);
    }

    protected subDialogsDataChange() {

        super.subDialogDataChange();
        Q.reloadLookup('NotaryManager.ChsNotary');

    }

    protected getButtons() {
        var buttons = super.getButtons();

        buttons.push(Common.ExcelExportHelper.createToolButton({
            grid: this,
            service: NotaryService.baseUrl + '/ListExcel',
            onViewSubmit: () => this.onViewSubmit(),
            separator: true
            //hint: "Export to Excel",
            //  title: "This is the Title"
        }));

        buttons.push(Common.PdfExportHelper.createToolButton({
            grid: this,
            onViewSubmit: () => this.onViewSubmit()
        }));

        return buttons;
    }

    protected creatToolbarExtensions() {
        super.createToolbarExtensions();
        this.rowSelection = new Serenity.GridRowSelectionMixin(this);
    }

    protected getColumns() {
        var columns = super.getColumns();
        columns.splice(0, 0, Serenity.GridRowSelectionMixin.createSelectColumn(() => this.rowSelection));
        return columns;
    }
}

}
From MyRepository
     public ListResponse<MyRow> List(IDbConnection connection, ListRequest request)
    {
        return new MyListHandler().Process(connection, request);

    }

    private class MySaveHandler : SaveRequestHandler<MyRow> { }
    private class MyDeleteHandler : DeleteRequestHandler<MyRow> { }
    private class MyRetrieveHandler : RetrieveRequestHandler<MyRow> { }
    private class MyListHandler : ListRequestHandler<MyRow>
    {

        protected override void ApplyFilters(SqlQuery query)
        {
            base.ApplyFilters(query);
            string eq2 = "(lat between (35.8395-2)and (35.8395+2)) and (lng between(-83.4803-2)and (-83.4803+2)) and (3956 * 2 * ASIN(SQRT(POWER(SIN((lat - 35.8395) * pi() / 180 / 2), 2) + COS(lat * pi() / 180) * COS(35.8395 * pi() / 180) * POWER(SIN((lng - -83.4803) * pi() / 180 / 2), 2))))";
            var fld = MyRow.Fields;
            query.Where(new Criteria(eq2) < new Criteria(fld.Maxdistance));
        }

    }

MyDialog
    namespace SereneNM.NotaryManager {

@Serenity.Decorators.registerClass()
@Serenity.Decorators.responsive()
@Serenity.Decorators.maximizable()
export class ChsNotaryDialog extends Serenity.EntityDialog<ChsNotaryRow, any> {
    protected getFormKey() { return ChsNotaryForm.formKey; }
    protected getIdProperty() { return ChsNotaryRow.idProperty; }
    protected getLocalTextPrefix() { return ChsNotaryRow.localTextPrefix; }
    protected getNameProperty() { return ChsNotaryRow.nameProperty; }
    protected getService() { return ChsNotaryService.baseUrl; }

    protected form = new ChsNotaryForm(this.idPrefix);

    private credentialsGrid: NotaryCredentialsGrid;

    constructor() {
        super();

        this.credentialsGrid = new NotaryCredentialsGrid(this.byId("CredentialsGrid"));
        this.tabs.on('tabsactivate', (e, i) => {
            this.arrange();
        });
    }

    protected afterLoadEntity() {
        super.afterLoadEntity();
        this.credentialsGrid.vendorNum = this.entity.VendorNum;
    }

}

}
Query from my Log
[D] 2016-10-24T17:22:04.109 ExecuteReader
SELECT FIRST 100
T0.VENDOR_NUM AS "VendorNum",
T0.NAME AS "Name",
T0.CITY AS "City",
T0.ZIP AS "Zip",
T0.PHONE AS "Phone",
T0.EMAIL AS "Email",
T0.ST AS "St",
T0.TIER_LEVEL AS "TierLevel",
T0.MAXDISTANCE AS "Maxdistance"
FROM NOTARY T0
WHERE ((lat between (35.8395-2)and (35.8395+2)) and (lng between(-83.4803-2)and (-83.4803+2)) and (3956 * 2 * ASIN(SQRT(POWER(SIN((lat - 35.8395) * pi() / 180 / 2), 2) + COS(lat * pi() / 180) * COS(35.8395 * pi() / 180) * POWER(SIN((lng - -83.4803) * pi() / 180 / 2), 2)))) < T0.MAXDISTANCE)
ORDER BY T0.NAME, T0.VENDOR_NUM
[D] 2016-10-24T17:22:04.660 END - ExecuteReader
And the database results from the same query (copied and pasted)

And MyColumns
    namespace SereneNM.NotaryManager.Columns
    {
using Serenity;
using Serenity.ComponentModel;
using Serenity.Data;
using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.IO;

[ColumnsScript("NotaryManager.ChsNotary")]
[BasedOnRow(typeof(Entities.ChsNotaryRow))]
public class ChsNotaryColumns
{
    public Int32 VendorNum { get; set; }
    public String Name { get; set; }
    public Int32 TierLevel { get; set; }
    public String City { get; set; }
    public String Zip { get; set; }
    public String Phone { get; set; }
    public String Email { get; set; }
}

}

Override OnReturn of list handler, put a breakpoint there, check returned items.

shows 0 items

You might send a teamviewer req to my e-mail, you spent so much time with this.

I can do that and appreciate it.

First off, thank you sincerely for the assistance. It's much appreciated. In the end this was a dumb novice mistake on my part. Just about every way I was trying actually worked and the reason my returns were empty was because I was missing some data from my development DB I was running the program against but I was testing the queries on a local DB. My pride is beyond hurt and I feel foolish but I am most grateful for the help. I am sure I will have more questions in the future and I will upload some code snips when completed to help others new to this.


Controller support

Controller support on desktop
https://github.com/libgdx/gdx-controllers/tree/master/gdx-controllers-core/src/com/badlogic/gdx/controllers

poate dupa concurs tho


Changed to allow log all values

What does this PR do?
In the existing log, not only string arguments but also other values can be used.
Fixes #99
Checklist

[ ] Added relevant tests
[x] Didn't break anything

After lint, I will upload it again.

@hackerwins

@hackerwins There seems to be a problem with the current test server (https://yorkie.dev/api).
Even if the latest version is cloned and tested, it will not be processed normally.
https://github.com/yorkie-team/yorkie-js-sdk/commit/be8860beb7fb192c6bb5442b0f50e3a2d128e7c0