@@ -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, Show, Binary, Typeable, NFData, Generic)
40+ deriving (Eq, Ord, 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
@@ -77,7 +77,9 @@ data AtomType = IntAtomType |
77 TypeVariableType TypeVarName
77 TypeVariableType TypeVarName
78 --wildcard used in Atom Functions and tuples for data constructors which don't provide all arguments to the type constructor
78 --wildcard used in Atom Functions and tuples for data constructors which don't provide all arguments to the type constructor
79 deriving (Eq, NFData, Generic, Binary, Show)
79 deriving (Eq, NFData, Generic, Binary, Show)
81+instance Ord AtomType where
81type TypeVarMap = M.Map TypeVarName AtomType
83type TypeVarMap = M.Map TypeVarName AtomType
83instance Hashable TypeVarMap where
85instance Hashable TypeVarMap where
@@ -122,6 +124,19 @@ instance Eq RelationTupleSet where
123instance 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
125--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
126instance Hashable RelationTuple where
141instance Hashable RelationTuple where
127 --sanity check the tuple for attribute and tuple counts
142 --sanity check the tuple for attribute and tuple counts
@@ -145,15 +160,45 @@ instance Binary RelationTuple
145instance Eq RelationTuple where
160instance Eq RelationTuple where
146 (==) tuple1@(RelationTuple attrs1 _) tuple2@(RelationTuple attrs2 _) = attributesEqual attrs1 attrs2 && atomsEqual
161 (==) tuple1@(RelationTuple attrs1 _) tuple2@(RelationTuple attrs2 _) = attributesEqual attrs1 attrs2 && atomsEqual
148− atomForAttribute attr (RelationTuple attrs tupVec) = case V.findIndex (== attr) attrs of
150− Just index -> tupVec V.!? index
151 atomsEqual = V.all (== True) $ V.map (\attr -> atomForAttribute attr tuple1 == atomForAttribute attr tuple2) attrs1
163 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
153instance NFData RelationTuple where rnf = genericRnf
170instance 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."
155data Relation = Relation Attributes RelationTupleSet deriving (Show, Generic,Typeable)
193data Relation = Relation Attributes RelationTupleSet deriving (Show, Generic,Typeable)
195+instance Ord Relation where
196+ compare (Relation attrs1 tupSet1) (Relation attrs2 tupSet2) = undefined
157instance Eq Relation where
202instance Eq Relation where
158 Relation attrs1 tupSet1 == Relation attrs2 tupSet2 = attributesEqual attrs1 attrs2 && tupSet1 == tupSet2
203 Relation attrs1 tupSet1 == Relation attrs2 tupSet2 = attributesEqual attrs1 attrs2 && tupSet1 == tupSet2
@@ -167,7 +212,21 @@ instance Hashable Relation where
167 sortedAttrs = map snd (sortedAttributesIndices attrs)
212 sortedAttrs = map snd (sortedAttributesIndices attrs)
169instance Binary Relation
214instance 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)
171-- | Used to represent the number of tuples in a relation.
230-- | Used to represent the number of tuples in a relation.
172data RelationCardinality = Countable | Finite Int deriving (Eq, Show, Generic, Ord)
231data RelationCardinality = Countable | Finite Int deriving (Eq, Show, Generic, Ord)