@@ -124,15 +124,18 @@ instance Eq RelationTupleSet where
125instance NFData RelationTupleSet where rnf = genericRnf
125instance NFData RelationTupleSet where rnf = genericRnf
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
128+data AttributeOrderExpr = AttributeOrderExpr AttributeName Order deriving(Show)
129+data AttributeOrder = AttributeOrder Attribute Order deriving (Show)
130+data Order = ASC | DESC deriving (Eq,Show)
132+sortDataFrameBy :: [AttributeOrder] -> DataFrame -> DataFrame
133+sortDataFrameBy attrOrders (DataFrame attrs tuples) =
134+ DataFrame attrs $ sortTuplesBy (compareRelationTupleByAttributeOrders attrOrders) tuples
133−sortTupleSetBy :: (RelationTuple -> RelationTuple -> Ordering) -> RelationTupleSet -> RelationTupleSet
136+sortTuplesBy :: (RelationTuple -> RelationTuple -> Ordering) -> [RelationTuple] -> [RelationTuple]
134−sortTupleSetBy compare' (RelationTupleSet tuples) =
137+sortTuplesBy compare' tuples =
135− RelationTupleSet $ L.sortBy compare' tuples
138+ L.sortBy compare' tuples
137--the same hash must be generated for equal tuples so that the hashset equality works
140--the same hash must be generated for equal tuples so that the hashset equality works
138instance Hashable RelationTuple where
141instance Hashable RelationTuple where
@@ -168,8 +171,21 @@ instance NFData RelationTuple where rnf = genericRnf
169data DataFrameTuple = DataFrameTuple Attributes (V.Vector Atom) deriving (Eq, Show, Generic)
172data DataFrameTuple = DataFrameTuple Attributes (V.Vector Atom) deriving (Eq, Show, Generic)
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
171−compareRelationTupleBy :: Attribute -> RelationTuple -> RelationTuple -> Ordering
187+compareRelationTupleByOneAttribute :: Attribute -> RelationTuple -> RelationTuple -> Ordering
172−compareRelationTupleBy attr tuple1@(RelationTuple attrs1 tupVec1) tuple2@(RelationTuple attrs2 tupVec2) =
188+compareRelationTupleByOneAttribute attr tuple1@(RelationTuple attrs1 tupVec1) tuple2@(RelationTuple attrs2 tupVec2) =
173 case attr `elem` attrs1 && attr `elem` attrs2 of
189 case attr `elem` attrs1 && attr `elem` attrs2 of
174 True -> compare (atomForAttribute attr tuple1) (atomForAttribute attr tuple2)
190 True -> compare (atomForAttribute attr tuple1) (atomForAttribute attr tuple2)
175 False -> error "Comparing two RelationTuples by an non-existent common attribute."
191 False -> error "Comparing two RelationTuples by an non-existent common attribute."
@@ -197,16 +213,19 @@ instance Hashable Relation where
198instance Binary Relation
214instance Binary Relation
200−data DataFrame = DataFrame Attributes RelationTupleSet deriving (Show, Generic, Typeable)
216+data DataFrame = DataFrame Attributes [RelationTuple] deriving (Show, Generic, Typeable)
218+take' :: Integer -> DataFrame -> DataFrame
219+take' n (DataFrame attrs tuples) = DataFrame attrs (take (fromInteger n) tuples)
202−take' n (DataFrame attrs (RelationTupleSet xs)) = DataFrame attrs (RelationTupleSet $ take (fromInteger n) xs)
221+drop' :: Integer -> DataFrame -> DataFrame
203−drop' n (DataFrame attrs (RelationTupleSet xs)) = DataFrame attrs (RelationTupleSet $ drop (fromInteger n) xs)
222+drop' n (DataFrame attrs tuples) = DataFrame attrs (drop (fromInteger n) tuples)
205toDataFrame :: Relation -> DataFrame
224toDataFrame :: Relation -> DataFrame
206−toDataFrame (Relation attrs tupSet) = DataFrame attrs tupSet
225+toDataFrame (Relation attrs (RelationTupleSet tuples)) = DataFrame attrs tuples
208fromDataFrame :: DataFrame -> Relation
227fromDataFrame :: DataFrame -> Relation
209−fromDataFrame (DataFrame attrs tupSet) = Relation attrs tupSet
228+fromDataFrame (DataFrame attrs tuples) = Relation attrs (RelationTupleSet tuples)
211-- | Used to represent the number of tuples in a relation.
230-- | Used to represent the number of tuples in a relation.
212data RelationCardinality = Countable | Finite Int deriving (Eq, Show, Generic, Ord)
231data RelationCardinality = Countable | Finite Int deriving (Eq, Show, Generic, Ord)