// TM
 @Override
 protected void batchDeleteRow(String cf, List<Node[]> li, String keyspace) {
   if (cf.equals(CF_C_SPO)) {
     super.batchDeleteRow(cf, li, keyspace);
   } else if (cf.equals(CF_PO_S)) {
     Mutator<byte[]> m = HFactory.createMutator(getExistingKeyspace(keyspace), _bs);
     for (Node[] nx : li) {
       // reorder for the key
       Node[] reordered = Util.reorder(nx, _maps.get(cf));
       ByteBuffer rowKey = createKey(new Node[] {reordered[0], reordered[1]});
       String colKey = reordered[2].toN3();
       // delete the full row
       m.addDeletion(rowKey.array(), cf);
     }
     m.execute();
   } else {
     Mutator<String> m = HFactory.createMutator(getExistingKeyspace(keyspace), _ss);
     for (Node[] nx : li) {
       // reorder for the key
       Node[] reordered = Util.reorder(nx, _maps.get(cf));
       String rowKey = reordered[0].toN3();
       m.addDeletion(rowKey, cf);
       _log.info("Delete full row for " + rowKey + " cf= " + cf);
     }
     m.execute();
   }
 }
  @Override
  protected void batchInsert(String cf, List<Node[]> li, String keyspace) {
    if (cf.equals(CF_C_SPO)) {
      super.batchInsert(cf, li, keyspace);
    } else if (cf.equals(CF_PO_S)) {
      Mutator<byte[]> m = HFactory.createMutator(getExistingKeyspace(keyspace), _bs);
      for (Node[] nx : li) {
        // reorder for the key
        Node[] reordered = Util.reorder(nx, _maps.get(cf));

        ByteBuffer rowKey = createKey(new Node[] {reordered[0], reordered[1]});
        String colKey = reordered[2].toN3();
        m.addInsertion(rowKey.array(), cf, HFactory.createStringColumn(colKey, ""));
        m.addInsertion(rowKey.array(), cf, HFactory.createStringColumn("!p", reordered[0].toN3()));
        m.addInsertion(rowKey.array(), cf, HFactory.createStringColumn("!o", reordered[1].toN3()));
      }
      m.execute();
    } else {
      Mutator<String> m = HFactory.createMutator(getExistingKeyspace(keyspace), _ss);
      for (Node[] nx : li) {
        // reorder for the key
        Node[] reordered = Util.reorder(nx, _maps.get(cf));
        String rowKey = reordered[0].toN3();

        // for ERS_bridges_.. keyspaces, use the column value; it is easier for querying afterwards
        // few keyspacs such as ERS_graphs cannot be decoded
        String keyspace_decoded = this.decodeKeyspace(keyspace);
        if (keyspace_decoded != null
            && keyspace_decoded.startsWith(Listener.BRIDGES_KEYSPACE + "_")) {
          String colKey = reordered[1].toN3();
          m.addInsertion(rowKey, cf, HFactory.createStringColumn(colKey, reordered[2].toN3()));
        } else {
          String colKey = Nodes.toN3(new Node[] {reordered[1], reordered[2]});
          m.addInsertion(rowKey, cf, HFactory.createStringColumn(colKey, ""));
        }
      }
      m.execute();
    }
  }
  // create a batch of different operations and execute them all together
  @Override
  protected void batchRun(String cf, List<Node[]> li, String keyspace) {
    if (cf.equals(CF_C_SPO)) {
      // this is not implemented, we don't care about CSPO CF
      super.batchRun(cf, li, keyspace);
    } else if (cf.equals(CF_PO_S)) {
      Mutator<byte[]> m = HFactory.createMutator(getExistingKeyspace(keyspace), _bs);
      for (Node[] nx : li) {
        Node[] reordered;
        ByteBuffer rowKey;
        String colKey;

        //				_log.info("$$$ " + nx[0].toString() + " " + nx[1].toString() + " " + nx[2].toString()
        // + " " + nx[3].toString());

        switch (Integer.parseInt(nx[3].toString())) {
          case 0:
            // ignore query
            continue;
          case 1:
            // insertion
            // reorder for the key
            reordered = Util.reorder(nx, _maps_br.get(cf));
            rowKey = createKey(new Node[] {reordered[0], reordered[1]});
            colKey = reordered[2].toN3();
            m.addInsertion(rowKey.array(), cf, HFactory.createStringColumn(colKey, ""));
            m.addInsertion(
                rowKey.array(), cf, HFactory.createStringColumn("!p", reordered[0].toN3()));
            m.addInsertion(
                rowKey.array(), cf, HFactory.createStringColumn("!o", reordered[1].toN3()));
            break;
          case 11:
            // insertion link
            // reorder for the key
            reordered = Util.reorder(nx, _maps_br.get(cf));
            rowKey = createKey(new Node[] {reordered[0], reordered[1]});
            colKey = reordered[2].toN3();
            m.addInsertion(rowKey.array(), cf, HFactory.createStringColumn(colKey, ""));
            m.addInsertion(
                rowKey.array(), cf, HFactory.createStringColumn("!p", reordered[0].toN3()));
            m.addInsertion(
                rowKey.array(), cf, HFactory.createStringColumn("!o", reordered[1].toN3()));

            // add the back link as well
            reordered = Util.reorder(nx, _maps_br.get("link"));
            rowKey = createKey(new Node[] {reordered[0], reordered[1]});
            colKey = reordered[2].toN3();
            m.addInsertion(rowKey.array(), cf, HFactory.createStringColumn(colKey, ""));
            m.addInsertion(
                rowKey.array(), cf, HFactory.createStringColumn("!p", reordered[0].toN3()));
            m.addInsertion(
                rowKey.array(), cf, HFactory.createStringColumn("!o", reordered[1].toN3()));
            break;
          case 2:
            // deletion
            // reorder for the key
            reordered = Util.reorder(nx, _maps_br.get(cf));
            rowKey = createKey(new Node[] {reordered[0], reordered[1]});
            colKey = reordered[2].toN3();
            // delete the full row
            m.addDeletion(rowKey.array(), cf);
            break;
          case 21:
            // deletion link
            // reorder for the key
            reordered = Util.reorder(nx, _maps_br.get(cf));
            rowKey = createKey(new Node[] {reordered[0], reordered[1]});
            colKey = reordered[2].toN3();
            // delete the full row
            m.addDeletion(rowKey.array(), cf);

            // delete the back link as well
            if (nx[2] instanceof Resource) {
              reordered = Util.reorder(nx, _maps_br.get("link"));
              rowKey = createKey(new Node[] {reordered[0], reordered[1]});
              colKey = reordered[2].toN3();
              // delete the full row containing the back link
              m.addDeletion(rowKey.array(), cf);
            }
            break;
          case 3:
            // update, run a delete and an insert
            // deletion
            // reorder for the key
            reordered = Util.reorder(nx, _maps_br_update_d.get(cf));
            rowKey = createKey(new Node[] {reordered[0], reordered[1]});
            colKey = reordered[2].toN3();
            // delete the full row
            m.addDeletion(rowKey.array(), cf);

            // insertion
            // reorder for the key
            reordered = Util.reorder(nx, _maps_br_update_i.get(cf));
            rowKey = createKey(new Node[] {reordered[0], reordered[1]});
            colKey = reordered[2].toN3();
            m.addInsertion(rowKey.array(), cf, HFactory.createStringColumn(colKey, ""));
            m.addInsertion(
                rowKey.array(), cf, HFactory.createStringColumn("!p", reordered[0].toN3()));
            m.addInsertion(
                rowKey.array(), cf, HFactory.createStringColumn("!o", reordered[1].toN3()));
            break;
          case 4:
            // delete the full entity
            Node[] query = new Node[3];
            query[0] = nx[0];
            query[1] = new Variable("p");
            query[2] = new Variable("o");
            try {
              Iterator<Node[]> it = this.query(query, Integer.MAX_VALUE, keyspace);
              // if data, delete :)
              for (; it.hasNext(); ) {
                Node[] n = (Node[]) it.next();
                // this.deleteData(n, keyspace, 0);
                rowKey = createKey(new Node[] {n[0], n[1]});
                m.addDeletion(rowKey.array(), cf);
              }
            } catch (StoreException ex) {
              _log.severe(ex.getMessage());
            }
            break;
          case 31:
            // update with link, run a delete and an insert
            // deletion
            // reorder for the key
            reordered = Util.reorder(nx, _maps_br_update_d.get(cf));
            rowKey = createKey(new Node[] {reordered[0], reordered[1]});
            colKey = reordered[2].toN3();
            // delete the full row
            m.addDeletion(rowKey.array(), cf);

            // delete the back link as well
            if (nx[2] instanceof Resource) {
              reordered = Util.reorder(nx, _maps_br_update_d.get("link"));
              rowKey = createKey(new Node[] {reordered[0], reordered[1]});
              colKey = reordered[2].toN3();
              // delete the full row containing the back link
              m.addDeletion(rowKey.array(), cf);
            }

            // insertion
            // reorder for the key
            reordered = Util.reorder(nx, _maps_br_update_i.get(cf));
            rowKey = createKey(new Node[] {reordered[0], reordered[1]});
            colKey = reordered[2].toN3();
            m.addInsertion(rowKey.array(), cf, HFactory.createStringColumn(colKey, ""));
            m.addInsertion(
                rowKey.array(), cf, HFactory.createStringColumn("!p", reordered[0].toN3()));
            m.addInsertion(
                rowKey.array(), cf, HFactory.createStringColumn("!o", reordered[1].toN3()));

            // insert also the new back link
            if (nx[5] instanceof Resource) {
              reordered = Util.reorder(nx, _maps_br_update_i.get("link"));
              rowKey = createKey(new Node[] {reordered[0], reordered[1]});
              colKey = reordered[2].toN3();
              m.addInsertion(rowKey.array(), cf, HFactory.createStringColumn(colKey, ""));
              m.addInsertion(
                  rowKey.array(), cf, HFactory.createStringColumn("!p", reordered[0].toN3()));
              m.addInsertion(
                  rowKey.array(), cf, HFactory.createStringColumn("!o", reordered[1].toN3()));
            }
            break;
          default:
            _log.info("OPERATION UNKNOWN, moving to next quad");
            break;
        }
      }
      m.execute();
    } else {
      Mutator<String> m = HFactory.createMutator(getExistingKeyspace(keyspace), _ss);
      for (Node[] nx : li) {
        Node[] reordered;
        String rowKey;
        String colKey;

        //				_log.info("$$$ " + nx[0].toString() + " " + nx[1].toString() + " " + nx[2].toString()
        // + " " + nx[3].toString());

        switch (Integer.parseInt(nx[3].toString())) {
          case 0:
            // ignore query
            continue;
          case 1:
            // insertion
            // reorder for the key
            reordered = Util.reorder(nx, _maps_br.get(cf));
            rowKey = reordered[0].toN3();
            colKey = Nodes.toN3(new Node[] {reordered[1], reordered[2]});
            m.addInsertion(rowKey, cf, HFactory.createStringColumn(colKey, ""));
            break;
          case 2:
            // deletion
            // reorder for the key
            reordered = Util.reorder(nx, _maps_br.get(cf));
            rowKey = reordered[0].toN3();
            colKey = Nodes.toN3(new Node[] {reordered[1], reordered[2]});
            m.addDeletion(rowKey, cf, colKey, _ss);
            break;
          case 3:
            // update = delete+insert
            // reorder for the key
            reordered = Util.reorder(nx, _maps_br_update_d.get(cf));
            rowKey = reordered[0].toN3();
            colKey = Nodes.toN3(new Node[] {reordered[1], reordered[2]});
            m.addDeletion(rowKey, cf, colKey, _ss);
            // reorder for the key
            reordered = Util.reorder(nx, _maps_br_update_i.get(cf));
            rowKey = reordered[0].toN3();
            colKey = Nodes.toN3(new Node[] {reordered[1], reordered[2]});
            m.addInsertion(rowKey, cf, HFactory.createStringColumn(colKey, ""));
            break;
          case 4:
            // delete the full entity
            Node[] query = new Node[3];
            query[0] = nx[0];
            query[1] = new Variable("p");
            query[2] = new Variable("o");
            try {
              Iterator<Node[]> it = this.query(query, Integer.MAX_VALUE, keyspace);
              // if data, delete :)
              for (; it.hasNext(); ) {
                Node[] n = (Node[]) it.next();
                // this.deleteData(n, keyspace, 0);
                rowKey = n[0].toN3();
                m.addDeletion(rowKey, cf);
              }
            } catch (StoreException ex) {
              _log.severe(ex.getMessage());
            }
            break;
          default:
            _log.info("OPERATION UNKNOWN, moving to next quad");
            break;
        }
      }
      m.execute();
    }
  }