2525import java .math .BigInteger ;
2626import java .text .NumberFormat ;
2727import java .time .Instant ;
28+ import java .util .ArrayList ;
29+ import java .util .List ;
2830import java .util .Locale ;
2931import java .util .Map ;
32+ import java .util .Set ;
33+ import java .util .TreeSet ;
3034import java .util .concurrent .TimeUnit ;
3135import javax .annotation .Nonnull ;
3236import javax .annotation .Nullable ;
@@ -530,7 +534,7 @@ public Point copy() {
530534 */
531535 @ Nonnull
532536 public String toLineProtocol () {
533- return toLineProtocol (null );
537+ return toLineProtocol (null , null , null );
534538 }
535539
536540 /**
@@ -541,11 +545,26 @@ public String toLineProtocol() {
541545 */
542546 @ Nonnull
543547 public String toLineProtocol (@ Nullable final WritePrecision precision ) {
548+ return toLineProtocol (precision , null , null );
549+ }
550+
551+ /**
552+ * Transform to Line Protocol.
553+ *
554+ * @param precision required precision
555+ * @param defaultTags default tags to include in point serialization
556+ * @param tagOrder preferred order of tags in point serialization
557+ * @return Line Protocol
558+ */
559+ @ Nonnull
560+ public String toLineProtocol (@ Nullable final WritePrecision precision ,
561+ @ Nullable final Map <String , String > defaultTags ,
562+ @ Nullable final List <String > tagOrder ) {
544563
545564 StringBuilder sb = new StringBuilder ();
546565
547566 escapeKey (sb , getMeasurement (), false );
548- appendTags (sb );
567+ appendTags (sb , defaultTags , tagOrder );
549568 boolean appendedFields = appendFields (sb );
550569 if (!appendedFields ) {
551570 return "" ;
@@ -564,24 +583,62 @@ private Point putField(@Nonnull final String field, @Nullable final Object value
564583 return this ;
565584 }
566585
567- private void appendTags (@ Nonnull final StringBuilder sb ) {
568-
569- for (String name : values .getTagNames ()) {
586+ private void appendTags (@ Nonnull final StringBuilder sb ,
587+ @ Nullable final Map <String , String > defaultTags ,
588+ @ Nullable final List <String > tagOrder ) {
589+ if ((defaultTags == null || defaultTags .isEmpty ()) && (tagOrder == null || tagOrder .isEmpty ())) {
590+ values .forEachTag ((name , value ) -> appendTag (sb , name , value ));
591+ sb .append (' ' );
592+ return ;
593+ }
570594
571- String value = values .getTag (name );
595+ Set <String > remaining = new TreeSet <>();
596+ values .forEachTagName (pointTag -> {
597+ if (!pointTag .isEmpty ()) {
598+ remaining .add (pointTag );
599+ }
600+ });
601+ if (defaultTags != null ) {
602+ for (String defaultTag : defaultTags .keySet ()) {
603+ if (defaultTag != null && !defaultTag .isEmpty ()) {
604+ remaining .add (defaultTag );
605+ }
606+ }
607+ }
572608
573- if (name .isEmpty () || value == null || value .isEmpty ()) {
574- continue ;
609+ List <String > orderedTagNames = new ArrayList <>();
610+ if (tagOrder != null && !tagOrder .isEmpty ()) {
611+ for (String preferredTag : tagOrder ) {
612+ if (preferredTag == null || preferredTag .isEmpty ()) {
613+ continue ;
614+ }
615+ if (remaining .remove (preferredTag )) {
616+ orderedTagNames .add (preferredTag );
617+ }
575618 }
619+ }
620+ orderedTagNames .addAll (remaining );
576621
577- sb .append (',' );
578- escapeKey (sb , name );
579- sb .append ('=' );
580- escapeKey (sb , value );
622+ for (String name : orderedTagNames ) {
623+ String value = values .getTag (name );
624+ if (defaultTags != null && defaultTags .containsKey (name )) {
625+ value = defaultTags .get (name );
626+ }
627+ appendTag (sb , name , value );
581628 }
582629 sb .append (' ' );
583630 }
584631
632+ private void appendTag (@ Nonnull final StringBuilder sb , @ Nullable final String name , @ Nullable final String value ) {
633+ if (name == null || name .isEmpty () || value == null || value .isEmpty ()) {
634+ return ;
635+ }
636+ sb .append (',' );
637+ escapeKey (sb , name );
638+ sb .append ('=' );
639+ escapeKey (sb , value );
640+ }
641+
585642 private boolean appendFields (@ Nonnull final StringBuilder sb ) {
586643
587644 boolean appended = false ;
0 commit comments