Slick dynamically filter by a list of columns and values









up vote
0
down vote

favorite












I'm trying to create a query in slick with dynamic filtering. I have a Seq[(String, String)] where the first element of the tuple is the column name while the second is the value against which make the filter.



In pseudo code, I want to do something like this:



val filters: Seq[(String, String)]
val query = filters.foldLeft(entityTable)
case(query, (column, value)) => query.filter(select(column) === value)



I already have a function def select(name: String): Rep[_] that returns the column Rep starting from its name that works well but I don't know how to get all the implicits needed to make the === function (or others comparison functions) work.



Is there any way to make such a dynamic filtering in slick?










share|improve this question





















  • Maybe it will be easier when you try with query.filter(x => check(x, column, value)) approach.
    – Łukasz
    yesterday














up vote
0
down vote

favorite












I'm trying to create a query in slick with dynamic filtering. I have a Seq[(String, String)] where the first element of the tuple is the column name while the second is the value against which make the filter.



In pseudo code, I want to do something like this:



val filters: Seq[(String, String)]
val query = filters.foldLeft(entityTable)
case(query, (column, value)) => query.filter(select(column) === value)



I already have a function def select(name: String): Rep[_] that returns the column Rep starting from its name that works well but I don't know how to get all the implicits needed to make the === function (or others comparison functions) work.



Is there any way to make such a dynamic filtering in slick?










share|improve this question





















  • Maybe it will be easier when you try with query.filter(x => check(x, column, value)) approach.
    – Łukasz
    yesterday












up vote
0
down vote

favorite









up vote
0
down vote

favorite











I'm trying to create a query in slick with dynamic filtering. I have a Seq[(String, String)] where the first element of the tuple is the column name while the second is the value against which make the filter.



In pseudo code, I want to do something like this:



val filters: Seq[(String, String)]
val query = filters.foldLeft(entityTable)
case(query, (column, value)) => query.filter(select(column) === value)



I already have a function def select(name: String): Rep[_] that returns the column Rep starting from its name that works well but I don't know how to get all the implicits needed to make the === function (or others comparison functions) work.



Is there any way to make such a dynamic filtering in slick?










share|improve this question













I'm trying to create a query in slick with dynamic filtering. I have a Seq[(String, String)] where the first element of the tuple is the column name while the second is the value against which make the filter.



In pseudo code, I want to do something like this:



val filters: Seq[(String, String)]
val query = filters.foldLeft(entityTable)
case(query, (column, value)) => query.filter(select(column) === value)



I already have a function def select(name: String): Rep[_] that returns the column Rep starting from its name that works well but I don't know how to get all the implicits needed to make the === function (or others comparison functions) work.



Is there any way to make such a dynamic filtering in slick?







scala slick






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked yesterday









Gigitsu

11311




11311











  • Maybe it will be easier when you try with query.filter(x => check(x, column, value)) approach.
    – Łukasz
    yesterday
















  • Maybe it will be easier when you try with query.filter(x => check(x, column, value)) approach.
    – Łukasz
    yesterday















Maybe it will be easier when you try with query.filter(x => check(x, column, value)) approach.
– Łukasz
yesterday




Maybe it will be easier when you try with query.filter(x => check(x, column, value)) approach.
– Łukasz
yesterday












1 Answer
1






active

oldest

votes

















up vote
1
down vote













Yes there is !



I use this method



private def applyOperator[T](left: Rep[T], right: Rep[T], operator: String)(implicit om: OptionMapper2[T, T, Boolean, T, T, Boolean]): Rep[Boolean] = 
operator match
case "==" => new BaseColumnExtensionMethods(left) === right
case "!=" => new BaseColumnExtensionMethods(left) =!= right
case "like" => new StringColumnExtensionMethods(left.asInstanceOf[Rep[String]]) like right.asInstanceOf[Rep[String]] //Breaks if T is not String




Then you can write something like



val filters: Seq[(String, String)]
val query = filters.foldLeft(entityTable)
case(query, (column, value)) => query.filter(applyOperator(yourFunctionForColumnFromName(column),value, "=="))






