From bebc7a8a524e19739f6128437bab06212a35e75b Mon Sep 17 00:00:00 2001 From: nishadi Date: Sun, 20 Aug 2017 20:02:27 +0530 Subject: [PATCH 1/3] Fix the put method to delete the existing records only if certain fields have been removed --- .../apache/gora/aerospike/store/AerospikeStore.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/gora-aerospike/src/main/java/org/apache/gora/aerospike/store/AerospikeStore.java b/gora-aerospike/src/main/java/org/apache/gora/aerospike/store/AerospikeStore.java index 0d5e23f58..4ff1a5346 100644 --- a/gora-aerospike/src/main/java/org/apache/gora/aerospike/store/AerospikeStore.java +++ b/gora-aerospike/src/main/java/org/apache/gora/aerospike/store/AerospikeStore.java @@ -187,9 +187,16 @@ public void put(K key, T persistent) { List fields = persistent.getSchema().getFields(); - if (aerospikeClient.exists(null, recordKey)) { - this.delete(key); + // Delete the record, if the record exists and a field has been removed + for (int i = 0; i < fields.size(); i++) { + if (persistent.isDirty(i)) { + Object persistentValue = persistent.get(i); + if (persistentValue == null && aerospikeClient.exists(null, recordKey)) { + this.delete(key); + } + } } + for (int i = 0; i < fields.size(); i++) { if (!persistent.isDirty(i)) { continue; @@ -447,7 +454,6 @@ public T createPersistentInstance(Record record, String[] fields) { for (String field : fields) { setPersistentField(field, record, persistent); } - persistent.setDirty(); return persistent; } @@ -475,6 +481,7 @@ private void setPersistentField(String fieldName, Record record, T persistent) { persistent.put(fieldName, getDeserializedObject(binValue, binDataType, fieldMap.get(fieldName).schema())); + persistent.setDirty(fieldMap.get(fieldName).pos()); } /** From 18c6426d1fbb60f0a52a5a7a021690f62d821955 Mon Sep 17 00:00:00 2001 From: nishadi Date: Sun, 20 Aug 2017 20:45:19 +0530 Subject: [PATCH 2/3] Update dirty bit clearing after fetching from data store --- .../java/org/apache/gora/aerospike/store/AerospikeStore.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gora-aerospike/src/main/java/org/apache/gora/aerospike/store/AerospikeStore.java b/gora-aerospike/src/main/java/org/apache/gora/aerospike/store/AerospikeStore.java index 4ff1a5346..677302db3 100644 --- a/gora-aerospike/src/main/java/org/apache/gora/aerospike/store/AerospikeStore.java +++ b/gora-aerospike/src/main/java/org/apache/gora/aerospike/store/AerospikeStore.java @@ -454,6 +454,7 @@ public T createPersistentInstance(Record record, String[] fields) { for (String field : fields) { setPersistentField(field, record, persistent); } + persistent.clearDirty(); return persistent; } @@ -481,7 +482,6 @@ private void setPersistentField(String fieldName, Record record, T persistent) { persistent.put(fieldName, getDeserializedObject(binValue, binDataType, fieldMap.get(fieldName).schema())); - persistent.setDirty(fieldMap.get(fieldName).pos()); } /** From 31af406eb992beebcb8c0f6908df8031ef179aeb Mon Sep 17 00:00:00 2001 From: nishadi Date: Mon, 21 Aug 2017 20:55:46 +0530 Subject: [PATCH 3/3] Fix the error in removing a bin value while updating in aerospike module --- .../gora/aerospike/store/AerospikeStore.java | 39 ++++++++----------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/gora-aerospike/src/main/java/org/apache/gora/aerospike/store/AerospikeStore.java b/gora-aerospike/src/main/java/org/apache/gora/aerospike/store/AerospikeStore.java index 677302db3..53545f1ec 100644 --- a/gora-aerospike/src/main/java/org/apache/gora/aerospike/store/AerospikeStore.java +++ b/gora-aerospike/src/main/java/org/apache/gora/aerospike/store/AerospikeStore.java @@ -187,37 +187,30 @@ public void put(K key, T persistent) { List fields = persistent.getSchema().getFields(); - // Delete the record, if the record exists and a field has been removed - for (int i = 0; i < fields.size(); i++) { - if (persistent.isDirty(i)) { - Object persistentValue = persistent.get(i); - if (persistentValue == null && aerospikeClient.exists(null, recordKey)) { - this.delete(key); - } - } - } - for (int i = 0; i < fields.size(); i++) { if (!persistent.isDirty(i)) { continue; } Object persistentValue = persistent.get(i); + + String mappingBinName = aerospikeParameters.getAerospikeMapping().getBinMapping() + .get(fields.get(i).name()); + if (mappingBinName == null) { + LOG.error("Aerospike mapping for field {}#{} not found. Wrong gora-aerospike-mapping.xml?", + persistent.getClass().getName(), fields.get(i).name()); + throw new RuntimeException( + "Aerospike mapping for field [" + persistent.getClass().getName() + "#" + fields + .get(i).name() + "] not found. Wrong gora-aerospike-mapping.xml?"); + } + Bin bin; if (persistentValue != null) { - String mappingBinName = aerospikeParameters.getAerospikeMapping().getBinMapping() - .get(fields.get(i).name()); - if (mappingBinName == null) { - LOG.error( - "Aerospike mapping for field {}#{} not found. Wrong gora-aerospike-mapping.xml?", - persistent.getClass().getName(), fields.get(i).name()); - throw new RuntimeException( - "Aerospike mapping for field [" + persistent.getClass().getName() + "#" + fields - .get(i).name() + "] not found. Wrong gora-aerospike-mapping.xml?"); - } - Bin bin = new Bin(mappingBinName, + bin = new Bin(mappingBinName, getSerializableValue(persistentValue, fields.get(i).schema())); - aerospikeClient - .put(aerospikeParameters.getAerospikeMapping().getWritePolicy(), recordKey, bin); + } else { + bin = Bin.asNull(mappingBinName); } + aerospikeClient + .put(aerospikeParameters.getAerospikeMapping().getWritePolicy(), recordKey, bin); } }