Simple Substructure Search

    This very basic script will perform a substructure search on the structures table it is installed on, searching for the SMILES structure 'C1=CC=CC=C1'. It returns the count of rows found that match, and the total rows. This is a very nice example for Java coders who are learning Groovy, as a number of the Objects are presented in Java format.

    
    import chemaxon.sss.search.JChemSearchOptions
    import com.im.df.query.JChemSearchConstants
    import chemaxon.sss.SearchConstants
    import com.im.df.api.chem.MarvinStructure
    import com.im.commons.progress.*
    import com.im.df.api.ddl.*
    import com.im.df.api.dml.*
    import com.im.df.api.support.SortDirective
     
    def ety = dataTree.rootVertex.entity
    def edp = ety.schema.dataProvider.getEntityDataProvider(ety)
    def rows = edp.getRowCount(env)
    def dt = dataTree;
    println "Entity has $rows rows"
     
    def DFLock l = edp.getLockable().obtainLock("Structure Query");
    try {
        env = EnvUtils.createRWFromRO(env, l);
        DFEntity entity = dt.getRootVertex().getEntity();
     
        DFField structureField = null;
        for (DFField f: entity.getFields().getItems()) {
            if (DFFields.isStructure(f)) {
                structureField = f;
                break;
            }
        }
        println 'structure field' + structureField
     
        String structureString = "C1=CC=CC=C1";
        MarvinStructure mrv = new MarvinStructure(structureString, true);
        String structureSearchOptions = "t:s";
        JChemSearchOptions jchemOpts = new JChemSearchOptions(SearchConstants.SUBSTRUCTURE);
        jchemOpts.setOptions(structureSearchOptions);
     
        Map<String, Object> expOptions = new HashMap<String, Object>();
        expOptions.put(JChemSearchConstants.JCHEM_SEARCH_OPTIONS, jchemOpts);
     
        DFTermExpression structureExp = DFTermsFactory.createFieldOperatorValueExpr(Operators.STRUCTURE_SUBSTRUCTURE,
                structureField, expOptions, mrv, "");
     
        int error = structureExp.validate(dt).getErrorsCount();
        println 'errors1 = ' + error
     
        int size = edp.queryForIds(structureExp, SortDirective.EMPTY, env).size();
        println 'size = ' + size
     
        println 'total row count = ' + edp.getRowCount(env)
     
    } finally {
        if (l != null) {
            l.release();
        }
    }