How to create generated objects in shapeless











up vote
0
down vote

favorite












Suppose I have a normalized database model for a generic type that comes in like this:



case class BaseModel(id: String, 
createdBy: String,
attr1: Option[String] = None,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)


Given a sequence of BaseModel, if all the fields of a certain Option attribute are not populated, can shapeless create a reduced model for me?



For example suppose that all the attr1 fields are empty. Without me having to specify the object before hand can shapeless create a generic object that looks like this?



case class BaseModel(id: String, 
createdBy: String,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)









share|improve this question


























    up vote
    0
    down vote

    favorite












    Suppose I have a normalized database model for a generic type that comes in like this:



    case class BaseModel(id: String, 
    createdBy: String,
    attr1: Option[String] = None,
    attr2: Option[Int] = None,
    attr3: Option[LocalDate] = None)


    Given a sequence of BaseModel, if all the fields of a certain Option attribute are not populated, can shapeless create a reduced model for me?



    For example suppose that all the attr1 fields are empty. Without me having to specify the object before hand can shapeless create a generic object that looks like this?



    case class BaseModel(id: String, 
    createdBy: String,
    attr2: Option[Int] = None,
    attr3: Option[LocalDate] = None)









    share|improve this question
























      up vote
      0
      down vote

      favorite









      up vote
      0
      down vote

      favorite











      Suppose I have a normalized database model for a generic type that comes in like this:



      case class BaseModel(id: String, 
      createdBy: String,
      attr1: Option[String] = None,
      attr2: Option[Int] = None,
      attr3: Option[LocalDate] = None)


      Given a sequence of BaseModel, if all the fields of a certain Option attribute are not populated, can shapeless create a reduced model for me?



      For example suppose that all the attr1 fields are empty. Without me having to specify the object before hand can shapeless create a generic object that looks like this?



      case class BaseModel(id: String, 
      createdBy: String,
      attr2: Option[Int] = None,
      attr3: Option[LocalDate] = None)









      share|improve this question













      Suppose I have a normalized database model for a generic type that comes in like this:



      case class BaseModel(id: String, 
      createdBy: String,
      attr1: Option[String] = None,
      attr2: Option[Int] = None,
      attr3: Option[LocalDate] = None)


      Given a sequence of BaseModel, if all the fields of a certain Option attribute are not populated, can shapeless create a reduced model for me?



      For example suppose that all the attr1 fields are empty. Without me having to specify the object before hand can shapeless create a generic object that looks like this?



      case class BaseModel(id: String, 
      createdBy: String,
      attr2: Option[Int] = None,
      attr3: Option[LocalDate] = None)






      scala generic-programming shapeless






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 2 at 15:21









      franklin

      81842447




      81842447
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          1
          down vote



          accepted










          What Shapeless can do is, given two case classes, create an object of one of them from an object of another.



          import java.time.LocalDate
          import shapeless.LabelledGeneric
          import shapeless.record._

          case class BaseModel(id: String,
          createdBy: String,
          attr1: Option[String] = None,
          attr2: Option[Int] = None,
          attr3: Option[LocalDate] = None)

          case class BaseModel1(id: String,
          createdBy: String,
          attr2: Option[Int] = None,
          attr3: Option[LocalDate] = None)

          val bm = BaseModel(
          id = "cff4545gvgf",
          createdBy = "John Doe",
          attr2 = Some(42),
          attr3 = Some(LocalDate.parse("2018-11-03"))
          ) // BaseModel(cff4545gvgf,John Doe,None,Some(42),Some(2018-11-03))
          val hlist = LabelledGeneric[BaseModel].to(bm)
          val hlist1 = hlist - 'attr1
          val bm1 = LabelledGeneric[BaseModel1].from(hlist1)
          // BaseModel1(cff4545gvgf,John Doe,Some(42),Some(2018-11-03))


          But Shapeless can't create a new case class. If you need a new case class to be created automatically you can write a macro.






          share|improve this answer



















          • 1




            stackoverflow.com/questions/22850340/… Maybe this?
            – franklin
            Nov 3 at 15:10










          • Does this mean that for generics, the Base Model needs to have all the fields of any possible Child Model?
            – franklin
            Nov 6 at 14:26










          • Sorry I don't understand your question. I guess it doesn't.
            – Dmytro Mitin
            Nov 6 at 14:34










          • No. I think it does. A ChildModel1 with types a, b, c, d and a ChildModel2 with types a, b, c, d, e must both extend a BaseModel with types a, b, c, d, e. The BaseModel must contain the product of all the types used in any child model.
            – franklin
            Nov 6 at 18:08






          • 1




            What Shapeless does, is tranformation from case class to some generic representation (hlist) and vice versa. You can do everything what you want with hlist, add fields, remove fields, transform fields. What Shapeless can't do is defining case classes.
            – Dmytro Mitin
            Nov 6 at 19:22











          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%2f53121345%2fhow-to-create-generated-objects-in-shapeless%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          1
          down vote



          accepted










          What Shapeless can do is, given two case classes, create an object of one of them from an object of another.



          import java.time.LocalDate
          import shapeless.LabelledGeneric
          import shapeless.record._

          case class BaseModel(id: String,
          createdBy: String,
          attr1: Option[String] = None,
          attr2: Option[Int] = None,
          attr3: Option[LocalDate] = None)

          case class BaseModel1(id: String,
          createdBy: String,
          attr2: Option[Int] = None,
          attr3: Option[LocalDate] = None)

          val bm = BaseModel(
          id = "cff4545gvgf",
          createdBy = "John Doe",
          attr2 = Some(42),
          attr3 = Some(LocalDate.parse("2018-11-03"))
          ) // BaseModel(cff4545gvgf,John Doe,None,Some(42),Some(2018-11-03))
          val hlist = LabelledGeneric[BaseModel].to(bm)
          val hlist1 = hlist - 'attr1
          val bm1 = LabelledGeneric[BaseModel1].from(hlist1)
          // BaseModel1(cff4545gvgf,John Doe,Some(42),Some(2018-11-03))


          But Shapeless can't create a new case class. If you need a new case class to be created automatically you can write a macro.






          share|improve this answer



















          • 1




            stackoverflow.com/questions/22850340/… Maybe this?
            – franklin
            Nov 3 at 15:10










          • Does this mean that for generics, the Base Model needs to have all the fields of any possible Child Model?
            – franklin
            Nov 6 at 14:26










          • Sorry I don't understand your question. I guess it doesn't.
            – Dmytro Mitin
            Nov 6 at 14:34










          • No. I think it does. A ChildModel1 with types a, b, c, d and a ChildModel2 with types a, b, c, d, e must both extend a BaseModel with types a, b, c, d, e. The BaseModel must contain the product of all the types used in any child model.
            – franklin
            Nov 6 at 18:08






          • 1




            What Shapeless does, is tranformation from case class to some generic representation (hlist) and vice versa. You can do everything what you want with hlist, add fields, remove fields, transform fields. What Shapeless can't do is defining case classes.
            – Dmytro Mitin
            Nov 6 at 19:22















          up vote
          1
          down vote



          accepted










          What Shapeless can do is, given two case classes, create an object of one of them from an object of another.



          import java.time.LocalDate
          import shapeless.LabelledGeneric
          import shapeless.record._

          case class BaseModel(id: String,
          createdBy: String,
          attr1: Option[String] = None,
          attr2: Option[Int] = None,
          attr3: Option[LocalDate] = None)

          case class BaseModel1(id: String,
          createdBy: String,
          attr2: Option[Int] = None,
          attr3: Option[LocalDate] = None)

          val bm = BaseModel(
          id = "cff4545gvgf",
          createdBy = "John Doe",
          attr2 = Some(42),
          attr3 = Some(LocalDate.parse("2018-11-03"))
          ) // BaseModel(cff4545gvgf,John Doe,None,Some(42),Some(2018-11-03))
          val hlist = LabelledGeneric[BaseModel].to(bm)
          val hlist1 = hlist - 'attr1
          val bm1 = LabelledGeneric[BaseModel1].from(hlist1)
          // BaseModel1(cff4545gvgf,John Doe,Some(42),Some(2018-11-03))


          But Shapeless can't create a new case class. If you need a new case class to be created automatically you can write a macro.






          share|improve this answer



















          • 1




            stackoverflow.com/questions/22850340/… Maybe this?
            – franklin
            Nov 3 at 15:10










          • Does this mean that for generics, the Base Model needs to have all the fields of any possible Child Model?
            – franklin
            Nov 6 at 14:26










          • Sorry I don't understand your question. I guess it doesn't.
            – Dmytro Mitin
            Nov 6 at 14:34










          • No. I think it does. A ChildModel1 with types a, b, c, d and a ChildModel2 with types a, b, c, d, e must both extend a BaseModel with types a, b, c, d, e. The BaseModel must contain the product of all the types used in any child model.
            – franklin
            Nov 6 at 18:08






          • 1




            What Shapeless does, is tranformation from case class to some generic representation (hlist) and vice versa. You can do everything what you want with hlist, add fields, remove fields, transform fields. What Shapeless can't do is defining case classes.
            – Dmytro Mitin
            Nov 6 at 19:22













          up vote
          1
          down vote



          accepted







          up vote
          1
          down vote



          accepted






          What Shapeless can do is, given two case classes, create an object of one of them from an object of another.



          import java.time.LocalDate
          import shapeless.LabelledGeneric
          import shapeless.record._

          case class BaseModel(id: String,
          createdBy: String,
          attr1: Option[String] = None,
          attr2: Option[Int] = None,
          attr3: Option[LocalDate] = None)

          case class BaseModel1(id: String,
          createdBy: String,
          attr2: Option[Int] = None,
          attr3: Option[LocalDate] = None)

          val bm = BaseModel(
          id = "cff4545gvgf",
          createdBy = "John Doe",
          attr2 = Some(42),
          attr3 = Some(LocalDate.parse("2018-11-03"))
          ) // BaseModel(cff4545gvgf,John Doe,None,Some(42),Some(2018-11-03))
          val hlist = LabelledGeneric[BaseModel].to(bm)
          val hlist1 = hlist - 'attr1
          val bm1 = LabelledGeneric[BaseModel1].from(hlist1)
          // BaseModel1(cff4545gvgf,John Doe,Some(42),Some(2018-11-03))


          But Shapeless can't create a new case class. If you need a new case class to be created automatically you can write a macro.






          share|improve this answer














          What Shapeless can do is, given two case classes, create an object of one of them from an object of another.



          import java.time.LocalDate
          import shapeless.LabelledGeneric
          import shapeless.record._

          case class BaseModel(id: String,
          createdBy: String,
          attr1: Option[String] = None,
          attr2: Option[Int] = None,
          attr3: Option[LocalDate] = None)

          case class BaseModel1(id: String,
          createdBy: String,
          attr2: Option[Int] = None,
          attr3: Option[LocalDate] = None)

          val bm = BaseModel(
          id = "cff4545gvgf",
          createdBy = "John Doe",
          attr2 = Some(42),
          attr3 = Some(LocalDate.parse("2018-11-03"))
          ) // BaseModel(cff4545gvgf,John Doe,None,Some(42),Some(2018-11-03))
          val hlist = LabelledGeneric[BaseModel].to(bm)
          val hlist1 = hlist - 'attr1
          val bm1 = LabelledGeneric[BaseModel1].from(hlist1)
          // BaseModel1(cff4545gvgf,John Doe,Some(42),Some(2018-11-03))


          But Shapeless can't create a new case class. If you need a new case class to be created automatically you can write a macro.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 11 at 22:38









          franklin

          81842447




          81842447










          answered Nov 3 at 8:34









          Dmytro Mitin

          6,146515




          6,146515








          • 1




            stackoverflow.com/questions/22850340/… Maybe this?
            – franklin
            Nov 3 at 15:10










          • Does this mean that for generics, the Base Model needs to have all the fields of any possible Child Model?
            – franklin
            Nov 6 at 14:26










          • Sorry I don't understand your question. I guess it doesn't.
            – Dmytro Mitin
            Nov 6 at 14:34










          • No. I think it does. A ChildModel1 with types a, b, c, d and a ChildModel2 with types a, b, c, d, e must both extend a BaseModel with types a, b, c, d, e. The BaseModel must contain the product of all the types used in any child model.
            – franklin
            Nov 6 at 18:08






          • 1




            What Shapeless does, is tranformation from case class to some generic representation (hlist) and vice versa. You can do everything what you want with hlist, add fields, remove fields, transform fields. What Shapeless can't do is defining case classes.
            – Dmytro Mitin
            Nov 6 at 19:22














          • 1




            stackoverflow.com/questions/22850340/… Maybe this?
            – franklin
            Nov 3 at 15:10










          • Does this mean that for generics, the Base Model needs to have all the fields of any possible Child Model?
            – franklin
            Nov 6 at 14:26










          • Sorry I don't understand your question. I guess it doesn't.
            – Dmytro Mitin
            Nov 6 at 14:34










          • No. I think it does. A ChildModel1 with types a, b, c, d and a ChildModel2 with types a, b, c, d, e must both extend a BaseModel with types a, b, c, d, e. The BaseModel must contain the product of all the types used in any child model.
            – franklin
            Nov 6 at 18:08






          • 1




            What Shapeless does, is tranformation from case class to some generic representation (hlist) and vice versa. You can do everything what you want with hlist, add fields, remove fields, transform fields. What Shapeless can't do is defining case classes.
            – Dmytro Mitin
            Nov 6 at 19:22








          1




          1




          stackoverflow.com/questions/22850340/… Maybe this?
          – franklin
          Nov 3 at 15:10




          stackoverflow.com/questions/22850340/… Maybe this?
          – franklin
          Nov 3 at 15:10












          Does this mean that for generics, the Base Model needs to have all the fields of any possible Child Model?
          – franklin
          Nov 6 at 14:26




          Does this mean that for generics, the Base Model needs to have all the fields of any possible Child Model?
          – franklin
          Nov 6 at 14:26












          Sorry I don't understand your question. I guess it doesn't.
          – Dmytro Mitin
          Nov 6 at 14:34




          Sorry I don't understand your question. I guess it doesn't.
          – Dmytro Mitin
          Nov 6 at 14:34












          No. I think it does. A ChildModel1 with types a, b, c, d and a ChildModel2 with types a, b, c, d, e must both extend a BaseModel with types a, b, c, d, e. The BaseModel must contain the product of all the types used in any child model.
          – franklin
          Nov 6 at 18:08




          No. I think it does. A ChildModel1 with types a, b, c, d and a ChildModel2 with types a, b, c, d, e must both extend a BaseModel with types a, b, c, d, e. The BaseModel must contain the product of all the types used in any child model.
          – franklin
          Nov 6 at 18:08




          1




          1




          What Shapeless does, is tranformation from case class to some generic representation (hlist) and vice versa. You can do everything what you want with hlist, add fields, remove fields, transform fields. What Shapeless can't do is defining case classes.
          – Dmytro Mitin
          Nov 6 at 19:22




          What Shapeless does, is tranformation from case class to some generic representation (hlist) and vice versa. You can do everything what you want with hlist, add fields, remove fields, transform fields. What Shapeless can't do is defining case classes.
          – Dmytro Mitin
          Nov 6 at 19:22


















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53121345%2fhow-to-create-generated-objects-in-shapeless%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Xamarin.iOS Cant Deploy on Iphone

          Glorious Revolution

          Dulmage-Mendelsohn matrix decomposition in Python