Changeset 58

Show
Ignore:
Timestamp:
02/26/10 21:57:31 (2 years ago)
Author:
ke
Message:

DB tree bug fix: getChildren(int, int) now returns not only virtual children, but also real children with lower layers.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • kahina/trunk/src/org/kahina/data/tree/KahinaDbTree.java

    r57 r58  
    1313import org.w3c.dom.NodeList; 
    1414 
    15 public class KahinaDbTree extends KahinaTree 
    16 
     15public class KahinaDbTree extends KahinaTree { 
    1716        private static final String CLIENT_ID = KahinaDbTree.class.getName(); 
    1817 
     
    6362        private int nextID; 
    6463 
    65         public KahinaDbTree(DatabaseHandler db) 
    66         { 
     64        public KahinaDbTree(DatabaseHandler db) { 
    6765                this(new DefaultLayerDecider(), db); 
    6866        } 
    6967 
    70         public KahinaDbTree(LayerDecider decider, DatabaseHandler db) 
    71         { 
     68        public KahinaDbTree(LayerDecider decider, DatabaseHandler db) { 
    7269                super(decider); 
    7370                this.db = db; 
     
    7774        } 
    7875 
    79         private void createTablesIfNecessary() 
    80         { 
    81                 if (!db.isRegistered(CLIENT_ID)) 
    82                 { 
     76        private void createTablesIfNecessary() { 
     77                if (!db.isRegistered(CLIENT_ID)) { 
    8378                        db.execute("CREATE TABLE " + NODE_TABLE_NAME + " (id INT, " 
    8479                                        + "tree INT, " + "nodeCaption LONG VARCHAR, " 
     
    9085                        db.execute("CREATE INDEX realParent ON " + NODE_TABLE_NAME 
    9186                                        + " (realParent)"); 
     87                        db.execute("CREATE INDEX layer ON " + NODE_TABLE_NAME + " (layer)"); 
    9288                        db.execute("CREATE INDEX virtualParent ON " + NODE_TABLE_NAME 
    9389                                        + " (virtualParent)"); 
     
    9692        } 
    9793 
    98         private void prepareStatements() 
    99         { 
     94        private void prepareStatements() { 
    10095                int treeID = getID(); 
    10196                addNodeStatement = db.prepareStatement("INSERT INTO " + NODE_TABLE_NAME 
     
    129124                                + treeID); 
    130125                getVirtualChildrenStatement = db.prepareStatement("SELECT id FROM " 
    131                                 + NODE_TABLE_NAME + " WHERE virtualParent = ? AND tree = " 
    132                                 + treeID); 
     126                                + NODE_TABLE_NAME + " WHERE tree = " + treeID 
     127                                + " AND (virtualParent = ? OR (realParent = ? AND layer < ?))"); 
    133128                getEdgeLabelStatement = db.prepareStatement("SELECT edgeLabel FROM " 
    134129                                + NODE_TABLE_NAME + " WHERE id = ? AND tree = " + treeID); 
     
    147142        } 
    148143 
    149         public void addNode(int id, String caption, String label, int nodeStatus) 
    150         { 
    151                 try 
    152                 { 
     144        public void addNode(int id, String caption, String label, int nodeStatus) { 
     145                try { 
    153146                        addNodeStatement.setInt(1, id); 
    154147                        addNodeStatement.setString(2, caption); 
     
    156149                        addNodeStatement.setInt(4, nodeStatus); 
    157150                        addNodeStatement.execute(); 
    158                 } catch (SQLException e) 
    159                 { 
     151                } catch (SQLException e) { 
    160152                        throw new KahinaException("SQL error.", e); 
    161153                } 
     
    164156 
    165157        @Override 
    166         public int addNode(String caption, String label, int nodeStatus) 
    167         { 
     158        public int addNode(String caption, String label, int nodeStatus) { 
    168159                int id = nextID++; 
    169160                addNode(id, caption, label, nodeStatus); 
     
    172163 
    173164        @Override 
    174         public void addChild(int parent, int child) 
    175         { 
    176                 System.err.println("adding " + child + " to " + parent + " in " + this); 
    177                 try 
    178                 { 
     165        public void addChild(int parent, int child) { 
     166                try { 
    179167                        addEdgeStatement.setInt(1, parent); 
    180168                        addEdgeStatement.setInt(2, child); 
    181169                        addEdgeStatement.execute(); 
    182                 } catch (SQLException e) 
    183                 { 
     170                } catch (SQLException e) { 
    184171                        throw new KahinaException("SQL error.", e); 
    185172                } 
     
    187174        } 
    188175 
    189         private void computeAndStoreLayerInformation(int child) 
    190         { 
     176        private void computeAndStoreLayerInformation(int child) { 
    191177                int childLayer = decider.decideOnLayer(child, this); 
    192178                int virtualParent = getParent(child); 
    193179                int parentLayer = getLayer(virtualParent); 
    194                 while (parentLayer > childLayer) 
    195                 { 
     180                while (parentLayer > childLayer) { 
    196181                        virtualParent = getParent(virtualParent); 
    197182                        parentLayer = getLayer(virtualParent); 
    198183                } 
    199                 if (parentLayer < childLayer) 
    200                 { 
     184                if (parentLayer < childLayer) { 
    201185                        virtualParent = -1; 
    202186                } 
    203                 try 
    204                 { 
     187                try { 
    205188                        addLayerInformationStatement.setInt(1, childLayer); 
    206189                        addLayerInformationStatement.setInt(2, virtualParent); 
    207190                        addLayerInformationStatement.setInt(3, child); 
    208191                        addLayerInformationStatement.execute(); 
    209                 } catch (SQLException e) 
    210                 { 
    211                         throw new KahinaException("SQL error.", e); 
    212                 } 
    213         } 
    214  
    215         @Override 
    216         public void setLayerDecider(LayerDecider decider) 
    217         { 
     192                } catch (SQLException e) { 
     193                        throw new KahinaException("SQL error.", e); 
     194                } 
     195        } 
     196 
     197        @Override 
     198        public void setLayerDecider(LayerDecider decider) { 
    218199                super.setLayerDecider(decider); 
    219200                recomputeLayers(); 
    220201        } 
    221202 
    222         public void recomputeLayers() 
    223         { 
     203        public void recomputeLayers() { 
    224204                recomputeLayers(getRootID()); 
    225205        } 
    226206 
    227         public void recomputeLayers(int nodeID) 
    228         { 
     207        public void recomputeLayers(int nodeID) { 
    229208                computeAndStoreLayerInformation(nodeID); 
    230                 for (int childID : getChildren(nodeID)) 
    231                 { 
     209                for (int childID : getChildren(nodeID)) { 
    232210                        recomputeLayers(childID); 
    233211                } 
     
    235213 
    236214        @Override 
    237         public int getParent(int nodeID) 
    238         { 
    239                 try 
    240                 { 
     215        public int getParent(int nodeID) { 
     216                try { 
    241217                        getRealParentStatement.setInt(1, nodeID); 
    242                 } catch (SQLException e) 
    243                 { 
     218                } catch (SQLException e) { 
    244219                        throw new KahinaException("SQL error.", e); 
    245220                } 
     
    247222        } 
    248223 
    249         private int getVirtualParent(int nodeID) 
    250         { 
    251                 try 
    252                 { 
     224        private int getVirtualParent(int nodeID) { 
     225                try { 
    253226                        getVirtualParentStatement.setInt(1, nodeID); 
    254                 } catch (SQLException e) 
    255                 { 
     227                } catch (SQLException e) { 
    256228                        throw new KahinaException("SQL error.", e); 
    257229                } 
     
    259231        } 
    260232 
    261         private int getLayer(int nodeID) 
    262         { 
    263                 try 
    264                 { 
     233        private int getLayer(int nodeID) { 
     234                try { 
    265235                        getLayerStatement.setInt(1, nodeID); 
    266                 } catch (SQLException e) 
    267                 { 
     236                } catch (SQLException e) { 
    268237                        throw new KahinaException("SQL error.", e); 
    269238                } 
     
    272241 
    273242        @Override 
    274         public void clear() 
    275         { 
     243        public void clear() { 
    276244                db.execute(clearStatement); 
    277245        } 
    278246 
    279247        @Override 
    280         public void collapse(int nodeID) 
    281         { 
    282                 try 
    283                 { 
     248        public void collapse(int nodeID) { 
     249                try { 
    284250                        collapseStatement.setInt(1, nodeID); 
    285251                        collapseStatement.execute(); 
    286                 } catch (SQLException e) 
    287                 { 
    288                         throw new KahinaException("SQL error.", e); 
    289                 } 
    290         } 
    291  
    292         @Override 
    293         public void decollapse(int nodeID) 
    294         { 
    295                 try 
    296                 { 
     252                } catch (SQLException e) { 
     253                        throw new KahinaException("SQL error.", e); 
     254                } 
     255        } 
     256 
     257        @Override 
     258        public void decollapse(int nodeID) { 
     259                try { 
    297260                        decollapseStatement.setInt(1, nodeID); 
    298261                        decollapseStatement.execute(); 
    299                 } catch (SQLException e) 
    300                 { 
    301                         throw new KahinaException("SQL error.", e); 
    302                 } 
    303         } 
    304  
    305         @Override 
    306         public void decollapseAll() 
    307         { 
     262                } catch (SQLException e) { 
     263                        throw new KahinaException("SQL error.", e); 
     264                } 
     265        } 
     266 
     267        @Override 
     268        public void decollapseAll() { 
    308269                db.execute(decollapseAllStatement); 
    309270        } 
    310271 
    311272        @Override 
    312         public List<Integer> getChildren(int nodeID, int layer) 
    313         { 
    314                 System.err.print("children for " + nodeID + "(" + getNodeCaption(nodeID) + ") on " + layer + ": "); 
     273        public List<Integer> getChildren(int nodeID, int layer) { 
    315274                int nodeLayer = getLayer(nodeID); 
    316                 if (layer == nodeLayer) 
    317                 { 
     275                if (layer == nodeLayer) { 
    318276                        // the most common case, for which we have precalculated the virtual 
    319277                        // children 
    320                         List<Integer> result = getVirtualChildren(nodeID); 
    321                         return ear(result); 
    322                 } 
    323                 if (nodeID == getRootID(layer) || nodeLayer >= layer) 
    324                 { 
     278                        List<Integer> result = getVirtualChildren(nodeID, nodeLayer); 
     279                        return result; 
     280                } 
     281                if (nodeID == getRootID(layer) || nodeLayer >= layer) { 
    325282                        // usually only the case for the root of a partial tree 
    326283                        List<Integer> frontLine = getChildren(nodeID); 
    327                         for (int i = 0; i < frontLine.size();) 
    328                         { 
     284                        for (int i = 0; i < frontLine.size();) { 
    329285                                int child = frontLine.get(i); 
    330                                 if (getLayer(child) > layer) 
    331                                 { 
     286                                if (getLayer(child) > layer) { 
    332287                                        frontLine.remove(i); 
    333288                                        frontLine.addAll(i, getChildren(child)); 
    334                                 } else 
    335                                 { 
     289                                } else { 
    336290                                        i++; 
    337291                                } 
    338292                        } 
    339                         return ear(frontLine)
     293                        return frontLine
    340294                } 
    341295                // When we have reached a "cornerstone", pretend it's a leaf: 
    342                 return ear(Collections.emptyList()); 
    343         } 
    344  
    345         private List<Integer> getChildren(int nodeID) 
    346         { 
    347                 try 
    348                 { 
     296                return Collections.emptyList(); 
     297        } 
     298 
     299        private List<Integer> getChildren(int nodeID) { 
     300                try { 
    349301                        getRealChildrenStatement.setInt(1, nodeID); 
    350                 } catch (SQLException e) 
    351                 { 
     302                } catch (SQLException e) { 
    352303                        throw new KahinaException("SQL error.", e); 
    353304                } 
     
    355306        } 
    356307 
    357         private List<Integer> getVirtualChildren(int nodeID) 
    358         { 
    359                 try 
    360                 { 
     308        private List<Integer> getVirtualChildren(int nodeID, int layer) { 
     309                try { 
    361310                        getVirtualChildrenStatement.setInt(1, nodeID); 
    362                 } catch (SQLException e) 
    363                 { 
     311                        getVirtualChildrenStatement.setInt(2, nodeID); 
     312                        getVirtualChildrenStatement.setInt(3, layer); 
     313                } catch (SQLException e) { 
    364314                        throw new KahinaException("SQL error.", e); 
    365315                } 
     
    369319 
    370320        @Override 
    371         public String getEdgeLabel(int nodeID) 
    372         { 
    373                 try 
    374                 { 
     321        public String getEdgeLabel(int nodeID) { 
     322                try { 
    375323                        getEdgeLabelStatement.setInt(1, nodeID); 
    376                 } catch (SQLException e) 
    377                 { 
     324                } catch (SQLException e) { 
    378325                        throw new KahinaException("SQL error.", e); 
    379326                } 
     
    382329 
    383330        @Override 
    384         protected void collectLeaves(int nodeID, List<Integer> leaves) 
    385         { 
     331        protected void collectLeaves(int nodeID, List<Integer> leaves) { 
    386332                List<Integer> children = getChildren(nodeID); 
    387                 if (children.isEmpty()) 
    388                 { 
     333                if (children.isEmpty()) { 
    389334                        leaves.add(nodeID); 
    390                 } else 
    391                 { 
    392                         for (int child : children) 
    393                         { 
     335                } else { 
     336                        for (int child : children) { 
    394337                                collectLeaves(child, leaves); 
    395338                        } 
     
    398341 
    399342        @Override 
    400         public String getNodeCaption(int nodeID) 
    401         { 
    402                 try 
    403                 { 
     343        public String getNodeCaption(int nodeID) { 
     344                try { 
    404345                        getNodeCaptionStatement.setInt(1, nodeID); 
    405                 } catch (SQLException e) 
    406                 { 
     346                } catch (SQLException e) { 
    407347                        throw new KahinaException("SQL error.", e); 
    408348                } 
     
    411351 
    412352        @Override 
    413         public int getNodeStatus(int nodeID) 
    414         { 
    415                 try 
    416                 { 
     353        public int getNodeStatus(int nodeID) { 
     354                try { 
    417355                        getNodeStatusStatement.setInt(1, nodeID); 
    418                 } catch (SQLException e) 
    419                 { 
     356                } catch (SQLException e) { 
    420357                        throw new KahinaException("SQL error.", e); 
    421358                } 
     
    424361 
    425362        @Override 
    426         public int getParent(int nodeID, int layer) 
    427         { 
    428                 if (nodeID == getRootID(layer)) 
    429                 { 
     363        public int getParent(int nodeID, int layer) { 
     364                if (nodeID == getRootID(layer)) { 
    430365                        return -1; 
    431366                } 
    432                 if (getLayer(nodeID) == layer) 
    433                 { 
     367                if (getLayer(nodeID) == layer) { 
    434368                        return getVirtualParent(nodeID); 
    435369                } 
    436370                int result = getParent(nodeID); 
    437                 while (getLayer(result) > layer) 
    438                 { 
     371                while (getLayer(result) > layer) { 
    439372                        result = getParent(result); 
    440373                } 
     
    443376 
    444377        @Override 
    445         public int getRootID() 
    446         { 
     378        public int getRootID() { 
    447379                return db.queryInteger(getRootStatement, -1); 
    448380        } 
    449381 
    450382        @Override 
    451         public int getRootID(int layer) 
    452         { 
    453                 if (layer == 0) 
    454                 { 
     383        public int getRootID(int layer) { 
     384                if (layer == 0) { 
    455385                        return getRootID(); 
    456386                } 
    457387                int result = getReferenceNode(); 
    458                 while (getLayer(result) >= layer) 
    459                 { 
     388                while (getLayer(result) >= layer) { 
    460389                        result = getParent(result); 
    461390                } 
     
    464393 
    465394        @Override 
    466         public boolean isCollapsed(int nodeID) 
    467         { 
    468                 try 
    469                 { 
     395        public boolean isCollapsed(int nodeID) { 
     396                try { 
    470397                        isCollapsedStatement.setInt(1, nodeID); 
    471                 } catch (SQLException e) 
    472                 { 
     398                } catch (SQLException e) { 
    473399                        throw new KahinaException("SQL error.", e); 
    474400                } 
     
    478404 
    479405        @Override 
    480         public int getSize() 
    481         { 
     406        public int getSize() { 
    482407                return db.queryInteger(getSizeStatement, 0); 
    483408        } 
    484409 
    485410        public static KahinaTree importXML(Document dom, LayerDecider decider, 
    486                         DatabaseHandler db, KahinaTree primaryModel) 
    487         { 
     411                        DatabaseHandler db, KahinaTree primaryModel) { 
    488412                KahinaDbTree m = new KahinaDbTree(decider, db); 
    489                 if (primaryModel != null) 
    490                 { 
     413                if (primaryModel != null) { 
    491414                        m.setPrimaryModel(primaryModel); 
    492415                } 
    493416                Element treeElement = dom.getDocumentElement(); 
    494417                NodeList childNodes = treeElement.getChildNodes(); 
    495                 for (int i = 0; i < childNodes.getLength(); i++) 
    496                 { 
     418                for (int i = 0; i < childNodes.getLength(); i++) { 
    497419                        Node n = childNodes.item(i); 
    498                         if (n.getNodeName().equals("node")) 
    499                         { 
     420                        if (n.getNodeName().equals("node")) { 
    500421                                importXMLNode(m, (Element) n, -1); 
    501422                                // TODO: a little risky, root node could be assigned another ID 
     
    507428        } 
    508429 
    509         private static void importXMLNode(KahinaDbTree m, Element node, int parentID) 
    510         { 
     430        private static void importXMLNode(KahinaDbTree m, Element node, int parentID) { 
    511431                String caption = node.getAttribute("caption"); 
    512432                String label = node.getAttribute("label"); 
    513433                int status = 0; 
    514                 if (node.getAttribute("status").length() > 0) 
    515                 { 
     434                if (node.getAttribute("status").length() > 0) { 
    516435                        status = Integer.parseInt(node.getAttribute("status")); 
    517436                } 
    518437                int id; 
    519                 if (node.getAttribute("id").length() > 0) 
    520                 { 
     438                if (node.getAttribute("id").length() > 0) { 
    521439                        id = Integer.parseInt(node.getAttribute("id")); 
    522440                        m.addNode(id, caption, label, status); 
    523                 } else 
    524                 { 
     441                } else { 
    525442                        id = m.addNode(caption, label, status); 
    526443                } 
    527                 if (parentID != -1) 
    528                 { 
     444                if (parentID != -1) { 
    529445                        m.addChild(parentID, id); 
    530446                } 
    531447                // go through children recursively 
    532448                NodeList childNodes = node.getChildNodes(); 
    533                 for (int i = 0; i < childNodes.getLength(); i++) 
    534                 { 
     449                for (int i = 0; i < childNodes.getLength(); i++) { 
    535450                        Node n = childNodes.item(i); 
    536                         if (n.getNodeName().equals("node")) 
    537                         { 
     451                        if (n.getNodeName().equals("node")) { 
    538452                                importXMLNode(m, (Element) n, id); 
    539453                        } 
     
    542456 
    543457        @Override 
    544         public void finalize() throws Throwable 
    545         { 
     458        public void finalize() throws Throwable { 
    546459                clear(); 
    547460                super.finalize(); 
  • kahina/trunk/src/org/kahina/data/tree/KahinaMemTree.java

    r57 r58  
    6161        public List<Integer> getChildren(int nodeID, int layerID) 
    6262    { 
    63         System.err.print("children for " + nodeID + "(" + getNodeCaption(nodeID) + ") on " + layerID + ": "); 
    6463        //System.err.print("KahinaLayeredTree.getChildren(" + nodeID + "," + layerID + ") = "); 
    6564        List<Integer> chi = new ArrayList<Integer>(); 
     
    8887        //System.err.println(" node: " + nodeID + " layer: " + layerID + " chi: " + chi); 
    8988        //System.err.println(chi); 
    90         return ear(chi)
     89        return chi
    9190    } 
    9291     
  • kahina/trunk/src/org/kahina/data/tree/KahinaTree.java

    r57 r58  
    2323                this.decider = decider; 
    2424                doClear(); 
    25         } 
    26          
    27  
    28  
    29         public List<Integer> ear(List x) 
    30         { 
    31                 System.err.println(x); 
    32                 return (List<Integer>) x; 
    3325        } 
    3426