Changeset 29523 for main/trunk


Ignore:
Timestamp:
2014-12-03T12:42:45+13:00 (9 years ago)
Author:
kjdon
Message:

implementing siblings and children, descendents still to implement. also, do a quick search and replace of [meta-name] strings inside metadata values. currently won't handle parent(Top) type ones, only ones without any qualifier

File:
1 edited

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/AbstractGS2DocumentRetrieve.java

    r28966 r29523  
    229229    if (index == -1) {
    230230      // metadata is for this node
    231       Vector<String> values = info.getMultiInfo(metadata);
    232       return values;
     231      return info.getMultiInfo(metadata);
    233232    }
    234233    // we need to get metadata for one or more different nodes
     
    236235    String relation_id="";
    237236    metadata = metadata.substring(index + 1);
    238     if (relation.equals("parent") || relation.equals("ancestors")) {
     237    if (relation.equals("root")) {
     238      relation_id = OID.getTop(node_id);
     239      if (relation_id.equals(node_id)) {
     240    // use the current node info
     241    return info.getMultiInfo(metadata);
     242      } else {
     243    return getMetaValuesForOID(relation_id, metadata);
     244      }
     245    }
     246    if (relation.equals("parent")) {
    239247      relation_id = OID.getParent(node_id);
    240248      if (relation_id.equals(node_id)) {
     249    // no parent
    241250    return null;
    242251      }
    243     } else if (relation.equals("root")) {
    244       relation_id = OID.getTop(node_id);
    245     }
    246 
    247     DBInfo relation_info;
    248     if (relation_id.equals(node_id)) {
    249       relation_info = info;
    250     } else {
    251       relation_info = this.coll_db.getInfo(relation_id);
    252     }
    253     if (relation_info == null)
    254       {
     252      return getMetaValuesForOID(relation_id, metadata);
     253    }
     254
     255    if (relation.equals("ancestors")) {
     256      if (OID.isTop(node_id)) {
    255257    return null;
    256258      }
    257 
    258     Vector<String> values = relation_info.getMultiInfo(metadata);
    259     // do resolving
    260     if (!relation.equals("ancestors")){
     259      String current_id = node_id;
     260      relation_id = OID.getParent(current_id);
     261      Vector<String> values = new Vector<String>();
     262      while (!relation_id.equals(current_id)) {
     263   
     264    Vector<String> more_values = getMetaValuesForOID(relation_id, metadata);
     265    if (more_values != null) {
     266      values.addAll(0, more_values);
     267    }
     268    current_id = relation_id;
     269    relation_id = OID.getParent(current_id);
     270      }
    261271      return values;
    262272    }
    263 
    264     // ancestors: go up the chain
    265 
    266     String current_id = relation_id;
    267     relation_id = OID.getParent(current_id);
    268     while (!relation_id.equals(current_id))
    269       {
    270     relation_info = this.coll_db.getInfo(relation_id);
    271     if (relation_info == null)
    272       return values;
     273    if (relation.equals("siblings")) {
     274      String parent_id = OID.getParent(node_id);
     275      if (parent_id.equals(node_id)) {
     276    // no parent, therefore no siblings
     277    return null;
     278      }
     279      // siblings is the same as asking for children of the parent
     280      node_id = parent_id;
     281      relation = "children";
     282      current_info = this.coll_db.getInfo(parent_id);
     283      if (current_info == null) {
     284    return null;
     285      }
     286    }
     287    if (relation.equals("children")) {
     288      Vector<String> values = new Vector<String>();
     289      String contains = current_info.getInfo("contains");
     290      contains = StringUtils.replace(contains, "\"", node_id);
     291      String[] children = contains.split(";");
     292      for (int i = 0; i < children.length; i++) {
    273293   
    274     Vector<String> more_values = relation_info.getMultiInfo(metadata);
    275     if (more_values != null)
    276       {
    277         values.addAll(0, more_values);
    278       }
     294    String child_id = children[i];
     295    Vector<String> more_values = getMetaValuesForOID(child_id, metadata);
     296    if (more_values != null) {
     297      values.addAll(more_values);
     298    }
     299      }
     300      return values;
     301    }
     302    if (relation.equals("descendents")) {
     303      return null;
     304    }
     305    // unknown relation
     306    logger.error("asked for relation "+relation+" and don't understand it.");
     307    return null;
     308  }
     309     
     310  //   } else {
     311  //   if (relation.equals("parent") || relation.equals("ancestors")) {
     312  //     relation_id = OID.getParent(node_id);
     313  //     if (relation_id.equals(node_id)) {
     314  //    return null;
     315  //     }
     316  //   } else if (relation.equals("root")) {
     317  //     relation_id = OID.getTop(node_id);
     318  //   }
     319
     320  //   DBInfo relation_info;
     321  //   if (relation_id.equals(node_id)) {
     322  //     relation_info = info;
     323  //   } else {
     324  //     relation_info = this.coll_db.getInfo(relation_id);
     325  //   }
     326  //   if (relation_info == null)
     327  //     {
     328  //    return null;
     329  //     }
     330
     331  //   Vector<String> values = relation_info.getMultiInfo(metadata);
     332  //   // do resolving
     333  //   if (!relation.equals("ancestors")){
     334  //     return values;
     335  //   }
     336
     337  //   // ancestors: go up the chain
     338
     339  //   String current_id = relation_id;
     340  //   relation_id = OID.getParent(current_id);
     341  //   while (!relation_id.equals(current_id))
     342  //     {
     343  //    relation_info = this.coll_db.getInfo(relation_id);
     344  //    if (relation_info == null)
     345  //      return values;
     346   
     347  //    Vector<String> more_values = relation_info.getMultiInfo(metadata);
     348  //    if (more_values != null)
     349  //      {
     350  //        values.addAll(0, more_values);
     351  //      }
    279352   
    280353           
    281     current_id = relation_id;
    282     relation_id = OID.getParent(current_id);
    283       }
    284     return values; // for now
    285   }
    286 
     354  //    current_id = relation_id;
     355  //    relation_id = OID.getParent(current_id);
     356  //     }
     357  //   return values; // for now
     358  // }
     359
     360    protected Vector<String> getMetaValuesForOID(String oid, String metadata) {
     361      DBInfo info = this.coll_db.getInfo(oid);
     362      if (info == null) {
     363    return null;
     364      }
     365     
     366      Vector<String> values = info.getMultiInfo(metadata);
     367      // lets look through the values and look for [xxx] things. We need to look up metadata for them.
     368      if (values == null) { return values; }
     369     
     370      for (int j = 0; j < values.size(); j++) {
     371    String val = values.elementAt(j);
     372    if (val.contains("[")) {
     373      // look for metadata refs
     374      String [] metas = StringUtils.substringsBetween(val, "[", "]");
     375      for (int i=0; i<metas.length; i++) {
     376        String meta = metas[i];
     377        String meta_val = info.getInfo(meta);
     378        if (!meta_val.equals("")) {
     379          val = StringUtils.replace(val,"["+meta+"]",meta_val);
     380        }
     381      }
     382      values.set(j,val);
     383    }
     384      }
     385      return values;
     386    }
    287387    protected int getNumChildren(String node_id)
    288388    {
Note: See TracChangeset for help on using the changeset viewer.