share|improve this answer




















    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













     

    draft saved


    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53224182%2fslick-dynamically-filter-by-a-list-of-columns-and-values%23new-answer', 'question_page');

    );

    Post as a guest






























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    1
    down vote













    Yes there is !



    I use this method



    private def applyOperator[T](left: Rep[T], right: Rep[T], operator: String)(implicit om: OptionMapper2[T, T, Boolean, T, T, Boolean]): Rep[Boolean] = 
    operator match
    case "==" => new BaseColumnExtensionMethods(left) === right
    case "!=" => new BaseColumnExtensionMethods(left) =!= right
    case "like" => new StringColumnExtensionMethods(left.asInstanceOf[Rep[String]]) like right.asInstanceOf[Rep[String]] //Breaks if T is not String




    Then you can write something like



    val filters: Seq[(String, String)]
    val query = filters.foldLeft(entityTable)
    case(query, (column, value)) => query.filter(applyOperator(yourFunctionForColumnFromName(column),value, "=="))






    share|improve this answer
























      up vote
      1
      down vote













      Yes there is !



      I use this method



      private def applyOperator[T](left: Rep[T], right: Rep[T], operator: String)(implicit om: OptionMapper2[T, T, Boolean, T, T, Boolean]): Rep[Boolean] = 
      operator match
      case "==" => new BaseColumnExtensionMethods(left) === right
      case "!=" => new BaseColumnExtensionMethods(left) =!= right
      case "like" => new StringColumnExtensionMethods(left.asInstanceOf[Rep[String]]) like right.asInstanceOf[Rep[String]] //Breaks if T is not String




      Then you can write something like



      val filters: Seq[(String, String)]
      val query = filters.foldLeft(entityTable)
      case(query, (column, value)) => query.filter(applyOperator(yourFunctionForColumnFromName(column),value, "=="))






      share|improve this answer






















        up vote
        1
        down vote










        up vote
        1
        down vote









        Yes there is !



        I use this method



        private def applyOperator[T](left: Rep[T], right: Rep[T], operator: String)(implicit om: OptionMapper2[T, T, Boolean, T, T, Boolean]): Rep[Boolean] = 
        operator match
        case "==" => new BaseColumnExtensionMethods(left) === right
        case "!=" => new BaseColumnExtensionMethods(left) =!= right
        case "like" => new StringColumnExtensionMethods(left.asInstanceOf[Rep[String]]) like right.asInstanceOf[Rep[String]] //Breaks if T is not String




        Then you can write something like



        val filters: Seq[(String, String)]
        val query = filters.foldLeft(entityTable)
        case(query, (column, value)) => query.filter(applyOperator(yourFunctionForColumnFromName(column),value, "=="))






        share|improve this answer












        Yes there is !



        I use this method



        private def applyOperator[T](left: Rep[T], right: Rep[T], operator: String)(implicit om: OptionMapper2[T, T, Boolean, T, T, Boolean]): Rep[Boolean] = 
        operator match
        case "==" => new BaseColumnExtensionMethods(left) === right
        case "!=" => new BaseColumnExtensionMethods(left) =!= right
        case "like" => new StringColumnExtensionMethods(left.asInstanceOf[Rep[String]]) like right.asInstanceOf[Rep[String]] //Breaks if T is not String




        Then you can write something like



        val filters: Seq[(String, String)]
        val query = filters.foldLeft(entityTable)
        case(query, (column, value)) => query.filter(applyOperator(yourFunctionForColumnFromName(column),value, "=="))







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered yesterday









        C4stor

        5,84121938




        5,84121938



























             

            draft saved


            draft discarded















































             


            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53224182%2fslick-dynamically-filter-by-a-list-of-columns-and-values%23new-answer', 'question_page');

            );

            Post as a guest














































































            Popular posts from this blog

            Kleinkühnau

            Makov (Slowakei)

            Deutsches Schauspielhaus