I failed thrice at sending this from the google forum.  That editor is beyond painful.

Using jOOQ 3.14, java 15 and Postgres (12)

Postgres overloads substring to work on bytea data, so against

    Column    | Type  | Collation | Nullable | Default
    --------------+-------+-----------+----------+---------
     id           | uuid  |           | not null |
     person_id    | uuid  |           | not null |
     markerset_id | uuid  |           | not null |
     calls        | bytea |           | not null |

I can

Using jOOQ 3.14, java 15 and Postgres (12)

Postgres overloads substring to work on bytea data, so against

    Column    | Type  | Collation | Nullable | Default
    --------------+-------+-----------+----------+---------
     id           | uuid  |           | not null |
     person_id    | uuid  |           | not null |
     markerset_id | uuid  |           | not null |
     calls        | bytea |           | not null |

I can

    select substring(calls,1, 10) from viv.genotype where calls is not null limit 3;
       substring
    ------------------------
     \x12111222212112121121
     \x22112211111122221111
     \x22112211111122221111
    (3 rows)
    *** NOTE: 20 characters

But my naive attempt in code

    Result<?> peddata = dsl
      .select(PEOPLE.NAME.as("peoplename"),
          ego.NAME,
              (coalesce(ma.NAME,"0")).as("maname"),
              (coalesce(pa.NAME, "0")).as("paname"),
          choose(ego.GENDER)
          .when("m", 1)
          .when("f", 2)
          .otherwise(0).as("regender"),
          substring(GENOTYPE.CALLS, startIndex, markerCount).as("gtdata"))
      .from(PEOPLE)
.join(PROBANDSET).on(PEOPLE.ID.equal(PROBANDSET.PEOPLE_ID))
.join(SEGMENT).on(PROBANDSET.ID.equal(SEGMENT.PROBANDSET_ID))
.join(PEOPLE_MEMBER).on(PEOPLE.ID.equal(PEOPLE_MEMBER.PEOPLE_ID))
      .join(ego).on(PEOPLE_MEMBER.PERSON_ID.equal(ego.ID))
.join(ascendTrim(PROBANDSET.PROBANDS)).on(ego.ID.equal(ASCEND_TRIM.ID))
      .leftJoin(pa).on(ego.PA.equal(pa.ID))
      .leftJoin(ma).on(ego.MA.equal(ma.ID))
.leftJoin(GENOTYPE).on(ego.ID.equal(GENOTYPE.PERSON_ID).and(GENOTYPE.MARKERSET_ID.equal(SEGMENT.MARKERSET_ID)))
      .where(SEGMENT.ID.equal(segmentId))
      .fetch();
generates a compilation error

    error: no suitable method found for substring(TableField<GenotypeRecord,byte[]>,int,int)
          substring(GENOTYPE.CALLS, startIndex, markerCount).as("gtdata"))
          ^
    method DSL.substring(Field<String>,Field<? extends Number>,Field<? extends Number>) is not applicable       (argument mismatch; TableField<GenotypeRecord,byte[]> cannot be converted to Field<String>)
    method DSL.substring(Field<String>,int,int) is not applicable
      (argument mismatch; TableField<GenotypeRecord,byte[]> cannot be converted to Field<String>)

I don't see any reference to this substring(bytea) in the docs. Short
of straight sql am I left with the jOOQ equivalent of

   *** NOTE: double the length of the requested string

    select substring(calls,1, 20) from viv.genotype where calls is not null limit 3;
       substring
    ------------------------
     \x12111222212112121121
     \x22112211111122221111
     \x22112211111122221111
    (3 rows)
    *** NOTE: 20 characters

But my naive attempt in code

    Result<?> peddata = dsl
      .select(PEOPLE.NAME.as("peoplename"),
          ego.NAME,
              (coalesce(ma.NAME,"0")).as("maname"),
              (coalesce(pa.NAME, "0")).as("paname"),
          choose(ego.GENDER)
          .when("m", 1)
          .when("f", 2)
          .otherwise(0).as("regender"),
          substring(GENOTYPE.CALLS, startIndex, markerCount).as("gtdata"))
      .from(PEOPLE)
.join(PROBANDSET).on(PEOPLE.ID.equal(PROBANDSET.PEOPLE_ID))
.join(SEGMENT).on(PROBANDSET.ID.equal(SEGMENT.PROBANDSET_ID))
.join(PEOPLE_MEMBER).on(PEOPLE.ID.equal(PEOPLE_MEMBER.PEOPLE_ID))
      .join(ego).on(PEOPLE_MEMBER.PERSON_ID.equal(ego.ID))
.join(ascendTrim(PROBANDSET.PROBANDS)).on(ego.ID.equal(ASCEND_TRIM.ID))
      .leftJoin(pa).on(ego.PA.equal(pa.ID))
      .leftJoin(ma).on(ego.MA.equal(ma.ID))
.leftJoin(GENOTYPE).on(ego.ID.equal(GENOTYPE.PERSON_ID).and(GENOTYPE.MARKERSET_ID.equal(SEGMENT.MARKERSET_ID)))
      .where(SEGMENT.ID.equal(segmentId))
      .fetch();
generates a compilation error

    error: no suitable method found for substring(TableField<GenotypeRecord,byte[]>,int,int)
          substring(GENOTYPE.CALLS, startIndex, markerCount).as("gtdata"))
          ^
    method DSL.substring(Field<String>,Field<? extends Number>,Field<? extends Number>) is not applicable       (argument mismatch; TableField<GenotypeRecord,byte[]> cannot be converted to Field<String>)
    method DSL.substring(Field<String>,int,int) is not applicable
      (argument mismatch; TableField<GenotypeRecord,byte[]> cannot be converted to Field<String>)

I don't see any reference to this substring(bytea) in the docs. Short
of straight sql am I left with the jOOQ equivalent of

   *** NOTE: double the length of the requested string
    select substring(calls::text,1, 20) from viv.genotype where calls is not null limit 3;
      substring
    ----------------------
     \x121112222121121211
     \x221122111111222211
     \x221122111111222211
    (3 rows)

--
You received this message because you are subscribed to the Google Groups "jOOQ User 
Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jooq-user/85f9d384-1d24-09e3-2226-c10ad3b2a140%40gmail.com.

Reply via email to