@@ -37,7 +37,7 @@ data Atom = IntegerAtom Integer |
37 BoolAtom Bool |
37 BoolAtom Bool |
38 RelationAtom Relation |
38 RelationAtom Relation |
39 ConstructedAtom DataConstructorName AtomType [Atom]
39 ConstructedAtom DataConstructorName AtomType [Atom]
40− deriving (Eq, Ord, Show, Binary, Typeable, NFData, Generic)
40+ deriving (Eq, Show, Binary, Typeable, NFData, Generic)
42instance Hashable Atom where
42instance Hashable Atom where
43 hashWithSalt salt (ConstructedAtom dConsName _ atoms) = salt `hashWithSalt` atoms
43 hashWithSalt salt (ConstructedAtom dConsName _ atoms) = salt `hashWithSalt` atoms
@@ -124,19 +124,6 @@ instance Eq RelationTupleSet where
125instance NFData RelationTupleSet where rnf = genericRnf
125instance NFData RelationTupleSet where rnf = genericRnf
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
136−sortTuplesBy :: (RelationTuple -> RelationTuple -> Ordering) -> [RelationTuple] -> [RelationTuple]
137−sortTuplesBy compare' tuples =
138− L.sortBy compare' tuples
140--the same hash must be generated for equal tuples so that the hashset equality works
127--the same hash must be generated for equal tuples so that the hashset equality works
141instance Hashable RelationTuple where
128instance Hashable RelationTuple where
142 --sanity check the tuple for attribute and tuple counts
129 --sanity check the tuple for attribute and tuple counts
@@ -160,45 +147,16 @@ instance Binary RelationTuple
160instance Eq RelationTuple where
147instance Eq RelationTuple where
161 (==) tuple1@(RelationTuple attrs1 _) tuple2@(RelationTuple attrs2 _) = attributesEqual attrs1 attrs2 && atomsEqual
148 (==) tuple1@(RelationTuple attrs1 _) tuple2@(RelationTuple attrs2 _) = attributesEqual attrs1 attrs2 && atomsEqual
150+ atomForAttribute attr (RelationTuple attrs tupVec) = case V.findIndex (== attr) attrs of
152+ Just index -> tupVec V.!? index
163− atomsEqual = V.all (== True) $ V.map (\attr -> atomForAttribute attr tuple1 == atomForAttribute attr tuple2) attrs1
153+ atomsEqual = V.all (== True) $ V.map (\attr -> atomForAttribute attr tuple1 == atomForAttribute attr tuple2) attrs1
165−atomForAttribute attr (RelationTuple attrs tupVec) =
166− case V.findIndex (== attr) attrs of
168− Just index -> tupVec V.!? index
170instance NFData RelationTuple where rnf = genericRnf
155instance NFData RelationTuple where rnf = genericRnf
172−data 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
187−compareRelationTupleByOneAttribute :: Attribute -> RelationTuple -> RelationTuple -> Ordering
188−compareRelationTupleByOneAttribute attr tuple1@(RelationTuple attrs1 tupVec1) tuple2@(RelationTuple attrs2 tupVec2) =
189− case attr `elem` attrs1 && attr `elem` attrs2 of
190− True -> compare (atomForAttribute attr tuple1) (atomForAttribute attr tuple2)
191− False -> error "Comparing two RelationTuples by an non-existent common attribute."
193data Relation = Relation Attributes RelationTupleSet deriving (Show, Generic,Typeable)
158data Relation = Relation Attributes RelationTupleSet deriving (Show, Generic,Typeable)
195−instance Ord Relation where
196− compare (Relation attrs1 tupSet1) (Relation attrs2 tupSet2) = undefined
202instance Eq Relation where
160instance Eq Relation where
203 Relation attrs1 tupSet1 == Relation attrs2 tupSet2 = attributesEqual attrs1 attrs2 && tupSet1 == tupSet2
161 Relation attrs1 tupSet1 == Relation attrs2 tupSet2 = attributesEqual attrs1 attrs2 && tupSet1 == tupSet2
@@ -213,20 +171,6 @@ instance Hashable Relation where
214instance Binary Relation
172instance Binary Relation
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)
221−drop' :: Integer -> DataFrame -> DataFrame
222−drop' n (DataFrame attrs tuples) = DataFrame attrs (drop (fromInteger n) tuples)
224−toDataFrame :: Relation -> DataFrame
225−toDataFrame (Relation attrs (RelationTupleSet tuples)) = DataFrame attrs tuples
227−fromDataFrame :: DataFrame -> Relation
228−fromDataFrame (DataFrame attrs tuples) = Relation attrs (RelationTupleSet tuples)
230-- | Used to represent the number of tuples in a relation.
174-- | Used to represent the number of tuples in a relation.
231data RelationCardinality = Countable | Finite Int deriving (Eq, Show, Generic, Ord)
175data RelationCardinality = Countable | Finite Int deriving (Eq, Show, Generic, Ord)