Geometric Network DataExtraction

457
1
02-15-2011 10:30 AM
PaulBlessing
New Contributor
I have a geometric network with several feature classes and I'd like to perform a DataExtraction to extract only a subset of the feature classes, and more importantly a subset of the features in each feature class.  I can see why IReplicaDescription::setTableExcluded wouldn't work, since the geometric network would need to keep all its feature classes.

However, it also doesn't seem to respect the definition queries I set using IReplicaFilterDescriptionEdit::setTableUsesDefQuery and IReplicaFilterDescriptionEdit::setTableDefQuery.

Is this by design, or is this a bug?  Code snippet below.

IWorkspace source = factory.openFromFile(srcPath, 0);
IFeatureWorkspace sourceF = new IFeatureWorkspaceProxy(source);
IWorkspaceName dest = factory.create(dir, "extracted", null, 0);

NamesEnumerator nameEnum = new NamesEnumerator();
nameEnum.add(sourceF.openFeatureDataset("MyDataset").getFullName());

ReplicaDescription replica = new ReplicaDescription();
replica.init(nameEnum, dest, false, esriDataExtractionType.esriDataExtraction);
replica.setReplicaModelType(esriReplicaModelType.esriModelTypeFullGeodatabase);

String defQuery = "Flag = 1";

for (int i = 0, count = replica.getTableNameCount(); i < count; i++) {
    IName tableIName = replica.getTableName(i);
    String tableName = new IDatasetProxy(tableIName.open()).getName();

    if ("Vertex1".equals(tableName)) {
        replica.setTableExcluded(i, true);
    } else if ("Vertex2".equals(tableName)) {
        replica.setTableExcluded(i, false);
        replica.setRowsType(i, esriRowsType.esriRowsTypeFilter);
        replica.setTableUsesDefQuery(i, true);
        replica.setTableDefQuery(i, defQuery);
    } else if ("Vertex3".equals(tableName)) {
        replica.setTableExcluded(i, false);
        replica.setRowsType(i, esriRowsType.esriRowsTypeFilter);
        replica.setTableUsesDefQuery(i, true);
        replica.setTableDefQuery(i, defQuery);
    } else if ("Line1".equals(tableName)) {
        replica.setTableExcluded(i, true);
    } else if ("Line2".equals(tableName)) {
        replica.setTableExcluded(i, false);
        replica.setRowsType(i, esriRowsType.esriRowsTypeFilter);
        replica.setTableUsesDefQuery(i, true);
        replica.setTableDefQuery(i, defQuery);
    }
}

DataExtraction extraction = new DataExtraction();
extraction.extract(replica, true);
0 Kudos
1 Reply
PascalCoulon
New Contributor II
Hi,

Did you ever find a solution to the issue you have noticed where query definition are being ignored?

I have have the same issue, and I also noticed that related object are always downloaded despite set to false the parameters. See codes below.

public Boolean createReplica(LayerDefinition[] layerDefinitions, String TaskID)
        {

            try

            {

                //Define the output workspace

                setOuPutWorkspaceName();



                //Define the source workspace

                setinPutWorkspaceName();



                //Set the source replicate dataset

                IReplicaDescription2 rDDescription = initialiseReplica(layerDefinitions, m_sourceWorkspaceName, m_outPutWorkspaceName);

                if (rDDescription == null)

                    throw new GISException("replica not initialised");



                //If replica already exists unregister it!

                Workspace masterWorkspace = (Workspace)WorkspaceHelper.openFromSDEConnection(ApplicationConfigReader.Instance().GetValue("SDEFilePath"));

                IWorkspaceReplicas replicaWorkspace = (IWorkspaceReplicas)masterWorkspace;

                IReplica replica = replicaWorkspace.get_ReplicaByName("mycheckout_" + TaskID);



                if (replica != null)

                {

                    IWorkspaceReplicasAdmin2 replicaWorkspaceManager = (IWorkspaceReplicasAdmin2)masterWorkspace;

                    replicaWorkspaceManager.UnregisterReplica(replica, true);

                }



                ICheckOut _checkOut = new CheckOutClass();

                //Set to NOT Replicate related features

                _checkOut.CheckOutData(rDDescription, false, "mycheckout_" + TaskID);

            // Note that rDDescription.FetchRelatedObjects is equal to False.

  // However data replicated in the FGDB includes related features!              



            }

            catch (Exception e)

            {

                throw new GISException(GISExceptionCode.ERROR_FGDB_NOT_INIT, e);

            }



            return true;

        }



private IReplicaDescription2 initialiseReplica(LayerDefinition[] layerDefinitions,

            IWorkspaceName sourceWorkSpaceName, IWorkspaceName OutputWorspaceName)

        {

            // Create an enumerator for source datasets.

            IEnumName sourceEnumName = new NamesEnumeratorClass();

            IEnumNameEdit sourceEnumNameEdit = (IEnumNameEdit)sourceEnumName;



            for (int i = 0; i < layerDefinitions.Length; i++)

            {

                // Create a name object for the source feature class.

                IFeatureClassName featureClassName = new FeatureClassNameClass();



                // Set the featureClassName properties.

                IDatasetName sourceDatasetName = (IDatasetName)featureClassName;

                sourceDatasetName.WorkspaceName = sourceWorkSpaceName;

                sourceDatasetName.Name = layerDefinitions.layerName;



                IName sourceName = (IName)sourceDatasetName;

                sourceName.NameString = layerDefinitions.layerName;



                // Add the name object for the source class to the enumerator.

                sourceEnumNameEdit.Add(sourceName);

            }



            //Set the data extraction details

            IReplicaDescription2 rDDescription = new ReplicaDescriptionClass();



            rDDescription.Init(sourceEnumName, OutputWorspaceName, true, esriDataExtractionType.esriDataCheckOut);

            //rDDescription.AddDatasetNames(sourceEnumName);

            rDDescription.ReplicaModelType = esriReplicaModelType.esriModelTypeFullGeodatabase;



            IReplicaFilterDescriptionEdit rDDescriptionFilter = (IReplicaFilterDescriptionEdit)rDDescription;

            IReplicaFilterDescription dd = (IReplicaFilterDescription)rDDescription;

            for (int i = 0; i < layerDefinitions.Length; i++)

            {

                for (int j = 0; j < rDDescription.TableNameCount; j++)

                {



                    IName tableName = rDDescription.get_TableName(j);

                    if (tableName.NameString == layerDefinitions.layerName)

                    {

                          // The Query definition does not seem to be

//set as in the replica I get all features available in the table.

     rDDescriptionFilter.set_TableDefQuery(j, layerDefinitions.queryDefinition);



                        //rDDescriptionFilter.set_TableUsesQueryGeometry(j, true);

                        String query = dd.get_TableDefQuery(j);

                    }



                }

            }



            return rDDescription;

        }
0 Kudos