@@ -124,15 +124,18 @@ instance Eq RelationTupleSet where
124124
125125instance NFData RelationTupleSet where rnf = genericRnf
126126
127−sortDataFrameBy :: Attribute -> DataFrame -> DataFrame
128−sortDataFrameBy attr (DataFrame attrs tupSet) =
129− case attr `elem` attrs of
130− True -> DataFrame attrs $ sortTupleSetBy (compareRelationTupleBy attr) tupSet
131− False -> error $ "No such attribute: " ++ show attr
132127
133−sortTupleSetBy :: (RelationTuple -> RelationTuple -> Ordering) -> RelationTupleSet -> RelationTupleSet
134−sortTupleSetBy compare' (RelationTupleSet tuples) =
135− RelationTupleSet $ L.sortBy compare' tuples
128+data AttributeOrderExpr = AttributeOrderExpr AttributeName Order deriving(Show)
129+data AttributeOrder = AttributeOrder Attribute Order deriving (Show)
130+data Order = ASC | DESC deriving (Eq,Show)
131+
132+sortDataFrameBy :: [AttributeOrder] -> DataFrame -> DataFrame
133+sortDataFrameBy attrOrders (DataFrame attrs tuples) =
134+ DataFrame attrs $ sortTuplesBy (compareRelationTupleByAttributeOrders attrOrders) tuples
135+
136+sortTuplesBy :: (RelationTuple -> RelationTuple -> Ordering) -> [RelationTuple] -> [RelationTuple]
137+sortTuplesBy compare' tuples =
138+ L.sortBy compare' tuples
136139
137140--the same hash must be generated for equal tuples so that the hashset equality works
138141instance Hashable RelationTuple where
@@ -168,8 +171,21 @@ instance NFData RelationTuple where rnf = genericRnf
168171
169172data DataFrameTuple = DataFrameTuple Attributes (V.Vector Atom) deriving (Eq, Show, Generic)
170173
171−compareRelationTupleBy :: Attribute -> RelationTuple -> RelationTuple -> Ordering
172−compareRelationTupleBy attr tuple1@(RelationTuple attrs1 tupVec1) tuple2@(RelationTuple attrs2 tupVec2) =
174+compareRelationTupleByAttributeOrders :: [AttributeOrder] -> RelationTuple -> RelationTuple -> Ordering
175+compareRelationTupleByAttributeOrders attributeOrders tup1 tup2 =
176+ let order_ (AttributeOrder _ ord) = ord
177+ attr_ (AttributeOrder attr _) = attr
178+ compare' (AttributeOrder attr order) = if order == DESC
179+ then compareRelationTupleByOneAttribute attr tup2 tup1
180+ else compareRelationTupleByOneAttribute attr tup1 tup2
181+ res = map compare' attributeOrders in
182+ case L.find (/=EQ) res of
183+ Nothing -> EQ
184+ Just order -> order
185+
186+
187+compareRelationTupleByOneAttribute :: Attribute -> RelationTuple -> RelationTuple -> Ordering
188+compareRelationTupleByOneAttribute attr tuple1@(RelationTuple attrs1 tupVec1) tuple2@(RelationTuple attrs2 tupVec2) =
173189 case attr `elem` attrs1 && attr `elem` attrs2 of
174190 True -> compare (atomForAttribute attr tuple1) (atomForAttribute attr tuple2)
175191 False -> error "Comparing two RelationTuples by an non-existent common attribute."
@@ -197,16 +213,19 @@ instance Hashable Relation where
197213
198214instance Binary Relation
199215
200−data DataFrame = DataFrame Attributes RelationTupleSet deriving (Show, Generic, Typeable)
216+data DataFrame = DataFrame Attributes [RelationTuple] deriving (Show, Generic, Typeable)
217+
218+take' :: Integer -> DataFrame -> DataFrame
219+take' n (DataFrame attrs tuples) = DataFrame attrs (take (fromInteger n) tuples)
201220
202−take' n (DataFrame attrs (RelationTupleSet xs)) = DataFrame attrs (RelationTupleSet $ take (fromInteger n) xs)
203−drop' n (DataFrame attrs (RelationTupleSet xs)) = DataFrame attrs (RelationTupleSet $ drop (fromInteger n) xs)
221+drop' :: Integer -> DataFrame -> DataFrame
222+drop' n (DataFrame attrs tuples) = DataFrame attrs (drop (fromInteger n) tuples)
204223
205224toDataFrame :: Relation -> DataFrame
206−toDataFrame (Relation attrs tupSet) = DataFrame attrs tupSet
225+toDataFrame (Relation attrs (RelationTupleSet tuples)) = DataFrame attrs tuples
207226
208227fromDataFrame :: DataFrame -> Relation
209−fromDataFrame (DataFrame attrs tupSet) = Relation attrs tupSet
228+fromDataFrame (DataFrame attrs tuples) = Relation attrs (RelationTupleSet tuples)
210229
211230-- | Used to represent the number of tuples in a relation.
212231data RelationCardinality = Countable | Finite Int deriving (Eq, Show, Generic, Ord)