on master help sign in
update schema isomorphs on database context expr DDL

resolves #54

commitb6474998565a9135ae7a3c6126e454be7636271d authorAgentM <agentm@themactionfaction.com> dateMon 14 Nov 2016, 21:36 (10 years ago) parentb656f57
2 files changed+17−1
src/lib/ProjectM36/Client.hs+2−1 src/lib/ProjectM36/IsomorphicSchema.hs+15
src/lib/ProjectM36/Client.hs+2−1
@@ -437,7 +437,8 @@ executeDatabaseContextExpr sessionId (InProcessConnection _ _ sessions _ _) expr
437437 (Just err,_) -> return $ Just err
438438 (Nothing, context') -> do
439439 let newDiscon = DisconnectedTransaction (Sess.parentId session) newSchemas
440− newSchemas = Schemas context' (Sess.subschemas session)
440+ newSubschemas = Schema.processDatabaseContextExprSchemasUpdate (Sess.subschemas session) expr
441+ newSchemas = Schemas context' newSubschemas
441442 newSession = Session newDiscon (Sess.schemaName session)
442443 STMMap.insert newSession sessionId sessions
443444 pure Nothing
src/lib/ProjectM36/IsomorphicSchema.hs+15
@@ -109,6 +109,21 @@ processDatabaseContextExprInSchema schema@(Schema morphs) dbExpr = do
109109 _ <- validateDatabaseContextExprInSchema schema dbExpr
110110 --perform the morph
111111 foldM (\ex morph -> databaseContextExprMorph morph relExprMogrifier ex) dbExpr morphs
112+
113+-- | If the database context expression adds or removes a relvar, we need to update the isomorphs to create a passthrough Isomorph.
114+processDatabaseContextExprSchemaUpdate :: Schema -> DatabaseContextExpr -> Schema
115+processDatabaseContextExprSchemaUpdate schema@(Schema morphs) expr = case expr of
116+ Define rv _ | S.notMember rv validSchemaName -> passthru rv
117+ Assign rv _ | S.notMember rv validSchemaName -> passthru rv
118+ Undefine rv | S.member rv validSchemaName -> Schema (filter (\morph -> elem rv (isomorphInRelVarNames morph)) morphs)
119+ MultipleExpr exprs -> foldr (\expr' schema' -> processDatabaseContextExprSchemaUpdate schema' expr') schema exprs
120+ _ -> schema
121+ where
122+ validSchemaName = isomorphsInRelVarNames morphs
123+ passthru rvname = Schema (morphs ++ [IsoRename rvname rvname])
124+
125+processDatabaseContextExprSchemasUpdate :: Subschemas -> DatabaseContextExpr -> Subschemas
126+processDatabaseContextExprSchemasUpdate subschemas expr = M.map (\schema -> processDatabaseContextExprSchemaUpdate schema expr) subschemas
112127
113128-- re-evaluate- it's not possible to display an incdep that may be for a foreign key to a relvar which is not available in the subschema!
114129-- weird compromise: allow inclusion dependencies failures not in the subschema to be propagated- in the worst case, only the inclusion dependency's name is leaked.