Changeset 295

Show
Ignore:
Timestamp:
06/22/08 16:24:37 (7 months ago)
Author:
chris
Message:

Fix published clauses in unpublished verses not being displayed
in list of published clauses, or found in searches.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • lex/trunk/src/com/qwirx/lex/Search.java

    r259 r295  
    1414import jemdros.FlatStrawConstIterator; 
    1515import jemdros.MatchedObject; 
     16import jemdros.MonadSetElement; 
    1617import jemdros.SetOfMonads; 
    1718import jemdros.Sheaf; 
     
    9293        HebrewMorphemeGenerator generator =  
    9394            new HebrewMorphemeGenerator(); 
    94          
     95 
     96        SetOfMonads visible = m_Emdros.getVisibleMonads(); 
     97         
     98        // First pass to find matching clauses 
    9599        Sheaf sheaf = m_Emdros.getSheaf 
    96100        ( 
    97             "SELECT ALL OBJECTS IN " + 
    98             m_Emdros.getVisibleMonads().toString() + " " + 
    99             "WHERE [verse GET book, chapter, verse, verse_label " + 
    100             "       [clause " + query + " ]]" 
     101            "SELECT ALL OBJECTS IN " + visible.toString() + " " + 
     102            "WHERE [clause " + query + " ]" 
    101103        ); 
    102104         
     105        SheafConstIterator sci = sheaf.const_iterator(); 
     106        SetOfMonads clauseMonads = new SetOfMonads(); 
    103107        List<ResultBase> resultBases = new ArrayList<ResultBase>(); 
    104         SetOfMonads powerSet = new SetOfMonads(); 
    105108        SetOfMonads matchSet = new SetOfMonads(); 
    106         SheafConstIterator sci = sheaf.const_iterator(); 
    107          
    108109        Map<Integer,ResultBase> clauseIdToBase = 
    109110            new HashMap<Integer,ResultBase>(); 
    110111         
    111         m_ResultCount = 0; 
    112          
    113112        while (sci.hasNext()) 
    114113        { 
    115114            Straw straw = sci.next(); 
    116             MatchedObject verse = straw.const_iterator().next(); 
    117              
    118             SheafConstIterator clause_iter = 
    119                 verse.getSheaf().const_iterator(); 
    120                  
    121             while (clause_iter.hasNext()) 
    122             { 
    123                 MatchedObject clause = 
    124                     clause_iter.next().const_iterator().next(); 
    125  
    126                 m_ResultCount++; 
    127                 if (m_ResultCount > m_MaxResults) continue; // just count them 
    128                  
    129                 ResultBase base = new ResultBase(); 
    130                 base.monads = clause.getMonads(); 
    131                 base.location = verse.getFeatureAsString( 
    132                     verse.getEMdFValueIndex("verse_label")); 
    133                 base.url = "clause.jsp?book=" +  
    134                     m_Emdros.getEnumConstNameFromValue("book_name_e", 
    135                         verse.getEMdFValue("book").getInt()) + 
    136                     "&amp;chapter=" + verse.getEMdFValue("chapter") + 
    137                     "&amp;verse="   + verse.getEMdFValue("verse") + 
    138                     "&amp;clause="  + clause.getID_D(); 
    139                 base.clause = clause; 
    140                 resultBases.add(base); 
    141                 powerSet.unionWith(base.monads); 
    142                 addToMonadSet(clause.getSheaf(), matchSet); 
    143                  
    144                 clauseIdToBase.put(new Integer(clause.getID_D()), base); 
    145             } 
    146         } 
    147          
     115            MatchedObject clause = straw.const_iterator().next(); 
     116 
     117            m_ResultCount++; 
     118            if (m_ResultCount > m_MaxResults) continue; // just count them 
     119 
     120            ResultBase base = new ResultBase(); 
     121            base.monads = clause.getMonads(); 
     122            base.clause = clause; 
     123            resultBases.add(base); 
     124             
     125            clauseIdToBase.put(new Integer(clause.getID_D()), base); 
     126            clauseMonads.unionWith(base.monads); 
     127            addToMonadSet(clause.getSheaf(), matchSet); 
     128        } 
     129 
    148130        List<SearchResult> results = new ArrayList<SearchResult>(); 
    149131 
    150         if (powerSet.isEmpty()) 
     132        if (clauseMonads.isEmpty()) 
    151133        { 
    152134            return results; 
     135        } 
     136 
     137        // now retrieve the verses 
     138         
     139        Table table = m_Emdros.getTable("SELECT OBJECTS " + 
     140            "HAVING MONADS IN " + clauseMonads + " [verse]"); 
     141        StringBuffer verseIdList = new StringBuffer(); 
     142         
     143        for (TableIterator ti = table.iterator(); ti.hasNext();) 
     144        { 
     145            TableRow tr = ti.next(); 
     146             
     147            verseIdList.append(tr.getColumn(3)); 
     148 
     149            if (ti.hasNext()) 
     150            { 
     151                verseIdList.append(","); 
     152            } 
     153        } 
     154 
     155        StringBuffer verseMonadsQuery = new StringBuffer("GET MONADS " + 
     156            "FROM OBJECTS WITH ID_DS = "); 
     157        verseMonadsQuery.append(verseIdList); 
     158        verseMonadsQuery.append(" [verse]"); 
     159         
     160        table = m_Emdros.getTable(verseMonadsQuery.toString()); 
     161        Map<Integer,SetOfMonads> verseIdToMonadsMap = 
     162            new HashMap<Integer,SetOfMonads>(); 
     163         
     164        for (TableIterator ti = table.iterator(); ti.hasNext();) 
     165        { 
     166            TableRow tr = ti.next(); 
     167            int ID_D = Integer.parseInt(tr.getColumn(1)); 
     168             
     169            SetOfMonads som = verseIdToMonadsMap.get(new Integer(ID_D)); 
     170            if (som == null) 
     171            { 
     172                som = new SetOfMonads(); 
     173                verseIdToMonadsMap.put(new Integer(ID_D), som); 
     174            } 
     175             
     176            som.add(Integer.parseInt(tr.getColumn(2)), 
     177                Integer.parseInt(tr.getColumn(3))); 
     178        } 
     179 
     180        StringBuffer verseFeaturesQuery = new StringBuffer("GET FEATURES " + 
     181            "book, chapter, verse, verse_label FROM OBJECTS WITH ID_DS = "); 
     182        verseFeaturesQuery.append(verseIdList); 
     183        verseFeaturesQuery.append(" [verse]"); 
     184         
     185        table = m_Emdros.getTable(verseFeaturesQuery.toString()); 
     186 
     187        for (TableIterator ti = table.iterator(); ti.hasNext();) 
     188        { 
     189            TableRow tr = ti.next(); 
     190            int ID_D = Integer.parseInt(tr.getColumn(1)); 
     191            SetOfMonads monads = verseIdToMonadsMap.get(new Integer(ID_D)); 
     192             
     193            // TODO fix horribly slow algorithm 
     194            for (Iterator<ResultBase> i = resultBases.iterator(); i.hasNext();) 
     195            { 
     196                ResultBase base = i.next(); 
     197                if (base.monads.part_of(monads)) 
     198                { 
     199                    base.location = tr.getColumn(5); 
     200                    base.url = "clause.jsp?book=" + tr.getColumn(2) + 
     201                        "&amp;chapter=" + tr.getColumn(3) + 
     202                        "&amp;verse="   + tr.getColumn(4) + 
     203                        "&amp;clause="  + base.clause.getID_D(); 
     204                } 
     205            } 
    153206        } 
    154207         
     
    166219            } 
    167220            mql += " [clause]"; 
    168             Table table = m_Emdros.getTable(mql); 
     221            table = m_Emdros.getTable(mql); 
    169222            for (TableIterator ti = table.iterator(); ti.hasNext();) 
    170223            { 
     
    178231        FlatSheaf flat = m_Emdros.getFlatSheaf( 
    179232            "GET OBJECTS HAVING MONADS IN " + 
    180             powerSet.toString() +  
     233            clauseMonads.toString() +  
    181234            "[word GET " + 
    182235            " lexeme, " +