1 /***********************************************************************
2  * Copyright (c) 2013-2025 Commonwealth Computer Research, Inc.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Apache License, Version 2.0
5  * which accompanies this distribution and is available at
6  * http://www.opensource.org/licenses/apache2.0.php.
7  ***********************************************************************/
8 
9 package org.locationtech.geomesa.accumulo.data.writer
10 package tx
11 
12 import org.apache.accumulo.core.client.{ConditionalWriter, ConditionalWriterConfig, IsolatedScanner}
13 import org.apache.accumulo.core.conf.ClientProperty
14 import org.apache.accumulo.core.data.{Key, PartialKey}
15 import org.apache.hadoop.io.Text
16 import org.geotools.api.feature.simple.SimpleFeatureType
17 import org.locationtech.geomesa.accumulo.data.AccumuloDataStore
18 import org.locationtech.geomesa.accumulo.data.writer.tx.ConditionalWriteException.ConditionalWriteStatus
19 import org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.{AppendBuilder, DeleteBuilder, UpdateBuilder}
20 import org.locationtech.geomesa.index.api.IndexAdapter.BaseIndexWriter
21 import org.locationtech.geomesa.index.api.WritableFeature.FeatureWrapper
22 import org.locationtech.geomesa.index.api._
23 import org.locationtech.geomesa.utils.io.{CloseQuietly, WithClose}
24 
25 import java.util.concurrent.TimeUnit
26 import scala.collection.mutable.ArrayBuffer
27 
28 /**
29  * Accumulo atomic index writer implementation
30  *
31  * @param ds data store
32  * @param sft simple feature type
33  * @param indices indices to write to
34  * @param wrapper feature wrapper
35  * @param partition partition to write to (if partitioned schema)
36  */
37 class AccumuloAtomicIndexWriter(
38     ds: AccumuloDataStore,
39     sft: SimpleFeatureType,
40     indices: Seq[GeoMesaFeatureIndex[_, _]],
41     wrapper: FeatureWrapper[WritableFeature],
42     partition: Option[String]
43   ) extends BaseIndexWriter[WritableFeature](indices, wrapper) {
44 
45   import scala.collection.JavaConverters._
46 
47   // should always be writing to a single table here
48   private val tables = indices.map(_.getTableName(partition))
49 
50   private val writers: Array[ConditionalWriter] = {
51     val config = new ConditionalWriterConfig()
52     config.setAuthorizations(ds.auths)
53     val maxThreads = ClientProperty.BATCH_WRITER_THREADS_MAX.getInteger(ds.connector.properties())
54     if (maxThreads != null) {
55       config.setMaxWriteThreads(maxThreads)
56     }
57     val timeout = ClientProperty.BATCH_WRITER_TIMEOUT_MAX.getTimeInMillis(ds.connector.properties())
58     if (timeout != null) {
59       config.setTimeout(timeout, TimeUnit.MILLISECONDS)
60     }
61     tables.map(ds.connector.createConditionalWriter(_, config)).toArray
62   }
63 
64   private val colFamilyMappings = indices.map(ColumnFamilyMapper.apply).toArray
65   private val visCache = new VisibilityCache()
66 
67   override protected def append(feature: WritableFeature, values: Array[RowKeyValue[_]]): Unit =
68     mutate(feature.feature.getID, buildMutations(values, AppendBuilder.apply))
69 
70   override protected def delete(feature: WritableFeature, values: Array[RowKeyValue[_]]): Unit =
71     mutate(feature.feature.getID, buildMutations(values, DeleteBuilder.apply))
72 
73   override protected def update(
74       feature: WritableFeature,
75       values: Array[RowKeyValue[_]],
76       previous: WritableFeature,
77       previousValues: Array[RowKeyValue[_]]): Unit = {
78     val mutations = Array.ofDim[Seq[MutationBuilder]](values.length)
79     // note: these are temporary conditions - we update them below
80     val updates = buildMutations(values, AppendBuilder.apply)
81     val deletes = buildMutations(previousValues, DeleteBuilder.apply)
82     var i = 0
83     while (i < values.length) {
84       val dels = ArrayBuffer(deletes(i): _*)
85       val puts = updates(i).map { mutations =>
86         // find any previous values that will be updated
87         val d = dels.indexWhere(p => java.util.Arrays.equals(p.row, mutations.row))
88         if (d == -1) { mutations } else {
89           // note: side-effect
90           val toUpdate = dels.remove(d)
91           // any previous values that are overwritten are added as conditions on the put
92           // any previous values that aren't overwritten need to be deleted
93           val remaining = toUpdate.kvs.filterNot(kv => mutations.kvs.exists(_.equalKey(kv)))
94           if (remaining.nonEmpty) {
95             dels.append(toUpdate.copy(kvs = remaining))
96           }
97           UpdateBuilder(mutations.row, mutations.kvs, toUpdate.kvs)
98         }
99       }
100       // note: order here is important, we need puts to operate before deletes in order for conditions to succeed
101       mutations(i) = puts ++ dels
102       i += 1
103     }
104     mutate(feature.feature.getID, mutations)
105   }
106 
107   /**
108    * Apply the mutations
109    *
110    * @param id feature id
111    * @param mutations mutations to apply
112    */
113   @throws[ConditionalWriteException]
114   private def mutate(id: String, mutations: Array[Seq[MutationBuilder]]): Unit = {
115     val errors = ArrayBuffer.empty[ConditionalWriteStatus]
116     val successes = ArrayBuffer.empty[(Int, MutationBuilder)]
117     var i = 0
118     while (i < mutations.length) {
119       // note: mutations need to be applied in order so that conditions are correct
120       mutations(i).foreach { m =>
121         val status = writers(i).write(m.apply()).getStatus
122         if (status == ConditionalWriter.Status.ACCEPTED ||
123             (status == ConditionalWriter.Status.UNKNOWN && verifyWrite(tables(i), m))) {
124           successes += i -> m
125         } else {
126           errors += ConditionalWriteStatus(indices(i), m.name, status)
127         }
128       }
129       i += 1
130     }
131     if (errors.nonEmpty) {
132       // revert any writes we made
133       successes.foreach { case (i, m) =>
134         // note: if these are rejected, some other update has come through and we don't want to overwrite it
135         writers(i).write(m.invert())
136       }
137       throw ConditionalWriteException(id, errors.toSeq)
138     }
139   }
140 
141   /**
142    * Verify if a mutation was successfully applied or not
143    *
144    * @param table table being mutated
145    * @param mutation mutation being applied
146    * @return true if the current state of the table reflects the mutation's intended result
147    */
148   private def verifyWrite(table: String, mutation: MutationBuilder): Boolean = {
149     WithClose(new IsolatedScanner(ds.connector.createScanner(table, ds.auths))) { scanner =>
150       val key = new Key(mutation.row)
151       scanner.setRange(new org.apache.accumulo.core.data.Range(key, true, key.followingKey(PartialKey.ROW), false))
152       val found = scanner.iterator().asScala.toList
153       mutation.apply().getUpdates.asScala.forall { update =>
154         if (update.isDeleted) {
155           found.forall { entry =>
156             !compare(entry.getKey.getColumnFamily, update.getColumnFamily) ||
157                 !compare(entry.getKey.getColumnQualifier, update.getColumnQualifier) ||
158                 !compare(entry.getKey.getColumnVisibility, update.getColumnVisibility) ||
159                 entry.getKey.isDeleted
160           }
161         } else {
162           found.exists { entry =>
163             compare(entry.getKey.getColumnFamily, update.getColumnFamily) &&
164                 compare(entry.getKey.getColumnQualifier, update.getColumnQualifier) &&
165                 compare(entry.getKey.getColumnVisibility, update.getColumnVisibility) &&
166                 entry.getValue.compareTo(update.getValue) == 0
167           }
168         }
169       }
170     }
171   }
172 
173   private def buildMutations[T <: MutationBuilder](
174       values: Array[RowKeyValue[_]],
175       builderFactory: (Array[Byte], Seq[MutationValue]) => T): Array[Seq[T]] = {
176     val mutations = Array.ofDim[Seq[T]](values.length)
177     var i = 0
178     while (i < values.length) {
179       mutations(i) = values(i) match {
180         case kv: SingleRowKeyValue[_] =>
181           val values = kv.values.map { v =>
182             MutationValue(colFamilyMappings(i)(v.cf), v.cq, visCache(v.vis), v.value)
183           }
184           Seq(builderFactory(kv.row, values))
185 
186         case mkv: MultiRowKeyValue[_] =>
187           mkv.rows.map { row =>
188             val values = mkv.values.map { v =>
189               MutationValue(colFamilyMappings(i)(v.cf), v.cq, visCache(v.vis), v.value)
190             }
191             builderFactory(row, values)
192           }
193       }
194       i += 1
195     }
196     mutations
197   }
198 
199   private def compare(text: Text, bytes: Array[Byte]): Boolean = text.compareTo(bytes, 0, bytes.length) == 0
200 
201   override def flush(): Unit = {} // there is no batching here, every single write gets flushed
202 
203   override def close(): Unit = CloseQuietly(writers).foreach(e => throw e)
204 }
Line Stmt Id Pos Tree Symbol Tests Code
48 2727 2130 - 2139 Select org.locationtech.geomesa.accumulo.data.writer.tx.AccumuloAtomicIndexWriter.partition AccumuloAtomicIndexWriter.this.partition
48 2728 2115 - 2140 Apply org.locationtech.geomesa.index.api.GeoMesaFeatureIndex.getTableName x$1.getTableName(AccumuloAtomicIndexWriter.this.partition)
48 2729 2114 - 2114 TypeApply scala.collection.Seq.canBuildFrom collection.this.Seq.canBuildFrom[String]
48 2730 2103 - 2141 ApplyToImplicitArgs scala.collection.TraversableLike.map AccumuloAtomicIndexWriter.this.indices.map[String, Seq[String]](((x$1: org.locationtech.geomesa.index.api.GeoMesaFeatureIndex[_, _]) => x$1.getTableName(AccumuloAtomicIndexWriter.this.partition)))(collection.this.Seq.canBuildFrom[String])
51 2731 2212 - 2241 Apply org.apache.accumulo.core.client.ConditionalWriterConfig.<init> new org.apache.accumulo.core.client.ConditionalWriterConfig()
52 2732 2271 - 2279 Select org.locationtech.geomesa.accumulo.data.AccumuloDataStore.auths AccumuloAtomicIndexWriter.this.ds.auths
52 2733 2246 - 2280 Apply org.apache.accumulo.core.client.ConditionalWriterConfig.setAuthorizations config.setAuthorizations(AccumuloAtomicIndexWriter.this.ds.auths)
53 2734 2302 - 2341 Literal <nosymbol> BATCH_WRITER_THREADS_MAX
53 2735 2353 - 2378 Apply org.apache.accumulo.core.client.AccumuloClient.properties AccumuloAtomicIndexWriter.this.ds.connector.properties()
53 2736 2302 - 2379 Apply org.apache.accumulo.core.conf.ClientProperty.getInteger BATCH_WRITER_THREADS_MAX.getInteger(AccumuloAtomicIndexWriter.this.ds.connector.properties())
54 2737 2388 - 2406 Apply java.lang.Object.!= maxThreads.!=(null)
54 2741 2384 - 2384 Literal <nosymbol> ()
54 2742 2384 - 2384 Block <nosymbol> ()
55 2738 2442 - 2452 ApplyImplicitView scala.Predef.Integer2int scala.Predef.Integer2int(maxThreads)
55 2739 2416 - 2453 Apply org.apache.accumulo.core.client.ConditionalWriterConfig.setMaxWriteThreads config.setMaxWriteThreads(scala.Predef.Integer2int(maxThreads))
55 2740 2416 - 2453 Block org.apache.accumulo.core.client.ConditionalWriterConfig.setMaxWriteThreads config.setMaxWriteThreads(scala.Predef.Integer2int(maxThreads))
57 2743 2478 - 2517 Literal <nosymbol> BATCH_WRITER_TIMEOUT_MAX
57 2744 2534 - 2559 Apply org.apache.accumulo.core.client.AccumuloClient.properties AccumuloAtomicIndexWriter.this.ds.connector.properties()
57 2745 2478 - 2560 Apply org.apache.accumulo.core.conf.ClientProperty.getTimeInMillis BATCH_WRITER_TIMEOUT_MAX.getTimeInMillis(AccumuloAtomicIndexWriter.this.ds.connector.properties())
58 2746 2569 - 2584 Apply java.lang.Object.!= timeout.!=(null)
58 2751 2565 - 2565 Literal <nosymbol> ()
58 2752 2565 - 2565 Block <nosymbol> ()
59 2747 2612 - 2619 ApplyImplicitView scala.Predef.Long2long scala.Predef.Long2long(timeout)
59 2748 2621 - 2642 Literal <nosymbol> MILLISECONDS
59 2749 2594 - 2643 Apply org.apache.accumulo.core.client.ConditionalWriterConfig.setTimeout config.setTimeout(scala.Predef.Long2long(timeout), MILLISECONDS)
59 2750 2594 - 2643 Block org.apache.accumulo.core.client.ConditionalWriterConfig.setTimeout config.setTimeout(scala.Predef.Long2long(timeout), MILLISECONDS)
61 2753 2665 - 2712 Apply org.apache.accumulo.core.client.AccumuloClient.createConditionalWriter AccumuloAtomicIndexWriter.this.ds.connector.createConditionalWriter(x$2, config)
61 2754 2664 - 2664 TypeApply scala.collection.Seq.canBuildFrom collection.this.Seq.canBuildFrom[org.apache.accumulo.core.client.ConditionalWriter]
61 2755 2654 - 2721 ApplyToImplicitArgs scala.collection.TraversableOnce.toArray AccumuloAtomicIndexWriter.this.tables.map[org.apache.accumulo.core.client.ConditionalWriter, Seq[org.apache.accumulo.core.client.ConditionalWriter]](((x$2: String) => AccumuloAtomicIndexWriter.this.ds.connector.createConditionalWriter(x$2, config)))(collection.this.Seq.canBuildFrom[org.apache.accumulo.core.client.ConditionalWriter]).toArray[org.apache.accumulo.core.client.ConditionalWriter]((ClassTag.apply[org.apache.accumulo.core.client.ConditionalWriter](classOf[org.apache.accumulo.core.client.ConditionalWriter]): scala.reflect.ClassTag[org.apache.accumulo.core.client.ConditionalWriter]))
64 2756 2773 - 2797 Apply org.locationtech.geomesa.accumulo.data.writer.ColumnFamilyMapper.apply ColumnFamilyMapper.apply(index)
64 2757 2772 - 2772 TypeApply scala.collection.Seq.canBuildFrom collection.this.Seq.canBuildFrom[org.locationtech.geomesa.accumulo.data.writer.ColumnFamilyMapper]
64 2758 2761 - 2806 ApplyToImplicitArgs scala.collection.TraversableOnce.toArray AccumuloAtomicIndexWriter.this.indices.map[org.locationtech.geomesa.accumulo.data.writer.ColumnFamilyMapper, Seq[org.locationtech.geomesa.accumulo.data.writer.ColumnFamilyMapper]]({ ((index: org.locationtech.geomesa.index.api.GeoMesaFeatureIndex[_, _]) => ColumnFamilyMapper.apply(index)) })(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.accumulo.data.writer.ColumnFamilyMapper]).toArray[org.locationtech.geomesa.accumulo.data.writer.ColumnFamilyMapper]((ClassTag.apply[org.locationtech.geomesa.accumulo.data.writer.ColumnFamilyMapper](classOf[org.locationtech.geomesa.accumulo.data.writer.ColumnFamilyMapper]): scala.reflect.ClassTag[org.locationtech.geomesa.accumulo.data.writer.ColumnFamilyMapper]))
65 2759 2832 - 2853 Apply org.locationtech.geomesa.accumulo.data.writer.VisibilityCache.<init> new writer.this.`package`.VisibilityCache()
68 2760 2963 - 2984 Apply org.geotools.api.feature.simple.SimpleFeature.getID feature.feature.getID()
68 2761 3009 - 3028 Apply org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.AppendBuilder.apply org.locationtech.geomesa.accumulo.data.writer.tx.`package`.MutationBuilder.AppendBuilder.apply(row, kvs)
68 2762 2986 - 3029 Apply org.locationtech.geomesa.accumulo.data.writer.tx.AccumuloAtomicIndexWriter.buildMutations AccumuloAtomicIndexWriter.this.buildMutations[org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder](values, { ((row: Array[Byte], kvs: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]) => org.locationtech.geomesa.accumulo.data.writer.tx.`package`.MutationBuilder.AppendBuilder.apply(row, kvs)) })
68 2763 2956 - 3030 Apply org.locationtech.geomesa.accumulo.data.writer.tx.AccumuloAtomicIndexWriter.mutate AccumuloAtomicIndexWriter.this.mutate(feature.feature.getID(), AccumuloAtomicIndexWriter.this.buildMutations[org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder](values, { ((row: Array[Byte], kvs: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]) => org.locationtech.geomesa.accumulo.data.writer.tx.`package`.MutationBuilder.AppendBuilder.apply(row, kvs)) }))
71 2764 3140 - 3161 Apply org.geotools.api.feature.simple.SimpleFeature.getID feature.feature.getID()
71 2765 3186 - 3205 Apply org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.DeleteBuilder.apply org.locationtech.geomesa.accumulo.data.writer.tx.`package`.MutationBuilder.DeleteBuilder.apply(row, kvs)
71 2766 3163 - 3206 Apply org.locationtech.geomesa.accumulo.data.writer.tx.AccumuloAtomicIndexWriter.buildMutations AccumuloAtomicIndexWriter.this.buildMutations[org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder](values, { ((row: Array[Byte], kvs: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]) => org.locationtech.geomesa.accumulo.data.writer.tx.`package`.MutationBuilder.DeleteBuilder.apply(row, kvs)) })
71 2767 3133 - 3207 Apply org.locationtech.geomesa.accumulo.data.writer.tx.AccumuloAtomicIndexWriter.mutate AccumuloAtomicIndexWriter.this.mutate(feature.feature.getID(), AccumuloAtomicIndexWriter.this.buildMutations[org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder](values, { ((row: Array[Byte], kvs: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]) => org.locationtech.geomesa.accumulo.data.writer.tx.`package`.MutationBuilder.DeleteBuilder.apply(row, kvs)) }))
78 2768 3453 - 3466 Select scala.Array.length values.length
78 2769 3419 - 3467 ApplyToImplicitArgs scala.Array.ofDim scala.Array.ofDim[Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder]](values.length)((ClassTag.apply[Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder]](classOf[scala.collection.Seq]): scala.reflect.ClassTag[Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder]]))
80 2770 3576 - 3595 Apply org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.AppendBuilder.apply org.locationtech.geomesa.accumulo.data.writer.tx.`package`.MutationBuilder.AppendBuilder.apply(row, kvs)
80 2771 3553 - 3596 Apply org.locationtech.geomesa.accumulo.data.writer.tx.AccumuloAtomicIndexWriter.buildMutations AccumuloAtomicIndexWriter.this.buildMutations[org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.AppendBuilder](values, { ((row: Array[Byte], kvs: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]) => org.locationtech.geomesa.accumulo.data.writer.tx.`package`.MutationBuilder.AppendBuilder.apply(row, kvs)) })
81 2772 3646 - 3665 Apply org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.DeleteBuilder.apply org.locationtech.geomesa.accumulo.data.writer.tx.`package`.MutationBuilder.DeleteBuilder.apply(row, kvs)
81 2773 3615 - 3666 Apply org.locationtech.geomesa.accumulo.data.writer.tx.AccumuloAtomicIndexWriter.buildMutations AccumuloAtomicIndexWriter.this.buildMutations[org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.DeleteBuilder](previousValues, { ((row: Array[Byte], kvs: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]) => org.locationtech.geomesa.accumulo.data.writer.tx.`package`.MutationBuilder.DeleteBuilder.apply(row, kvs)) })
82 2774 3679 - 3680 Literal <nosymbol> 0
83 2775 3696 - 3709 Select scala.Array.length values.length
83 2776 3692 - 3709 Apply scala.Int.< i.<(values.length)
83 2806 3711 - 3711 Apply org.locationtech.geomesa.accumulo.data.writer.tx.AccumuloAtomicIndexWriter.while$1 while$1()
83 2807 3711 - 4673 Block <nosymbol> { { val dels: scala.collection.mutable.ArrayBuffer[org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.DeleteBuilder] = scala.collection.mutable.ArrayBuffer.apply[org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.DeleteBuilder]((deletes.apply(i): _*)); val puts: Seq[Product with Serializable with org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder] = updates.apply(i).map[Product with Serializable with org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder, Seq[Product with Serializable with org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder]](((mutations: org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.AppendBuilder) => { val d: Int = dels.indexWhere(((p: org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.DeleteBuilder) => java.util.Arrays.equals(p.row, mutations.row))); if (d.==(-1)) mutations else { val toUpdate: org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.DeleteBuilder = dels.remove(d); val remaining: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue] = toUpdate.kvs.filterNot(((kv: org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue) => mutations.kvs.exists(((x$3: org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue) => x$3.equalKey(kv))))); if (remaining.nonEmpty) dels.append({ <artifact> val x$1: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue] @scala.reflect.internal.annotations.uncheckedBounds = remaining; <artifact> val x$2: Array[Byte] @scala.reflect.internal.annotations.uncheckedBounds = toUpdate.copy$default$1; toUpdate.copy(x$2, x$1) }) else (); org.locationtech.geomesa.accumulo.data.writer.tx.`package`.MutationBuilder.UpdateBuilder.apply(mutations.row, mutations.kvs, toUpdate.kvs) } }))(collection.this.Seq.canBuildFrom[Product with Serializable with org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder]); mutations.update(i, puts.++[Product with Serializable with org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder, Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder]](dels)(collection.this.Seq.canBuildFrom[Product with Serializable with org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder])); i = i.+(1) }; while$1() }
83 2808 3685 - 3685 Literal <nosymbol> ()
83 2809 3685 - 3685 Block <nosymbol> ()
84 2777 3742 - 3752 Apply scala.Array.apply deletes.apply(i)
84 2778 3730 - 3757 Apply scala.collection.generic.GenericCompanion.apply scala.collection.mutable.ArrayBuffer.apply[org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.DeleteBuilder]((deletes.apply(i): _*))
85 2800 3790 - 3790 TypeApply scala.collection.Seq.canBuildFrom collection.this.Seq.canBuildFrom[Product with Serializable with org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder]
85 2801 3775 - 4506 ApplyToImplicitArgs scala.collection.TraversableLike.map updates.apply(i).map[Product with Serializable with org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder, Seq[Product with Serializable with org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder]](((mutations: org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.AppendBuilder) => { val d: Int = dels.indexWhere(((p: org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.DeleteBuilder) => java.util.Arrays.equals(p.row, mutations.row))); if (d.==(-1)) mutations else { val toUpdate: org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.DeleteBuilder = dels.remove(d); val remaining: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue] = toUpdate.kvs.filterNot(((kv: org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue) => mutations.kvs.exists(((x$3: org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue) => x$3.equalKey(kv))))); if (remaining.nonEmpty) dels.append({ <artifact> val x$1: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue] @scala.reflect.internal.annotations.uncheckedBounds = remaining; <artifact> val x$2: Array[Byte] @scala.reflect.internal.annotations.uncheckedBounds = toUpdate.copy$default$1; toUpdate.copy(x$2, x$1) }) else (); org.locationtech.geomesa.accumulo.data.writer.tx.`package`.MutationBuilder.UpdateBuilder.apply(mutations.row, mutations.kvs, toUpdate.kvs) } }))(collection.this.Seq.canBuildFrom[Product with Serializable with org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder])
87 2779 3923 - 3928 Select org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.DeleteBuilder.row p.row
87 2780 3930 - 3943 Select org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.AppendBuilder.row mutations.row
87 2781 3899 - 3944 Apply java.util.Arrays.equals java.util.Arrays.equals(p.row, mutations.row)
87 2782 3878 - 3945 Apply scala.collection.GenSeqLike.indexWhere dels.indexWhere(((p: org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.DeleteBuilder) => java.util.Arrays.equals(p.row, mutations.row)))
88 2783 3958 - 3965 Apply scala.Int.== d.==(-1)
88 2784 3969 - 3978 Ident org.locationtech.geomesa.accumulo.data.writer.tx.AccumuloAtomicIndexWriter.mutations mutations
88 2799 3986 - 4498 Block <nosymbol> { val toUpdate: org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.DeleteBuilder = dels.remove(d); val remaining: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue] = toUpdate.kvs.filterNot(((kv: org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue) => mutations.kvs.exists(((x$3: org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue) => x$3.equalKey(kv))))); if (remaining.nonEmpty) dels.append({ <artifact> val x$1: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue] @scala.reflect.internal.annotations.uncheckedBounds = remaining; <artifact> val x$2: Array[Byte] @scala.reflect.internal.annotations.uncheckedBounds = toUpdate.copy$default$1; toUpdate.copy(x$2, x$1) }) else (); org.locationtech.geomesa.accumulo.data.writer.tx.`package`.MutationBuilder.UpdateBuilder.apply(mutations.row, mutations.kvs, toUpdate.kvs) }
90 2785 4044 - 4058 Apply scala.collection.mutable.ArrayBuffer.remove dels.remove(d)
93 2786 4300 - 4314 Apply org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue.equalKey x$3.equalKey(kv)
93 2787 4279 - 4315 Apply scala.collection.IterableLike.exists mutations.kvs.exists(((x$3: org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue) => x$3.equalKey(kv)))
93 2788 4250 - 4316 Apply scala.collection.TraversableLike.filterNot toUpdate.kvs.filterNot(((kv: org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue) => mutations.kvs.exists(((x$3: org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue) => x$3.equalKey(kv)))))
94 2789 4331 - 4349 Select scala.collection.TraversableOnce.nonEmpty remaining.nonEmpty
94 2793 4327 - 4327 Literal <nosymbol> ()
94 2794 4327 - 4327 Block <nosymbol> ()
95 2790 4377 - 4407 Apply org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.DeleteBuilder.copy toUpdate.copy(x$2, x$1)
95 2791 4365 - 4408 Apply scala.collection.mutable.BufferLike.append dels.append({ <artifact> val x$1: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue] @scala.reflect.internal.annotations.uncheckedBounds = remaining; <artifact> val x$2: Array[Byte] @scala.reflect.internal.annotations.uncheckedBounds = toUpdate.copy$default$1; toUpdate.copy(x$2, x$1) })
95 2792 4365 - 4408 Block scala.collection.mutable.BufferLike.append dels.append({ <artifact> val x$1: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue] @scala.reflect.internal.annotations.uncheckedBounds = remaining; <artifact> val x$2: Array[Byte] @scala.reflect.internal.annotations.uncheckedBounds = toUpdate.copy$default$1; toUpdate.copy(x$2, x$1) })
97 2795 4445 - 4458 Select org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.AppendBuilder.row mutations.row
97 2796 4460 - 4473 Select org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.AppendBuilder.kvs mutations.kvs
97 2797 4475 - 4487 Select org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.DeleteBuilder.kvs toUpdate.kvs
97 2798 4431 - 4488 Apply org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.UpdateBuilder.apply org.locationtech.geomesa.accumulo.data.writer.tx.`package`.MutationBuilder.UpdateBuilder.apply(mutations.row, mutations.kvs, toUpdate.kvs)
101 2802 4647 - 4647 TypeApply scala.collection.Seq.canBuildFrom collection.this.Seq.canBuildFrom[Product with Serializable with org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder]
101 2803 4642 - 4654 ApplyToImplicitArgs scala.collection.TraversableLike.++ puts.++[Product with Serializable with org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder, Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder]](dels)(collection.this.Seq.canBuildFrom[Product with Serializable with org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder])
101 2804 4627 - 4654 Apply scala.Array.update mutations.update(i, puts.++[Product with Serializable with org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder, Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder]](dels)(collection.this.Seq.canBuildFrom[Product with Serializable with org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder]))
102 2805 4661 - 4667 Apply scala.Int.+ i.+(1)
104 2810 4685 - 4706 Apply org.geotools.api.feature.simple.SimpleFeature.getID feature.feature.getID()
104 2811 4678 - 4718 Apply org.locationtech.geomesa.accumulo.data.writer.tx.AccumuloAtomicIndexWriter.mutate AccumuloAtomicIndexWriter.this.mutate(feature.feature.getID(), mutations)
115 2812 4970 - 5011 TypeApply scala.collection.generic.GenericCompanion.empty scala.collection.mutable.ArrayBuffer.empty[org.locationtech.geomesa.accumulo.data.writer.tx.ConditionalWriteException.ConditionalWriteStatus]
116 2813 5032 - 5073 TypeApply scala.collection.generic.GenericCompanion.empty scala.collection.mutable.ArrayBuffer.empty[(Int, org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder)]
117 2814 5086 - 5087 Literal <nosymbol> 0
118 2815 5103 - 5119 Select scala.Array.length mutations.length
118 2816 5099 - 5119 Apply scala.Int.< i.<(mutations.length)
118 2834 5121 - 5121 Apply org.locationtech.geomesa.accumulo.data.writer.tx.AccumuloAtomicIndexWriter.while$2 while$2()
118 2835 5121 - 5602 Block <nosymbol> { { mutations.apply(i).foreach[scala.collection.mutable.ArrayBuffer[_ >: (Int, org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder) with org.locationtech.geomesa.accumulo.data.writer.tx.ConditionalWriteException.ConditionalWriteStatus <: Product with Serializable]](((m: org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder) => { val status: org.apache.accumulo.core.client.ConditionalWriter.Status = AccumuloAtomicIndexWriter.this.writers.apply(i).write(m.apply()).getStatus(); if (status.==(ACCEPTED).||(status.==(UNKNOWN).&&(AccumuloAtomicIndexWriter.this.verifyWrite(AccumuloAtomicIndexWriter.this.tables.apply(i), m)))) successes.+=(scala.Predef.ArrowAssoc[Int](i).->[org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder](m)) else errors.+=(org.locationtech.geomesa.accumulo.data.writer.tx.ConditionalWriteException.ConditionalWriteStatus.apply(AccumuloAtomicIndexWriter.this.indices.apply(i), m.name, status)) })); i = i.+(1) }; while$2() }
118 2836 5092 - 5092 Literal <nosymbol> ()
118 2837 5092 - 5092 Block <nosymbol> ()
120 2832 5213 - 5583 Apply scala.collection.IterableLike.foreach mutations.apply(i).foreach[scala.collection.mutable.ArrayBuffer[_ >: (Int, org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder) with org.locationtech.geomesa.accumulo.data.writer.tx.ConditionalWriteException.ConditionalWriteStatus <: Product with Serializable]](((m: org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder) => { val status: org.apache.accumulo.core.client.ConditionalWriter.Status = AccumuloAtomicIndexWriter.this.writers.apply(i).write(m.apply()).getStatus(); if (status.==(ACCEPTED).||(status.==(UNKNOWN).&&(AccumuloAtomicIndexWriter.this.verifyWrite(AccumuloAtomicIndexWriter.this.tables.apply(i), m)))) successes.+=(scala.Predef.ArrowAssoc[Int](i).->[org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder](m)) else errors.+=(org.locationtech.geomesa.accumulo.data.writer.tx.ConditionalWriteException.ConditionalWriteStatus.apply(AccumuloAtomicIndexWriter.this.indices.apply(i), m.name, status)) }))
121 2817 5262 - 5299 Apply org.apache.accumulo.core.client.ConditionalWriter.Result.getStatus AccumuloAtomicIndexWriter.this.writers.apply(i).write(m.apply()).getStatus()
122 2818 5322 - 5355 Literal <nosymbol> ACCEPTED
122 2823 5312 - 5444 Apply scala.Boolean.|| status.==(ACCEPTED).||(status.==(UNKNOWN).&&(AccumuloAtomicIndexWriter.this.verifyWrite(AccumuloAtomicIndexWriter.this.tables.apply(i), m)))
123 2819 5382 - 5414 Literal <nosymbol> UNKNOWN
123 2820 5430 - 5439 Apply scala.collection.SeqLike.apply AccumuloAtomicIndexWriter.this.tables.apply(i)
123 2821 5418 - 5443 Apply org.locationtech.geomesa.accumulo.data.writer.tx.AccumuloAtomicIndexWriter.verifyWrite AccumuloAtomicIndexWriter.this.verifyWrite(AccumuloAtomicIndexWriter.this.tables.apply(i), m)
123 2822 5372 - 5443 Apply scala.Boolean.&& status.==(UNKNOWN).&&(AccumuloAtomicIndexWriter.this.verifyWrite(AccumuloAtomicIndexWriter.this.tables.apply(i), m))
124 2824 5471 - 5477 Apply scala.Predef.ArrowAssoc.-> scala.Predef.ArrowAssoc[Int](i).->[org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder](m)
124 2825 5458 - 5477 Apply scala.collection.mutable.ArrayBuffer.+= successes.+=(scala.Predef.ArrowAssoc[Int](i).->[org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder](m))
124 2826 5458 - 5477 Block scala.collection.mutable.ArrayBuffer.+= successes.+=(scala.Predef.ArrowAssoc[Int](i).->[org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder](m))
126 2827 5538 - 5548 Apply scala.collection.SeqLike.apply AccumuloAtomicIndexWriter.this.indices.apply(i)
126 2828 5550 - 5556 Select org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.name m.name
126 2829 5515 - 5565 Apply org.locationtech.geomesa.accumulo.data.writer.tx.ConditionalWriteException.ConditionalWriteStatus.apply org.locationtech.geomesa.accumulo.data.writer.tx.ConditionalWriteException.ConditionalWriteStatus.apply(AccumuloAtomicIndexWriter.this.indices.apply(i), m.name, status)
126 2830 5505 - 5565 Apply scala.collection.mutable.ArrayBuffer.+= errors.+=(org.locationtech.geomesa.accumulo.data.writer.tx.ConditionalWriteException.ConditionalWriteStatus.apply(AccumuloAtomicIndexWriter.this.indices.apply(i), m.name, status))
126 2831 5505 - 5565 Block scala.collection.mutable.ArrayBuffer.+= errors.+=(org.locationtech.geomesa.accumulo.data.writer.tx.ConditionalWriteException.ConditionalWriteStatus.apply(AccumuloAtomicIndexWriter.this.indices.apply(i), m.name, status))
129 2833 5590 - 5596 Apply scala.Int.+ i.+(1)
131 2838 5611 - 5626 Select scala.collection.TraversableOnce.nonEmpty errors.nonEmpty
131 2844 5628 - 5921 Block <nosymbol> { successes.foreach[org.apache.accumulo.core.client.ConditionalWriter.Result](((x0$1: (Int, org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder)) => x0$1 match { case (_1: Int, _2: org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder)(Int, org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder)((i @ _), (m @ _)) => AccumuloAtomicIndexWriter.this.writers.apply(i).write(m.invert()) })); throw ConditionalWriteException.apply(id, errors.toSeq) }
131 2845 5607 - 5607 Literal <nosymbol> ()
131 2846 5607 - 5607 Block <nosymbol> ()
133 2842 5671 - 5859 Apply scala.collection.mutable.ResizableArray.foreach successes.foreach[org.apache.accumulo.core.client.ConditionalWriter.Result](((x0$1: (Int, org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder)) => x0$1 match { case (_1: Int, _2: org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder)(Int, org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder)((i @ _), (m @ _)) => AccumuloAtomicIndexWriter.this.writers.apply(i).write(m.invert()) }))
135 2839 5840 - 5850 Apply org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.invert m.invert()
135 2840 5823 - 5851 Apply org.apache.accumulo.core.client.ConditionalWriter.write AccumuloAtomicIndexWriter.this.writers.apply(i).write(m.invert())
135 2841 5823 - 5851 Block org.apache.accumulo.core.client.ConditionalWriter.write AccumuloAtomicIndexWriter.this.writers.apply(i).write(m.invert())
137 2843 5866 - 5915 Throw <nosymbol> throw ConditionalWriteException.apply(id, errors.toSeq)
149 2847 6325 - 6333 Select org.locationtech.geomesa.accumulo.data.AccumuloDataStore.auths AccumuloAtomicIndexWriter.this.ds.auths
149 2848 6291 - 6334 Apply org.apache.accumulo.core.client.AccumuloClient.createScanner AccumuloAtomicIndexWriter.this.ds.connector.createScanner(table, AccumuloAtomicIndexWriter.this.ds.auths)
149 2849 6271 - 6335 Apply org.apache.accumulo.core.client.IsolatedScanner.<init> new org.apache.accumulo.core.client.IsolatedScanner(AccumuloAtomicIndexWriter.this.ds.connector.createScanner(table, AccumuloAtomicIndexWriter.this.ds.auths))
149 2886 6337 - 6337 Select org.locationtech.geomesa.utils.io.IsCloseableImplicits.closeableIsCloseable io.this.IsCloseable.closeableIsCloseable
149 2887 6261 - 7392 ApplyToImplicitArgs org.locationtech.geomesa.utils.io.WithClose.apply org.locationtech.geomesa.utils.io.`package`.WithClose.apply[org.apache.accumulo.core.client.IsolatedScanner, Boolean](new org.apache.accumulo.core.client.IsolatedScanner(AccumuloAtomicIndexWriter.this.ds.connector.createScanner(table, AccumuloAtomicIndexWriter.this.ds.auths)))(((scanner: org.apache.accumulo.core.client.IsolatedScanner) => { val key: org.apache.accumulo.core.data.Key = new org.apache.accumulo.core.data.Key(mutation.row); scanner.setRange(new org.apache.accumulo.core.data.Range(key, true, key.followingKey(ROW), false)); val found: List[java.util.Map.Entry[org.apache.accumulo.core.data.Key,org.apache.accumulo.core.data.Value]] = scala.collection.JavaConverters.asScalaIteratorConverter[java.util.Map.Entry[org.apache.accumulo.core.data.Key,org.apache.accumulo.core.data.Value]](scanner.iterator()).asScala.toList; scala.collection.JavaConverters.asScalaBufferConverter[org.apache.accumulo.core.data.ColumnUpdate](mutation.apply().getUpdates()).asScala.forall(((update: org.apache.accumulo.core.data.ColumnUpdate) => if (update.isDeleted()) found.forall(((entry: java.util.Map.Entry[org.apache.accumulo.core.data.Key,org.apache.accumulo.core.data.Value]) => AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnFamily(), update.getColumnFamily()).unary_!.||(AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnQualifier(), update.getColumnQualifier()).unary_!).||(AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnVisibility(), update.getColumnVisibility()).unary_!).||(entry.getKey().isDeleted()))) else found.exists(((entry: java.util.Map.Entry[org.apache.accumulo.core.data.Key,org.apache.accumulo.core.data.Value]) => AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnFamily(), update.getColumnFamily()).&&(AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnQualifier(), update.getColumnQualifier())).&&(AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnVisibility(), update.getColumnVisibility())).&&(entry.getValue().compareTo(update.getValue()).==(0)))))) }))(io.this.IsCloseable.closeableIsCloseable)
150 2850 6374 - 6386 Select org.locationtech.geomesa.accumulo.data.writer.tx.MutationBuilder.row mutation.row
150 2851 6366 - 6387 Apply org.apache.accumulo.core.data.Key.<init> new org.apache.accumulo.core.data.Key(mutation.row)
151 2852 6456 - 6460 Literal <nosymbol> true
151 2853 6462 - 6494 Apply org.apache.accumulo.core.data.Key.followingKey key.followingKey(ROW)
151 2854 6496 - 6501 Literal <nosymbol> false
151 2855 6411 - 6502 Apply org.apache.accumulo.core.data.Range.<init> new org.apache.accumulo.core.data.Range(key, true, key.followingKey(ROW), false)
151 2856 6394 - 6503 Apply org.apache.accumulo.core.client.IsolatedScanner.setRange scanner.setRange(new org.apache.accumulo.core.data.Range(key, true, key.followingKey(ROW), false))
152 2857 6522 - 6540 Apply org.apache.accumulo.core.client.IsolatedScanner.iterator scanner.iterator()
152 2858 6522 - 6555 Select scala.collection.TraversableOnce.toList scala.collection.JavaConverters.asScalaIteratorConverter[java.util.Map.Entry[org.apache.accumulo.core.data.Key,org.apache.accumulo.core.data.Value]](scanner.iterator()).asScala.toList
153 2859 6562 - 6589 Apply org.apache.accumulo.core.data.Mutation.getUpdates mutation.apply().getUpdates()
153 2885 6562 - 7386 Apply scala.collection.IterableLike.forall scala.collection.JavaConverters.asScalaBufferConverter[org.apache.accumulo.core.data.ColumnUpdate](mutation.apply().getUpdates()).asScala.forall(((update: org.apache.accumulo.core.data.ColumnUpdate) => if (update.isDeleted()) found.forall(((entry: java.util.Map.Entry[org.apache.accumulo.core.data.Key,org.apache.accumulo.core.data.Value]) => AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnFamily(), update.getColumnFamily()).unary_!.||(AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnQualifier(), update.getColumnQualifier()).unary_!).||(AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnVisibility(), update.getColumnVisibility()).unary_!).||(entry.getKey().isDeleted()))) else found.exists(((entry: java.util.Map.Entry[org.apache.accumulo.core.data.Key,org.apache.accumulo.core.data.Value]) => AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnFamily(), update.getColumnFamily()).&&(AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnQualifier(), update.getColumnQualifier())).&&(AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnVisibility(), update.getColumnVisibility())).&&(entry.getValue().compareTo(update.getValue()).==(0))))))
154 2860 6629 - 6645 Apply org.apache.accumulo.core.data.ColumnUpdate.isDeleted update.isDeleted()
155 2871 6659 - 6989 Apply scala.collection.LinearSeqOptimized.forall found.forall(((entry: java.util.Map.Entry[org.apache.accumulo.core.data.Key,org.apache.accumulo.core.data.Value]) => AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnFamily(), update.getColumnFamily()).unary_!.||(AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnQualifier(), update.getColumnQualifier()).unary_!).||(AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnVisibility(), update.getColumnVisibility()).unary_!).||(entry.getKey().isDeleted())))
155 2872 6659 - 6989 Block scala.collection.LinearSeqOptimized.forall found.forall(((entry: java.util.Map.Entry[org.apache.accumulo.core.data.Key,org.apache.accumulo.core.data.Value]) => AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnFamily(), update.getColumnFamily()).unary_!.||(AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnQualifier(), update.getColumnQualifier()).unary_!).||(AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnVisibility(), update.getColumnVisibility()).unary_!).||(entry.getKey().isDeleted())))
156 2861 6704 - 6732 Apply org.apache.accumulo.core.data.Key.getColumnFamily entry.getKey().getColumnFamily()
156 2862 6734 - 6756 Apply org.apache.accumulo.core.data.ColumnUpdate.getColumnFamily update.getColumnFamily()
157 2863 6786 - 6817 Apply org.apache.accumulo.core.data.Key.getColumnQualifier entry.getKey().getColumnQualifier()
157 2864 6819 - 6844 Apply org.apache.accumulo.core.data.ColumnUpdate.getColumnQualifier update.getColumnQualifier()
157 2865 6777 - 6845 Select scala.Boolean.unary_! AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnQualifier(), update.getColumnQualifier()).unary_!
158 2866 6874 - 6906 Apply org.apache.accumulo.core.data.Key.getColumnVisibility entry.getKey().getColumnVisibility()
158 2867 6908 - 6934 Apply org.apache.accumulo.core.data.ColumnUpdate.getColumnVisibility update.getColumnVisibility()
158 2868 6865 - 6935 Select scala.Boolean.unary_! AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnVisibility(), update.getColumnVisibility()).unary_!
158 2870 6695 - 6977 Apply scala.Boolean.|| AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnFamily(), update.getColumnFamily()).unary_!.||(AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnQualifier(), update.getColumnQualifier()).unary_!).||(AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnVisibility(), update.getColumnVisibility()).unary_!).||(entry.getKey().isDeleted())
159 2869 6955 - 6977 Apply org.apache.accumulo.core.data.Key.isDeleted entry.getKey().isDeleted()
162 2883 7017 - 7368 Apply scala.collection.LinearSeqOptimized.exists found.exists(((entry: java.util.Map.Entry[org.apache.accumulo.core.data.Key,org.apache.accumulo.core.data.Value]) => AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnFamily(), update.getColumnFamily()).&&(AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnQualifier(), update.getColumnQualifier())).&&(AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnVisibility(), update.getColumnVisibility())).&&(entry.getValue().compareTo(update.getValue()).==(0))))
162 2884 7017 - 7368 Block scala.collection.LinearSeqOptimized.exists found.exists(((entry: java.util.Map.Entry[org.apache.accumulo.core.data.Key,org.apache.accumulo.core.data.Value]) => AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnFamily(), update.getColumnFamily()).&&(AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnQualifier(), update.getColumnQualifier())).&&(AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnVisibility(), update.getColumnVisibility())).&&(entry.getValue().compareTo(update.getValue()).==(0))))
163 2873 7061 - 7089 Apply org.apache.accumulo.core.data.Key.getColumnFamily entry.getKey().getColumnFamily()
163 2874 7091 - 7113 Apply org.apache.accumulo.core.data.ColumnUpdate.getColumnFamily update.getColumnFamily()
164 2875 7142 - 7173 Apply org.apache.accumulo.core.data.Key.getColumnQualifier entry.getKey().getColumnQualifier()
164 2876 7175 - 7200 Apply org.apache.accumulo.core.data.ColumnUpdate.getColumnQualifier update.getColumnQualifier()
164 2877 7134 - 7201 Apply org.locationtech.geomesa.accumulo.data.writer.tx.AccumuloAtomicIndexWriter.compare AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnQualifier(), update.getColumnQualifier())
165 2878 7229 - 7261 Apply org.apache.accumulo.core.data.Key.getColumnVisibility entry.getKey().getColumnVisibility()
165 2879 7263 - 7289 Apply org.apache.accumulo.core.data.ColumnUpdate.getColumnVisibility update.getColumnVisibility()
165 2880 7221 - 7290 Apply org.locationtech.geomesa.accumulo.data.writer.tx.AccumuloAtomicIndexWriter.compare AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnVisibility(), update.getColumnVisibility())
165 2882 7053 - 7356 Apply scala.Boolean.&& AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnFamily(), update.getColumnFamily()).&&(AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnQualifier(), update.getColumnQualifier())).&&(AccumuloAtomicIndexWriter.this.compare(entry.getKey().getColumnVisibility(), update.getColumnVisibility())).&&(entry.getValue().compareTo(update.getValue()).==(0))
166 2881 7310 - 7356 Apply scala.Int.== entry.getValue().compareTo(update.getValue()).==(0)
176 2888 7608 - 7621 Select scala.Array.length values.length
176 2889 7588 - 7622 ApplyToImplicitArgs scala.Array.ofDim scala.Array.ofDim[Seq[T]](values.length)((ClassTag.apply[Seq[T]](classOf[scala.collection.Seq]): scala.reflect.ClassTag[Seq[T]]))
177 2890 7635 - 7636 Literal <nosymbol> 0
178 2891 7652 - 7665 Select scala.Array.length values.length
178 2892 7648 - 7665 Apply scala.Int.< i.<(values.length)
178 2920 7667 - 7667 Apply org.locationtech.geomesa.accumulo.data.writer.tx.AccumuloAtomicIndexWriter.while$3 while$3()
178 2921 7667 - 8238 Block <nosymbol> { { mutations.update(i, values.apply(i) match { case (kv @ (_: org.locationtech.geomesa.index.api.SingleRowKeyValue[_])) => { val values: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue] = kv.values.map[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue, Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]](((v: org.locationtech.geomesa.index.api.KeyValue) => tx.this.`package`.MutationValue.apply(AccumuloAtomicIndexWriter.this.colFamilyMappings.apply(i).apply(v.cf), v.cq, AccumuloAtomicIndexWriter.this.visCache.apply(v.vis), v.value)))(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]); scala.collection.Seq.apply[T](builderFactory.apply(kv.row, values)) } case (mkv @ (_: org.locationtech.geomesa.index.api.MultiRowKeyValue[_])) => mkv.rows.map[T, Seq[T]](((row: Array[Byte]) => { val values: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue] = mkv.values.map[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue, Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]](((v: org.locationtech.geomesa.index.api.KeyValue) => tx.this.`package`.MutationValue.apply(AccumuloAtomicIndexWriter.this.colFamilyMappings.apply(i).apply(v.cf), v.cq, AccumuloAtomicIndexWriter.this.visCache.apply(v.vis), v.value)))(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]); builderFactory.apply(row, values) }))(collection.this.Seq.canBuildFrom[T]) }); i = i.+(1) }; while$3() }
178 2922 7641 - 7641 Literal <nosymbol> ()
178 2923 7641 - 7641 Block <nosymbol> ()
179 2893 7690 - 7699 Apply scala.Array.apply values.apply(i)
179 2918 7675 - 8219 Apply scala.Array.update mutations.update(i, values.apply(i) match { case (kv @ (_: org.locationtech.geomesa.index.api.SingleRowKeyValue[_])) => { val values: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue] = kv.values.map[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue, Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]](((v: org.locationtech.geomesa.index.api.KeyValue) => tx.this.`package`.MutationValue.apply(AccumuloAtomicIndexWriter.this.colFamilyMappings.apply(i).apply(v.cf), v.cq, AccumuloAtomicIndexWriter.this.visCache.apply(v.vis), v.value)))(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]); scala.collection.Seq.apply[T](builderFactory.apply(kv.row, values)) } case (mkv @ (_: org.locationtech.geomesa.index.api.MultiRowKeyValue[_])) => mkv.rows.map[T, Seq[T]](((row: Array[Byte]) => { val values: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue] = mkv.values.map[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue, Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]](((v: org.locationtech.geomesa.index.api.KeyValue) => tx.this.`package`.MutationValue.apply(AccumuloAtomicIndexWriter.this.colFamilyMappings.apply(i).apply(v.cf), v.cq, AccumuloAtomicIndexWriter.this.visCache.apply(v.vis), v.value)))(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]); builderFactory.apply(row, values) }))(collection.this.Seq.canBuildFrom[T]) })
180 2905 7746 - 7936 Block <nosymbol> { val values: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue] = kv.values.map[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue, Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]](((v: org.locationtech.geomesa.index.api.KeyValue) => tx.this.`package`.MutationValue.apply(AccumuloAtomicIndexWriter.this.colFamilyMappings.apply(i).apply(v.cf), v.cq, AccumuloAtomicIndexWriter.this.visCache.apply(v.vis), v.value)))(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]); scala.collection.Seq.apply[T](builderFactory.apply(kv.row, values)) }
181 2900 7786 - 7786 TypeApply scala.collection.Seq.canBuildFrom collection.this.Seq.canBuildFrom[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]
181 2901 7772 - 7890 ApplyToImplicitArgs scala.collection.TraversableLike.map kv.values.map[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue, Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]](((v: org.locationtech.geomesa.index.api.KeyValue) => tx.this.`package`.MutationValue.apply(AccumuloAtomicIndexWriter.this.colFamilyMappings.apply(i).apply(v.cf), v.cq, AccumuloAtomicIndexWriter.this.visCache.apply(v.vis), v.value)))(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue])
182 2894 7840 - 7844 Select org.locationtech.geomesa.index.api.KeyValue.cf v.cf
182 2895 7819 - 7845 Apply scala.Function1.apply AccumuloAtomicIndexWriter.this.colFamilyMappings.apply(i).apply(v.cf)
182 2896 7847 - 7851 Select org.locationtech.geomesa.index.api.KeyValue.cq v.cq
182 2897 7862 - 7867 Select org.locationtech.geomesa.index.api.KeyValue.vis v.vis
182 2898 7853 - 7868 Apply org.locationtech.geomesa.accumulo.data.writer.VisibilityCache.apply AccumuloAtomicIndexWriter.this.visCache.apply(v.vis)
182 2899 7805 - 7878 Apply org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue.apply tx.this.`package`.MutationValue.apply(AccumuloAtomicIndexWriter.this.colFamilyMappings.apply(i).apply(v.cf), v.cq, AccumuloAtomicIndexWriter.this.visCache.apply(v.vis), v.value)
184 2902 7920 - 7926 Select org.locationtech.geomesa.index.api.SingleRowKeyValue.row kv.row
184 2903 7905 - 7935 Apply scala.Function2.apply builderFactory.apply(kv.row, values)
184 2904 7901 - 7936 Apply scala.collection.generic.GenericCompanion.apply scala.collection.Seq.apply[T](builderFactory.apply(kv.row, values))
187 2915 8002 - 8002 TypeApply scala.collection.Seq.canBuildFrom collection.this.Seq.canBuildFrom[T]
187 2916 7989 - 8211 ApplyToImplicitArgs scala.collection.TraversableLike.map mkv.rows.map[T, Seq[T]](((row: Array[Byte]) => { val values: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue] = mkv.values.map[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue, Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]](((v: org.locationtech.geomesa.index.api.KeyValue) => tx.this.`package`.MutationValue.apply(AccumuloAtomicIndexWriter.this.colFamilyMappings.apply(i).apply(v.cf), v.cq, AccumuloAtomicIndexWriter.this.visCache.apply(v.vis), v.value)))(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]); builderFactory.apply(row, values) }))(collection.this.Seq.canBuildFrom[T])
187 2917 7989 - 8211 Block scala.collection.TraversableLike.map mkv.rows.map[T, Seq[T]](((row: Array[Byte]) => { val values: Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue] = mkv.values.map[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue, Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]](((v: org.locationtech.geomesa.index.api.KeyValue) => tx.this.`package`.MutationValue.apply(AccumuloAtomicIndexWriter.this.colFamilyMappings.apply(i).apply(v.cf), v.cq, AccumuloAtomicIndexWriter.this.visCache.apply(v.vis), v.value)))(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]); builderFactory.apply(row, values) }))(collection.this.Seq.canBuildFrom[T])
188 2912 8051 - 8051 TypeApply scala.collection.Seq.canBuildFrom collection.this.Seq.canBuildFrom[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]
188 2913 8036 - 8159 ApplyToImplicitArgs scala.collection.TraversableLike.map mkv.values.map[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue, Seq[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue]](((v: org.locationtech.geomesa.index.api.KeyValue) => tx.this.`package`.MutationValue.apply(AccumuloAtomicIndexWriter.this.colFamilyMappings.apply(i).apply(v.cf), v.cq, AccumuloAtomicIndexWriter.this.visCache.apply(v.vis), v.value)))(collection.this.Seq.canBuildFrom[org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue])
189 2906 8107 - 8111 Select org.locationtech.geomesa.index.api.KeyValue.cf v.cf
189 2907 8086 - 8112 Apply scala.Function1.apply AccumuloAtomicIndexWriter.this.colFamilyMappings.apply(i).apply(v.cf)
189 2908 8114 - 8118 Select org.locationtech.geomesa.index.api.KeyValue.cq v.cq
189 2909 8129 - 8134 Select org.locationtech.geomesa.index.api.KeyValue.vis v.vis
189 2910 8120 - 8135 Apply org.locationtech.geomesa.accumulo.data.writer.VisibilityCache.apply AccumuloAtomicIndexWriter.this.visCache.apply(v.vis)
189 2911 8072 - 8145 Apply org.locationtech.geomesa.accumulo.data.writer.tx.MutationValue.apply tx.this.`package`.MutationValue.apply(AccumuloAtomicIndexWriter.this.colFamilyMappings.apply(i).apply(v.cf), v.cq, AccumuloAtomicIndexWriter.this.visCache.apply(v.vis), v.value)
191 2914 8172 - 8199 Apply scala.Function2.apply builderFactory.apply(row, values)
194 2919 8226 - 8232 Apply scala.Int.+ i.+(1)
199 2924 8323 - 8366 Apply scala.Int.== text.compareTo(bytes, 0, bytes.length).==(0)
201 2925 8399 - 8401 Literal <nosymbol> ()
203 2926 8509 - 8516 Select org.locationtech.geomesa.accumulo.data.writer.tx.AccumuloAtomicIndexWriter.writers AccumuloAtomicIndexWriter.this.writers
203 2927 8508 - 8508 Select org.locationtech.geomesa.utils.io.IsCloseableImplicits.arrayIsCloseable io.this.IsCloseable.arrayIsCloseable
203 2928 8531 - 8538 Throw <nosymbol> throw e
203 2929 8496 - 8539 Apply scala.Option.foreach org.locationtech.geomesa.utils.io.`package`.CloseQuietly.apply[Array[org.apache.accumulo.core.client.ConditionalWriter]](AccumuloAtomicIndexWriter.this.writers)(io.this.IsCloseable.arrayIsCloseable).foreach[Nothing](((e: Throwable) => throw e))