Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
04/04/09 15:46:43 (15 years ago)
Author:
svonolfe
Message:

Improved handling of binary relations (#527)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/ClientGroupAdapter.cs

    r1468 r1515  
    7777    }
    7878  }
     79
     80  class ClientGroup_ResourceAdapterWrapper :
     81  DataAdapterWrapperBase<dsHiveServerTableAdapters.ClientGroup_ResourceTableAdapter,
     82  BinaryRelation,
     83  dsHiveServer.ClientGroup_ResourceRow> {
     84    public override dsHiveServer.ClientGroup_ResourceRow
     85     InsertNewRow(BinaryRelation relation) {
     86      dsHiveServer.ClientGroup_ResourceDataTable data =
     87         new dsHiveServer.ClientGroup_ResourceDataTable();
     88
     89      dsHiveServer.ClientGroup_ResourceRow row =
     90        data.NewClientGroup_ResourceRow();
     91
     92      row.ClientGroupId = relation.Id;
     93      row.ResourceId = relation.Id2;
     94
     95      data.AddClientGroup_ResourceRow(row);
     96      TransactionalAdapter.Update(row);
     97
     98      return row;
     99    }
     100
     101    public override void
     102      UpdateRow(dsHiveServer.ClientGroup_ResourceRow row) {
     103      TransactionalAdapter.Update(row);
     104    }
     105
     106    public override IEnumerable<dsHiveServer.ClientGroup_ResourceRow>
     107      FindById(Guid id) {
     108      return TransactionalAdapter.GetDataByClientGroupId(id);
     109    }
     110
     111    public override IEnumerable<dsHiveServer.ClientGroup_ResourceRow>
     112      FindAll() {
     113      return TransactionalAdapter.GetData();
     114    }
     115
     116    protected override void SetConnection(DbConnection connection) {
     117      adapter.Connection = connection as SqlConnection;
     118    }
     119
     120    protected override void SetTransaction(DbTransaction transaction) {
     121      adapter.Transaction = transaction as SqlTransaction;
     122    }
     123  }
    79124 
    80125  class ClientGroupAdapter :
     
    84129    IClientGroupAdapter {
    85130    #region Fields
    86     private dsHiveServerTableAdapters.ClientGroup_ResourceTableAdapter resourceClientGroupAdapter =
    87       new dsHiveServerTableAdapters.ClientGroup_ResourceTableAdapter();
     131    private BinaryRelationHelper<
     132      dsHiveServerTableAdapters.ClientGroup_ResourceTableAdapter,
     133      dsHiveServer.ClientGroup_ResourceRow> binaryRelationHelper = null;
     134
     135    private BinaryRelationHelper<dsHiveServerTableAdapters.ClientGroup_ResourceTableAdapter,
     136      dsHiveServer.ClientGroup_ResourceRow> BinaryRelationHelper {
     137      get {
     138        if (binaryRelationHelper == null) {
     139          binaryRelationHelper =
     140            new BinaryRelationHelper<dsHiveServerTableAdapters.ClientGroup_ResourceTableAdapter,
     141              dsHiveServer.ClientGroup_ResourceRow>(new ClientGroup_ResourceAdapterWrapper());
     142        }
     143
     144        binaryRelationHelper.Session = Session as Session;
     145
     146        return binaryRelationHelper;
     147      }
     148    }
    88149
    89150    private IResourceAdapter resourceAdapter = null;
     
    122183        /*Parent - Permission Owner*/
    123184        clientGroup.Id = row.ResourceId;
    124         ResAdapter.GetById(clientGroup);
    125 
    126         //first check for created references
    127         dsHiveServer.ClientGroup_ResourceDataTable clientGroupRows =
    128             resourceClientGroupAdapter.GetDataByClientGroupId(clientGroup.Id);
    129 
    130         foreach (dsHiveServer.ClientGroup_ResourceRow resourceClientGroupRow in
    131           clientGroupRows) {
    132           Resource resource = null;
    133 
    134           IEnumerable<Resource> resources =
    135             from p in
    136               clientGroup.Resources
    137             where p.Id == resourceClientGroupRow.ResourceId
    138             select p;
    139           if (resources.Count<Resource>() == 1)
    140             resource = resources.First<Resource>();
    141 
    142           if (resource == null) {
    143             Resource res =
    144               ClientAdapter.GetById(resourceClientGroupRow.ResourceId);
    145 
    146             if (res == null) {
    147               //is a client group
    148               res =
    149                 GetById(resourceClientGroupRow.ResourceId);
    150             }
    151 
    152             if (res != null)
    153               clientGroup.Resources.Add(res);
    154           }
    155         }
    156 
    157         //secondly check for deleted references
    158         ICollection<Resource> deleted =
    159           new List<Resource>();
    160 
    161         foreach (Resource resource in clientGroup.Resources) {
    162           dsHiveServer.ClientGroup_ResourceDataTable found =
    163             resourceClientGroupAdapter.GetDataByClientGroupResourceId(
    164             clientGroup.Id,
    165             resource.Id);
    166 
    167           if (found.Count != 1) {
    168             deleted.Add(resource);
    169           }
    170         }
    171 
    172         foreach (Resource resource in deleted) {
    173           clientGroup.Resources.Remove(resource);
     185        ResAdapter.GetById(clientGroup.Id);
     186
     187        ICollection<Guid> resources =
     188          BinaryRelationHelper.GetRelationships(clientGroup.Id);
     189
     190       clientGroup.Resources.Clear();
     191        foreach(Guid resource in resources) {
     192          ClientInfo client =
     193            ClientAdapter.GetById(resource);
     194
     195          if (client == null) {
     196            //client group
     197            ClientGroup group =
     198              GetById(resource);
     199
     200            clientGroup.Resources.Add(group);
     201          } else {
     202            clientGroup.Resources.Add(client);
     203          }         
    174204        }
    175205
     
    183213      if (clientGroup != null && row != null) {
    184214        row.ResourceId = clientGroup.Id;
    185 
    186         //update references
    187         foreach (Resource resource in clientGroup.Resources) {
    188           //first update the member to make sure it exists in the DB
    189           if (resource is ClientInfo) {
    190             ClientAdapter.Update(resource as ClientInfo);
    191           } else if (resource is ClientGroup) {
    192             Update(resource as ClientGroup);
    193           }
    194 
    195           //secondly check for created references
    196           dsHiveServer.ClientGroup_ResourceRow resourceClientGroupRow =
    197             null;
    198           dsHiveServer.ClientGroup_ResourceDataTable found =
    199             resourceClientGroupAdapter.GetDataByClientGroupResourceId(
    200               clientGroup.Id,
    201               resource.Id);
    202           if (found.Count == 1)
    203             resourceClientGroupRow = found[0];
    204 
    205           if (resourceClientGroupRow == null) {
    206             resourceClientGroupRow =
    207               found.NewClientGroup_ResourceRow();
    208 
    209             resourceClientGroupRow.ResourceId =
    210               resource.Id;
    211             resourceClientGroupRow.ClientGroupId =
    212               clientGroup.Id;
    213 
    214             found.AddClientGroup_ResourceRow(resourceClientGroupRow);
    215 
    216             resourceClientGroupAdapter.Update(
    217               resourceClientGroupRow);
    218           }
    219         }
    220 
    221         //thirdly check for deleted references
    222         dsHiveServer.ClientGroup_ResourceDataTable clientGroupRows =
    223           resourceClientGroupAdapter.GetDataByClientGroupId(clientGroup.Id);
    224 
    225         ICollection<dsHiveServer.ClientGroup_ResourceRow> deleted =
    226           new List<dsHiveServer.ClientGroup_ResourceRow>();
    227 
    228         foreach (dsHiveServer.ClientGroup_ResourceRow resourceClientGroupRow in
    229           clientGroupRows) {
    230           Resource resource = null;
    231 
    232           IEnumerable<Resource> resources =
    233             from r in
    234               clientGroup.Resources
    235             where r.Id == resourceClientGroupRow.ResourceId
    236             select r;
    237 
    238           if (resources.Count<Resource>() == 1)
    239             resource = resources.First<Resource>();
    240 
    241           if (resource == null) {
    242             deleted.Add(resourceClientGroupRow);
    243           }
    244         }
    245 
    246         foreach (dsHiveServer.ClientGroup_ResourceRow resourceClientGroupRow in deleted) {
    247           resourceClientGroupRow.Delete();
    248           resourceClientGroupAdapter.Update(resourceClientGroupRow);
    249         }
    250215      }
    251216
     
    260225
    261226        base.doUpdate(group);
     227
     228        List<Guid> relationships =
     229          new List<Guid>();
     230        foreach(Resource res in group.Resources) {
     231          if (res is ClientInfo) {
     232            ClientAdapter.Update(res as ClientInfo);
     233          } else if (res is ClientGroup) {
     234            Update(res as ClientGroup);
     235          } else {
     236            ResAdapter.Update(res);
     237          }
     238
     239          relationships.Add(res.Id);
     240        }
     241
     242        BinaryRelationHelper.UpdateRelationships(group.Id,
     243          relationships);
    262244      }
    263245    }
     
    276258
    277259    public ICollection<ClientGroup> MemberOf(Resource resource) {
    278       ICollection<ClientGroup> clientGroups =
    279         new List<ClientGroup>();
    280 
    281       if (resource != null) {
    282         IEnumerable<dsHiveServer.ClientGroup_ResourceRow> clientGroupRows =
    283          resourceClientGroupAdapter.GetDataByResourceId(resource.Id);
    284 
    285         foreach (dsHiveServer.ClientGroup_ResourceRow clientGroupRow in
    286           clientGroupRows) {
    287           ClientGroup clientGroup =
    288             GetById(clientGroupRow.ClientGroupId);
    289           clientGroups.Add(clientGroup);
    290         }
    291       }
    292 
    293       return clientGroups;
     260      throw new NotImplementedException();
    294261    }
    295262
    296263    protected override bool doDelete(ClientGroup group) {
    297264      if (group != null) {
     265        //delete all relationships
     266        BinaryRelationHelper.UpdateRelationships(group.Id,
     267          new List<Guid>());
     268
    298269        return base.doDelete(group) &&
    299270          ResAdapter.Delete(group);
Note: See TracChangeset for help on using the changeset viewer.