@@ -2,23 +2,27 @@ package frameless
2
2
3
3
import java .math .BigInteger
4
4
import java .util .Date
5
- import java .time .{Duration , Instant , LocalDate , Period }
5
+ import java .time .{ Duration , Instant , LocalDate , Period }
6
6
import java .sql .Timestamp
7
7
import scala .reflect .ClassTag
8
8
import org .apache .spark .sql .FramelessInternals
9
9
import org .apache .spark .sql .FramelessInternals .UserDefinedType
10
- import org .apache .spark .sql .{reflection => ScalaReflection }
10
+ import org .apache .spark .sql .{ reflection => ScalaReflection }
11
11
import org .apache .spark .sql .catalyst .expressions ._
12
12
import org .apache .spark .sql .catalyst .expressions .objects ._
13
- import org .apache .spark .sql .catalyst .util .{ArrayBasedMapData , DateTimeUtils , GenericArrayData }
13
+ import org .apache .spark .sql .catalyst .util .{
14
+ ArrayBasedMapData ,
15
+ DateTimeUtils ,
16
+ GenericArrayData
17
+ }
14
18
import org .apache .spark .sql .types ._
15
19
import org .apache .spark .unsafe .types .UTF8String
16
20
import shapeless ._
17
21
import shapeless .ops .hlist .IsHCons
18
22
19
23
import scala .collection .generic .CanBuildFrom
20
24
import scala .collection .immutable .HashSet .HashTrieSet
21
- import scala .collection .immutable .{ListSet , TreeSet }
25
+ import scala .collection .immutable .{ ListSet , TreeSet }
22
26
23
27
abstract class TypedEncoder [T ](
24
28
implicit
@@ -507,44 +511,72 @@ object TypedEncoder {
507
511
}
508
512
509
513
object CollectionConversion {
510
- implicit def seqToSeq [Y ](implicit cbf : CanBuildFrom [Nothing , Y , Seq [Y ]]) = new CollectionConversion [Seq , Seq , Y ] {
514
+
515
+ implicit def seqToSeq [Y ](
516
+ implicit
517
+ cbf : CanBuildFrom [Nothing , Y , Seq [Y ]]
518
+ ) = new CollectionConversion [Seq , Seq , Y ] {
511
519
override def convert (c : Seq [Y ]): Seq [Y ] = c
512
520
}
513
- implicit def seqToVector [Y ](implicit cbf : CanBuildFrom [Nothing , Y , Vector [Y ]]) = new CollectionConversion [Seq , Vector , Y ] {
521
+
522
+ implicit def seqToVector [Y ](
523
+ implicit
524
+ cbf : CanBuildFrom [Nothing , Y , Vector [Y ]]
525
+ ) = new CollectionConversion [Seq , Vector , Y ] {
514
526
override def convert (c : Seq [Y ]): Vector [Y ] = c.toVector
515
527
}
516
- implicit def seqToList [Y ](implicit cbf : CanBuildFrom [Nothing , Y , List [Y ]]) = new CollectionConversion [Seq , List , Y ] {
528
+
529
+ implicit def seqToList [Y ](
530
+ implicit
531
+ cbf : CanBuildFrom [Nothing , Y , List [Y ]]
532
+ ) = new CollectionConversion [Seq , List , Y ] {
517
533
override def convert (c : Seq [Y ]): List [Y ] = c.toList
518
534
}
519
- implicit def setToSet [Y ](implicit cbf : CanBuildFrom [Nothing , Y , Set [Y ]]) = new CollectionConversion [Set , Set , Y ] {
535
+
536
+ implicit def setToSet [Y ](
537
+ implicit
538
+ cbf : CanBuildFrom [Nothing , Y , Set [Y ]]
539
+ ) = new CollectionConversion [Set , Set , Y ] {
520
540
override def convert (c : Set [Y ]): Set [Y ] = c
521
541
}
522
- implicit def setToTreeSet [Y ](implicit cbf : CanBuildFrom [Nothing , Y , TreeSet [Y ]]) = new CollectionConversion [Set , TreeSet , Y ] {
542
+
543
+ implicit def setToTreeSet [Y ](
544
+ implicit
545
+ cbf : CanBuildFrom [Nothing , Y , TreeSet [Y ]]
546
+ ) = new CollectionConversion [Set , TreeSet , Y ] {
523
547
override def convert (c : Set [Y ]): TreeSet [Y ] = c.to[TreeSet ]
524
548
}
525
- implicit def setToListSet [Y ](implicit cbf : CanBuildFrom [Nothing , Y , ListSet [Y ]]) = new CollectionConversion [Set , ListSet , Y ] {
549
+
550
+ implicit def setToListSet [Y ](
551
+ implicit
552
+ cbf : CanBuildFrom [Nothing , Y , ListSet [Y ]]
553
+ ) = new CollectionConversion [Set , ListSet , Y ] {
526
554
override def convert (c : Set [Y ]): ListSet [Y ] = c.to[ListSet ]
527
555
}
528
- implicit def setToTrieSet [Y ](implicit cbf : CanBuildFrom [Nothing , Y , HashTrieSet [Y ]]) = new CollectionConversion [Set , HashTrieSet , Y ] {
556
+
557
+ implicit def setToTrieSet [Y ](
558
+ implicit
559
+ cbf : CanBuildFrom [Nothing , Y , HashTrieSet [Y ]]
560
+ ) = new CollectionConversion [Set , HashTrieSet , Y ] {
529
561
override def convert (c : Set [Y ]): HashTrieSet [Y ] = c.to[HashTrieSet ]
530
562
}
531
563
}
532
564
533
565
implicit def seqEncoder [C [X ] <: Seq [X ], T ](
534
- implicit
535
- i0 : Lazy [RecordFieldEncoder [T ]],
536
- i1 : ClassTag [C [T ]],
537
- i2 : CollectionConversion [Seq , C , T ],
538
- i3 : CanBuildFrom [Nothing , T , C [T ]]
539
- ) = collectionEncoder[Seq , C , T ]
566
+ implicit
567
+ i0 : Lazy [RecordFieldEncoder [T ]],
568
+ i1 : ClassTag [C [T ]],
569
+ i2 : CollectionConversion [Seq , C , T ],
570
+ i3 : CanBuildFrom [Nothing , T , C [T ]]
571
+ ) = collectionEncoder[Seq , C , T ]
540
572
541
573
implicit def setEncoder [C [X ] <: Set [X ], T ](
542
- implicit
543
- i0 : Lazy [RecordFieldEncoder [T ]],
544
- i1 : ClassTag [C [T ]],
545
- i2 : CollectionConversion [Set , C , T ],
546
- i3 : CanBuildFrom [Nothing , T , C [T ]]
547
- ) = collectionEncoder[Set , C , T ]
574
+ implicit
575
+ i0 : Lazy [RecordFieldEncoder [T ]],
576
+ i1 : ClassTag [C [T ]],
577
+ i2 : CollectionConversion [Set , C , T ],
578
+ i3 : CanBuildFrom [Nothing , T , C [T ]]
579
+ ) = collectionEncoder[Set , C , T ]
548
580
549
581
def collectionEncoder [O [_], C [X ], T ](
550
582
implicit
@@ -569,19 +601,26 @@ object TypedEncoder {
569
601
NewInstance (classOf [GenericArrayData ], path :: Nil , catalystRepr)
570
602
} else {
571
603
// converts to Seq, both Set and Seq handling must convert to Seq first
572
- MapObjects (enc.toCatalyst, SeqCaster (path), enc.jvmRepr, encodeT.nullable)
604
+ MapObjects (
605
+ enc.toCatalyst,
606
+ SeqCaster (path),
607
+ enc.jvmRepr,
608
+ encodeT.nullable
609
+ )
573
610
}
574
611
}
575
612
576
613
def fromCatalyst (path : Expression ): Expression =
577
614
CollectionCaster [O , C , T ](
578
615
MapObjects (
579
- i0.value.fromCatalyst,
580
- path,
581
- encodeT.catalystRepr,
582
- encodeT.nullable,
583
- Some (i1.runtimeClass) // This will cause MapObjects to build a collection of type C[_] directly when compiling
584
- ), implicitly[CollectionConversion [O ,C ,T ]]) // This will convert Seq to the appropriate C[_] when eval'ing.
616
+ i0.value.fromCatalyst,
617
+ path,
618
+ encodeT.catalystRepr,
619
+ encodeT.nullable,
620
+ Some (i1.runtimeClass) // This will cause MapObjects to build a collection of type C[_] directly when compiling
621
+ ),
622
+ implicitly[CollectionConversion [O , C , T ]]
623
+ ) // This will convert Seq to the appropriate C[_] when eval'ing.
585
624
586
625
override def toString : String = s " collectionEncoder( $jvmRepr) "
587
626
}
@@ -591,18 +630,19 @@ object TypedEncoder {
591
630
* @param i2 implicit `ClassTag[Set[T]]` to provide runtime information about the set type.
592
631
* @tparam T the element type of the set.
593
632
* @return a `TypedEncoder` instance for `Set[T]`.
594
-
595
- implicit def setEncoder[C[X] <: Seq[X], T](
596
- implicit
597
- i1: shapeless.Lazy[RecordFieldEncoder[T]],
598
- i2: ClassTag[Set[T]],
599
- i3: CollectionConversion[Set, C, T],
600
- i4: CanBuildFrom[Nothing, T, C[T]]
601
- ): TypedEncoder[Set[T]] = {
602
- implicit val inj: Injection[Set[T], Seq[T]] = Injection(_.toSeq, _.toSet)
603
-
604
- TypedEncoder.usingInjection
605
- }*/
633
+ *
634
+ * implicit def setEncoder[C[X] <: Seq[X], T](
635
+ * implicit
636
+ * i1: shapeless.Lazy[RecordFieldEncoder[T]],
637
+ * i2: ClassTag[Set[T]],
638
+ * i3: CollectionConversion[Set, C, T],
639
+ * i4: CanBuildFrom[Nothing, T, C[T]]
640
+ * ): TypedEncoder[Set[T]] = {
641
+ * implicit val inj: Injection[Set[T], Seq[T]] = Injection(_.toSeq, _.toSet)
642
+ *
643
+ * TypedEncoder.usingInjection
644
+ * }
645
+ */
606
646
607
647
/**
608
648
* @tparam A the key type
0 commit comments