on dev help sign in
join ref?
e4daf37Eitan Chatav
squeal-postgresql/src/Squeal/PostgreSQL/Query.hs+34−24
@@ -77,6 +77,7 @@ import Data.Word
77import Generics.SOP hiding (from)
77import Generics.SOP hiding (from)
78import GHC.TypeLits
78import GHC.TypeLits
79
79
80+import qualified Data.ByteString as ByteString
80import qualified GHC.Generics as GHC
81import qualified GHC.Generics as GHC
81
82
82import Squeal.PostgreSQL.Expression
83import Squeal.PostgreSQL.Expression
@@ -618,6 +619,9 @@ data FromClause schema params tables where
618 Subquery
619 Subquery
619 :: Aliased (Query schema params) table
620 :: Aliased (Query schema params) table
620 -> FromClause schema params '[table]
621 -> FromClause schema params '[table]
622+ JoinRef
623+ :: JoinRef schema tables
624+ -> FromClause schema params tables
621 CrossJoin
625 CrossJoin
622 :: FromClause schema params right
626 :: FromClause schema params right
623 -> FromClause schema params left
627 -> FromClause schema params left
@@ -648,6 +652,7 @@ data FromClause schema params tables where
648renderFromClause :: FromClause schema params tables -> ByteString
652renderFromClause :: FromClause schema params tables -> ByteString
649renderFromClause = \case
653renderFromClause = \case
650 Table table -> renderAliasedAs renderTable table
654 Table table -> renderAliasedAs renderTable table
655+ JoinRef joinRef -> renderJoinRef joinRef
651 Subquery selection -> renderAliasedAs (parenthesized . renderQuery) selection
656 Subquery selection -> renderAliasedAs (parenthesized . renderQuery) selection
652 CrossJoin right left ->
657 CrossJoin right left ->
653 renderFromClause left <+> "CROSS JOIN" <+> renderFromClause right
658 renderFromClause left <+> "CROSS JOIN" <+> renderFromClause right
@@ -660,30 +665,35 @@ renderFromClause = \case
660 renderFromClause left <+> op <+> renderFromClause right
665 renderFromClause left <+> op <+> renderFromClause right
661 <+> "ON" <+> renderExpression on
666 <+> "ON" <+> renderExpression on
662
667
663−-- joinRef
668+newtype JoinRef (schema :: TablesType) (relations :: RelationsType)
669+ = UnsafeJoinRef { renderJoinRef :: ByteString }
670+ deriving (GHC.Generic,Show,Eq,Ord,NFData)
671+
672+utilizing
664−-- :: ( Has lefttable schema (constraints :=> leftcolumns)
673+ :: ( Has left schema (constraints :=> lcols)
665−-- , leftrel ~ ColumnsToRelation leftcolumns
674+ , ColumnsToRelation lcols ~ lrel
666−-- , Has righttable schema right
675+ , Has right (TablesToRelations schema) rrel
667−-- , rightrel ~ ColumnsToRelation (TableToColumns right)
668−-- , Has ref constraints ('ForeignKey keys reftable refs)
676+ , Has ref constraints ('ForeignKey lnames right rnames)
669−-- , SListI keys, All KnownSymbol keys
677+ , All KnownSymbol lnames
670−-- , SListI refs, All KnownSymbol refs
678+ , All KnownSymbol rnames
671−-- , KnownSymbol leftalias, KnownSymbol rightalias
672−-- )
679+ )
673−-- => Aliased Alias (rightalias ::: righttable)
680+ => (Alias right, NP Alias rnames)
674−-- -> Alias ref
681+ -> Alias ref
675−-- -> Aliased Alias (leftalias ::: lefttable)
682+ -> (Alias left, NP Alias lnames)
676−-- -> FromClause schema params '[leftalias ::: leftrel, rightalias ::: rightrel]
683+ -> JoinRef schema '[left ::: lrel,right ::: rrel]
677−-- joinRef
684+utilizing (rtab,rcols) _ref (ltab,lcols) = UnsafeJoinRef $
678−-- ((_ :: Alias righttable) `As` rightalias)
685+ lname <+> "JOIN" <+> rname <+> "ON" <+> refEq
679−-- ref
680−-- ((_ :: Alias lefttable) `As` leftalias) =
681−-- InnerJoin
682−-- (Table (fromLabel @righttable `As` rightalias))
683−-- refEq
684−-- (Table (fromLabel @lefttable `As` leftalias))
685−-- where
686+ where
686−-- refEq = undefined
687+ lname = renderAlias ltab
688+ rname = renderAlias rtab
689+ eq1 lcol rcol = lname <> "." <> lcol <> " = " <> rname <> "." <> rcol
690+ renderAliases :: All KnownSymbol names => NP Alias names -> [ByteString]
691+ renderAliases = \case
692+ Nil -> []
693+ alias :* aliases -> renderAlias alias : renderAliases aliases
694+ refEq = ByteString.intercalate " AND " $ zipWith eq1
695+ (renderAliases lcols)
696+ (renderAliases rcols)
687
697
688{-----------------------------------------
698{-----------------------------------------
689Grouping
699Grouping